Draft for board review
Open prototype
Executive dashboard · Report catalog

What the board will see every morning, and where each number comes from

Version 0.1 draft Date 21 October 2026 Status For board sign-off Audience C-board, Collections Head, Product

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 EXECUTIVE role 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

ReportBoard question it answersRefreshPhaseReadiness
1. Morning pulseDid we collect what we planned yesterday and month to date, and what did it earn us?Daily, 00:30 CairoMVPAvailable Needs snapshot
2. Collections & revenueAre we on track for the month? Which clients, products and portfolios drive the result?DailyMVPAvailable
3. Client bank scorecardHow are we performing for each client bank, and which relationship is at risk?DailyMVPAvailable Needs new data
4. Portfolio healthHow old and how large is the book we manage? Are cases moving through the funnel?DailyMVP + Phase 2Available Needs snapshot
5. Workforce productivityIs the workforce productive, and is any team over capacity?DailyMVPAvailable
6. Compliance & risk alertsWhat needs a decision or creates regulatory or client risk today?Daily (intraday in Phase 2)MVPAvailable
Common to every report
  • 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

See it in the prototype
Purpose
One-glance answer: did yesterday go to plan?
Each tile shows
Value · change vs comparison · progress to target · 30-day sparkline · MTD line on Day view
Refresh
Nightly snapshot, 00:30 Cairo (after the DPD ageing job)
Phase
MVP
KPIDefinition / formulaSAZ sourceReadiness
Cash collectedSum 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 revenueCommission SAZ earns on collected cash. Net margin = revenue − agent share − field share.commission.commission_total, agent_share, field_shareAvailable
Recovery rateCash 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 startNeeds snapshot
Debt under managementOutstanding 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 statusAvailable (today) · Needs snapshot (trend)
PTP kept ratePromises 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_logAvailable
Right-party contactOutbound phone attempts where the borrower's identity was verified ÷ all outbound phone attempts. The target is 18%.call_record.identity_verified, channel = PHONE, direction = OUTBOUNDAvailable

2. Collections & revenue

Is the month on track, and what is driving it?

See it in the prototype
ViewWhat it showsSAZ sourceReadiness
Daily cash vs planLast 90 days of daily cash collected, with the daily plan as a dashed line.commission; plan from target amountsAvailable
Month-end forecastRun rate: MTD collected ÷ plan-to-date × full-month plan. Shows collected so far, forecast, plan and the gap.DerivedAvailable
Weekly collections by bank / product13 weeks, stacked. Each bank keeps the same colour in every view.commission → collection_case.bank_id, portfolio.product_idAvailable
Revenue and payoutsRevenue for the last 5 months, split into net margin and agent/field payouts; the current month is MTD.commissionAvailable
Top 10 portfoliosPortfolios ranked by cash collected in the period, with placed value, recovery % and FRA registration status.commission → collection_case.portfolio_id; portfolio.fra_statusAvailable · placed value Needs new data

3. Client bank scorecard

One row per client. Clicking a row focuses the whole page on that bank.

See it in the prototype
ColumnDefinitionSAZ sourceReadiness
Placed debtTotal value placed by the bank, in all portfolios to datePlacement value per portfolioNeeds new data (store at upload)
Open cases · ExposureOpen case count and outstanding balance at the business daycollection_case by bank_idAvailable
Collected · vs planCash collected in the period, and the percentage of the bank's plan achievedcommission; targetsAvailable
Recovery · PTP keptSame definitions as the pulse KPIs, for this bank onlyAs aboveNeeds 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
EscalationsCases currently escalated and not yet clearedcollection_case.escalated_flag, escalation_cleared_atAvailable
StatusOn track / Watch / Behind, based on % of plan (thresholds above)DerivedAvailable

4. Portfolio health

The quality of the book behind the cash

See it in the prototype
ViewDefinitionSAZ sourceReadiness
Exposure by days past dueOutstanding balance in the 7 DPD buckets (1–30 … 151–180; 181+ = write-off bucket)collection_case.debt_value by dpd_bucket_idAvailable
Collection funnelDistinct 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 bookcall_record, field_visit, case_status_logAvailable
Broken promisesNumber and value of promises broken in the periodcollection_case.ptp_broken_at, ptp_amountAvailable
Legal referralsCases moved to LEGAL_REFERRAL in the periodcase_status_log, legal_case_filedAvailable
Write-off pending / written offRequests still awaiting a decision; cases moved to WRITTEN_OFF and their valuewrite_off_request, case_status_logAvailable
Placements vs closuresCases placed per month (portfolio uploads) against cases closed (PAID_FULL, WRITTEN_OFF or ARCHIVED)portfolio.uploaded_at, valid_rows; case_status_logAvailable
Roll rates Phase 2Share of balance moving between DPD buckets month on month: is the book ageing or curing?Daily snapshot by DPD bucketNeeds snapshot
Vintage curves Phase 2Cumulative recovery % by months since placement, per portfolio, so new placements can be compared with older onesSnapshot + placement valueNeeds new data

