What the board will see every morning, and where each number comes from
Summary
The board asked for a single daily view of company performance. This catalog proposes six reports on one page. Each one answers a board-level question, uses data SAZ already captures, and is defined precisely enough to build and audit.
- Built for a morning check. It opens on the last closed business day, compared with the same day last week. One click switches it to month-to-date or quarter-to-date.
- Money first. Cash collected, agency revenue and recovery lead the page. Operational detail sits below them and only appears where it explains the money.
- Exceptions, not noise. The last section lists only the items that need a decision: SLA breaches, regulatory gaps and aged approvals.
- Safe to share. A new read-only
EXECUTIVErole sees aggregates only: no borrower data, and agents appear by code. Every view exports to PDF.
The interactive prototype shows the proposed layout. It runs on fictional sample data, so its numbers are illustrative only.
Catalog at a glance
Readiness: Available data exists today · Needs snapshot needs the nightly history table · Needs new data needs a new capture
| Report | Board question it answers | Refresh | Phase | Readiness |
|---|---|---|---|---|
| 1. Morning pulse | Did we collect what we planned yesterday and month to date, and what did it earn us? | Daily, 00:30 Cairo | MVP | Available Needs snapshot |
| 2. Collections & revenue | Are we on track for the month? Which clients, products and portfolios drive the result? | Daily | MVP | Available |
| 3. Client bank scorecard | How are we performing for each client bank, and which relationship is at risk? | Daily | MVP | Available Needs new data |
| 4. Portfolio health | How old and how large is the book we manage? Are cases moving through the funnel? | Daily | MVP + Phase 2 | Available Needs snapshot |
| 5. Workforce productivity | Is the workforce productive, and is any team over capacity? | Daily | MVP | Available |
| 6. Compliance & risk alerts | What needs a decision or creates regulatory or client risk today? | Daily (intraday in Phase 2) | MVP | Available |
- Filters: business day, period (Day / Month to date / Quarter to date), client bank, product, region. Every filter applies to the whole page, and the current view can be shared as a link.
- Comparison: Day is compared with the same weekday last week (Egyptian work week: Sun–Thu); Month to date with the same days last month; Quarter to date with the same days last quarter.
- Targets: the monthly plan comes from SAZ target amounts (
zone.target_amount,segmentation_bucket.target_amount). It is spread across days by working-day weight: Friday ≈ 0, Saturday ≈ half, salary days uplifted. - Status colours always come with an icon and a label: On track ≥ 100% of plan · Watch 90–99% · Behind < 90%. These thresholds are for the board to confirm.
1. Morning pulse
Six headline tiles
| KPI | Definition / formula | SAZ source | Readiness |
|---|---|---|---|
| Cash collected | Sum of borrower payments confirmed in the period, in EGP. Compared with the period plan. | commission.payment_amount by attributed_at (status ≠ REJECTED). Interim source until a payment ledger exists; collection_case.paid_amount only records settled cases. | Available |
| Agency revenue | Commission SAZ earns on collected cash. Net margin = revenue − agent share − field share. | commission.commission_total, agent_share, field_share | Available |
| Recovery rate | Cash collected ÷ (open debt at period start + debt placed during the period). The target is 4.0% a month, pro-rated to the period by plan weight. | Collected (above) ÷ Σ collection_case.debt_value for open statuses at the period start | Needs snapshot |
| Debt under management | Outstanding balance and count of open cases at the end of the business day. Open means not PAID_FULL, WRITTEN_OFF or ARCHIVED. No target; the change is shown neutral. | Σ collection_case.debt_value, count by status | Available (today) · Needs snapshot (trend) |
| PTP kept rate | Promises to pay falling due in the period that were honoured ÷ all promises due in the period. The target is 65%. | collection_case.ptp_date, ptp_amount, ptp_broken_at, plus PTP_ACTIVE → PAID_FULL / PTP_BROKEN in case_status_log | Available |
| Right-party contact | Outbound phone attempts where the borrower's identity was verified ÷ all outbound phone attempts. The target is 18%. | call_record.identity_verified, channel = PHONE, direction = OUTBOUND | Available |
2. Collections & revenue
Is the month on track, and what is driving it?
| View | What it shows | SAZ source | Readiness |
|---|---|---|---|
| Daily cash vs plan | Last 90 days of daily cash collected, with the daily plan as a dashed line. | commission; plan from target amounts | Available |
| Month-end forecast | Run rate: MTD collected ÷ plan-to-date × full-month plan. Shows collected so far, forecast, plan and the gap. | Derived | Available |
| Weekly collections by bank / product | 13 weeks, stacked. Each bank keeps the same colour in every view. | commission → collection_case.bank_id, portfolio.product_id | Available |
| Revenue and payouts | Revenue for the last 5 months, split into net margin and agent/field payouts; the current month is MTD. | commission | Available |
| Top 10 portfolios | Portfolios ranked by cash collected in the period, with placed value, recovery % and FRA registration status. | commission → collection_case.portfolio_id; portfolio.fra_status | Available · placed value Needs new data |
3. Client bank scorecard
One row per client. Clicking a row focuses the whole page on that bank.
| Column | Definition | SAZ source | Readiness |
|---|---|---|---|
| Placed debt | Total value placed by the bank, in all portfolios to date | Placement value per portfolio | Needs new data (store at upload) |
| Open cases · Exposure | Open case count and outstanding balance at the business day | collection_case by bank_id | Available |
| Collected · vs plan | Cash collected in the period, and the percentage of the bank's plan achieved | commission; targets | Available |
| Recovery · PTP kept | Same definitions as the pulse KPIs, for this bank only | As above | Needs snapshot |
| Bank SLA (30 days) | Share of restructure and extension requests to the bank that were acknowledged or decided before the deadline (rolling 30 days) | bank_notification (kind INS_REQUEST / EXT_REQUEST, sla_deadline, acknowledged_at, decided_at) | Available |
| Escalations | Cases currently escalated and not yet cleared | collection_case.escalated_flag, escalation_cleared_at | Available |
| Status | On track / Watch / Behind, based on % of plan (thresholds above) | Derived | Available |
4. Portfolio health
The quality of the book behind the cash
| View | Definition | SAZ source | Readiness |
|---|---|---|---|
| Exposure by days past due | Outstanding balance in the 7 DPD buckets (1–30 … 151–180; 181+ = write-off bucket) | collection_case.debt_value by dpd_bucket_id | Available |
| Collection funnel | Distinct cases in the period that were attempted → reached the right party → gave a promise to pay → kept it, with conversion at each step and coverage of the open book | call_record, field_visit, case_status_log | Available |
| Broken promises | Number and value of promises broken in the period | collection_case.ptp_broken_at, ptp_amount | Available |
| Legal referrals | Cases moved to LEGAL_REFERRAL in the period | case_status_log, legal_case_filed | Available |
| Write-off pending / written off | Requests still awaiting a decision; cases moved to WRITTEN_OFF and their value | write_off_request, case_status_log | Available |
| Placements vs closures | Cases placed per month (portfolio uploads) against cases closed (PAID_FULL, WRITTEN_OFF or ARCHIVED) | portfolio.uploaded_at, valid_rows; case_status_log | Available |
| Roll rates Phase 2 | Share of balance moving between DPD buckets month on month: is the book ageing or curing? | Daily snapshot by DPD bucket | Needs snapshot |
| Vintage curves Phase 2 | Cumulative recovery % by months since placement, per portfolio, so new placements can be compared with older ones | Snapshot + placement value | Needs new data |
5. Workforce productivity
Output and capacity of the people doing the collecting
| View | Definition | SAZ source | Readiness |
|---|---|---|---|
| Active call agents / field collectors | Staff with at least one call attempt or visit check-in in the period, out of all staff in scope | call_record.agent_email; field_visit.collector_email, checkin_at; users.agent_type | Available |
| Calls per agent per day | Outbound attempts ÷ active call agents ÷ working days | call_record | Available |
| Collected per active staff | Cash collected ÷ active staff | commission.agent_email / field_email | Available |
| Field visits | Completed ÷ scheduled visits, and the share that secured a promise to pay | field_visit.status, outcome_code = PTP_SECURED | Available |
| Top / bottom 5 performers | Ranked by cash collected. Agents appear by code and initials only (data minimisation under the PDPL) | commission, call_record | Available |
| Team capacity use | Assigned debt ÷ team debt capacity. Over capacity > 100%; near capacity 90–100% | Σ debt_value by assigned_agent_email; users.debt_capacity, team.debt_capacity | Available |
6. Compliance & risk alerts
An exception list, sorted by severity, each alert with a named owner
| Alert | Rule | SAZ source | Owner |
|---|---|---|---|
| Cases past SLA | Open cases whose SLA due date has passed | collection_case.sla_due_at | Collections Head |
| Late bank requests | Restructure or extension requests answered after sla_deadline (last 30 days); names the worst bank | bank_notification | Bank Liaison |
| Open escalations | Escalated cases that have not been cleared | escalated_flag, escalation_cleared_at | Supervisors |
| Disputed debts | Outcome DP (disputed debt) in the last 7 days | call_record.outcome_code | Collections Head |
| Customer complaints | Complaint DCR codes in the last 7 days | call_record.dcr_*, dcr_option | FRA Compliance |
| Vulnerable customers awaiting review | Cases in VULNERABLE_PENDING_REVIEW | collection_case.status, vulnerability_type | Collections Head |
| Portfolios without FRA registration | Portfolios with active cases but no FRA registration number | portfolio.fra_status, fra_reg_no | FRA Compliance |
| Aged approvals | Approvals with no decision after more than 3 days | pending_approval.requested_at, decision | Supervisors |
| Aged write-off requests | Write-off requests with no decision after more than 7 days | write_off_request.requested_at, decision | Collections Head |
Severity (Watch / Serious / Critical) comes from count thresholds per alert, configurable in Settings. The prototype uses illustrative thresholds.
Access & delivery
- A new read-only
EXECUTIVErole for board members. Collections Head and System Admin can also open the page. - It covers every client bank, but shows aggregates only: no borrower names, phone numbers or national IDs, and agents appear as code + initials.
- Page views are recorded in the existing audit log.
- An in-app page under Executive → Daily overview, in English and Arabic (right-to-left), with light and dark themes. It works on a phone.
- Export PDF from the page: A4 landscape, one section per page, with the active filters printed in the header.
- Data is complete up to the previous business day and refreshed nightly. An intraday "today so far" strip is Phase 2.
Data foundations required
What the build adds underneath the reports
| Foundation | Why it is needed | Phase |
|---|---|---|
| Nightly KPI snapshot | SAZ keeps live state but no daily history. Today's operations dashboard cannot show trends for open cases or PTP rate for this reason. A kpi_daily_snapshot table (day × bank × product × DPD bucket) makes trends, recovery-rate baselines and roll rates possible, and keeps the page fast. | MVP |
| Placement value per portfolio | Debt value captured at upload, for placed-debt, vintage and portfolio recovery %. | MVP |
| Targets definition | Confirm that zone and segment target amounts are the plan of record, or add a monthly target per bank. | MVP (decision) · Phase 2 (admin screen) |
| Payment ledger | One row per payment (amount, date, channel, bank reference) instead of a single paid amount per case. This allows partial payments, channel mix and reconciliation with the banks' core systems. | Phase 2 |
| Fee schedule per client | Contracted fee rates per bank and product, to report profitability per client and cost to collect. | Phase 3 |
Rollout
- All six reports as specified, except the Phase 2 items
- EXECUTIVE role
- Nightly snapshot plus 60-day backfill
- PDF export
- English and Arabic
- Payment ledger and reconciliation
- Roll rates and vintage curves
- Targets admin screen
- Drill-down from bank to portfolio to team
- Intraday strip
- Profitability per client from the fee schedule
- Cost to collect
- Collections forecasting
Decisions requested from the board
- Approve the six reports and the KPI definitions above, or mark changes.
- Confirm the plan of record for targets (zone / segment target amounts, or a monthly target per bank).
- Confirm the KPI targets: recovery 4.0% a month, PTP kept 65%, right-party contact 18%.
- Confirm the status thresholds: On track ≥ 100% of plan, Watch 90–99%, Behind < 90%.
- Name who receives the EXECUTIVE role.
- Choose the default view on opening (Day or Month to date) and the default language.
Glossary
| DPD | Days past due: how late the borrower's oldest unpaid instalment is. |
| PTP | Promise to pay: the borrower's commitment to pay an amount by a date. It is kept if paid on time and broken otherwise. |
| RPC | Right-party contact: the agent spoke with the borrower and verified their identity. |
| Placement | A portfolio of cases handed to SAZ by a client bank for collection. |
| SLA | Service-level agreement: the deadline to act on a case or to answer a bank request. |
| FRA | Financial Regulatory Authority (Egypt). Portfolios must be registered before they are worked (Decision 278/2025). |
| PDPL | Egypt's Personal Data Protection Law. The executive view shows no borrower personal data. |
| MTD / QTD | Month to date / quarter to date, up to and including the selected business day. |