5. Workforce productivity

Output and capacity of the people doing the collecting

See it in the prototype
ViewDefinitionSAZ sourceReadiness
Active call agents / field collectorsStaff with at least one call attempt or visit check-in in the period, out of all staff in scopecall_record.agent_email; field_visit.collector_email, checkin_at; users.agent_typeAvailable
Calls per agent per dayOutbound attempts ÷ active call agents ÷ working dayscall_recordAvailable
Collected per active staffCash collected ÷ active staffcommission.agent_email / field_emailAvailable
Field visitsCompleted ÷ scheduled visits, and the share that secured a promise to payfield_visit.status, outcome_code = PTP_SECUREDAvailable
Top / bottom 5 performersRanked by cash collected. Agents appear by code and initials only (data minimisation under the PDPL)commission, call_recordAvailable
Team capacity useAssigned debt ÷ team debt capacity. Over capacity > 100%; near capacity 90–100%Σ debt_value by assigned_agent_email; users.debt_capacity, team.debt_capacityAvailable

6. Compliance & risk alerts

An exception list, sorted by severity, each alert with a named owner

See it in the prototype
AlertRuleSAZ sourceOwner
Cases past SLAOpen cases whose SLA due date has passedcollection_case.sla_due_atCollections Head
Late bank requestsRestructure or extension requests answered after sla_deadline (last 30 days); names the worst bankbank_notificationBank Liaison
Open escalationsEscalated cases that have not been clearedescalated_flag, escalation_cleared_atSupervisors
Disputed debtsOutcome DP (disputed debt) in the last 7 dayscall_record.outcome_codeCollections Head
Customer complaintsComplaint DCR codes in the last 7 dayscall_record.dcr_*, dcr_optionFRA Compliance
Vulnerable customers awaiting reviewCases in VULNERABLE_PENDING_REVIEWcollection_case.status, vulnerability_typeCollections Head
Portfolios without FRA registrationPortfolios with active cases but no FRA registration numberportfolio.fra_status, fra_reg_noFRA Compliance
Aged approvalsApprovals with no decision after more than 3 dayspending_approval.requested_at, decisionSupervisors
Aged write-off requestsWrite-off requests with no decision after more than 7 dayswrite_off_request.requested_at, decisionCollections Head

Severity (Watch / Serious / Critical) comes from count thresholds per alert, configurable in Settings. The prototype uses illustrative thresholds.

Access & delivery

Who can see it
  • A new read-only EXECUTIVE role 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.
How it is delivered
  • 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

FoundationWhy it is neededPhase
Nightly KPI snapshotSAZ 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 portfolioDebt value captured at upload, for placed-debt, vintage and portfolio recovery %.MVP
Targets definitionConfirm 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 ledgerOne 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 clientContracted fee rates per bank and product, to report profitability per client and cost to collect.Phase 3

Rollout

MVP
After board sign-off
  • All six reports as specified, except the Phase 2 items
  • EXECUTIVE role
  • Nightly snapshot plus 60-day backfill
  • PDF export
  • English and Arabic
Phase 2
Deeper analytics
  • Payment ledger and reconciliation
  • Roll rates and vintage curves
  • Targets admin screen
  • Drill-down from bank to portfolio to team
  • Intraday strip
Phase 3
Economics
  • 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

DPDDays past due: how late the borrower's oldest unpaid instalment is.
PTPPromise to pay: the borrower's commitment to pay an amount by a date. It is kept if paid on time and broken otherwise.
RPCRight-party contact: the agent spoke with the borrower and verified their identity.
PlacementA portfolio of cases handed to SAZ by a client bank for collection.
SLAService-level agreement: the deadline to act on a case or to answer a bank request.
FRAFinancial Regulatory Authority (Egypt). Portfolios must be registered before they are worked (Decision 278/2025).
PDPLEgypt's Personal Data Protection Law. The executive view shows no borrower personal data.
MTD / QTDMonth to date / quarter to date, up to and including the selected business day.