Fido

Loan Postponement: Findings & A/B Test Design

Observational analysis + experiment proposal to measure true feature impact
March 9, 2026
Ghana Market
905 postponed loans
Nov 2025 – Feb 2026

TL;DR

Early data on loan postponement is directionally positive but inconclusive. We can bound the impact but can't isolate it from selection bias without an experiment.

1. What We Observed

905
Loans Postponed
29d
Avg Extension
650
Avg Fido Score
LN 28
Avg Loan Number

Feature Eligibility (from codebase)

RuleRequirement
Fido Score≥ 500
Loan stateACTIVE (borrower is current, not in arrears)
InstallmentsSingle installment only
ProductNot BNPL / Goods
TimingSecond half of loan term, up to 1 day before due date
FrequencyMax 1 postponement per client (lifetime)

2. Aggregate DR: Postponed vs. Eligible Population

GroupNDR@DPD0DR@DPD7DR@DPD15DR@DPD30
Postponed90511.83%8.12%7.26%6.99%
Eligible, not postponed85,5658.29%4.45%4.07%3.65%
Delta+3.54pp+3.67pp+3.19pp+3.34pp
Selection bias warning: Borrowers who choose to postpone are self-selecting — they're more likely to be under cash-flow pressure than the average eligible borrower. Comparing these groups directly overstates postponement's negative impact.

3. Bounding the True Impact

We can't observe the counterfactual (what postponers would have done without the option), but we can bound it using two extreme assumptions:

AssumptionBenchmarkPostponed DR@DPD30Benchmark DR@DPD30Implication
Best case
All postponers would have defaulted
DPD0 missers
(same LN/FS bucket)
5–7% 35–56% Feature saves ~30pp of defaults
Worst case
All postponers would have paid on time
Full eligible population
(same LN/FS bucket)
5–7% 3–4% Feature adds ~3pp of defaults
The truth sits somewhere in this range. The key unknown: what share of postponers would have missed DPD0 without the option? If it's >10%, the feature is net positive on credit performance. Only an A/B test can answer this.

4. Segment-Level Detail

DR@DPD30 by LN and Fido Score bucket. Three benchmarks for each segment.

SegmentPostponed NPostponed DREligible Pop DRDPD0 Missers DR
LN21+ / FS 700+3505.3%2.6%37.4%
LN21+ / FS 600–6991604.6%3.9%34.7%
LN21+ / FS 500–599867.1%5.9%37.2%
LN11–20 / FS 600–699905.5%4.8%48.7%
LN11–20 / FS 500–59914214.0%5.9%55.6%
LN1–10 / FS 500–5994716.5%6.3%46.7%
Pattern: High-tenure / high-score borrowers (LN21+, FS 600+) sit very close to the eligible-population benchmark, suggesting postponement does little harm in these segments. Lower-tenure segments show a wider gap, but also have the most to gain if the feature prevents defaults.

5. A/B Test Design

An experiment to measure the causal impact of postponement on default rate, repayment timing, and retention.

Hypothesis

Offering in-app loan postponement to eligible borrowers reduces net default rate (measured at DPD30) without materially increasing time-to-repayment for borrowers who would have paid on time.

Test & Control

Control (50%)

Postponement feature is hidden. Eligible borrowers see the standard loan page with no postponement option.

  • No UI change
  • No backend eligibility check surfaced
  • Borrower experience identical to pre-launch

Treatment (50%)

Postponement feature is shown. Eligible borrowers see the postponement offer in the loan page (current behavior).

  • Full postponement flow available
  • All current eligibility rules apply
  • No other changes

Randomization

ParameterValueRationale
UnitClient IDEnsures consistent experience across loans. Client-level avoids contamination if same person takes multiple loans.
Split50/50Maximizes statistical power. Given current adoption is ~1% of eligible loans, we need a large pool.
StratificationLN bucket + Fido Score bucketEnsures balanced segments — the observational data shows these are the strongest confounders.
EligibilityAll clients meeting current postponement criteriaKeep the same FS ≥ 500, single installment, ACTIVE state rules.

Primary Metric

Default Rate at DPD30 (installment-level FDR): 1 - SUM(REPAID_AMOUNT_DPD30) / SUM(DISBURSED_AMOUNT_DPD30)
Measured on all loans disbursed during the test period that have reached DPD30 maturity. Compares treatment vs control at the population level (intent-to-treat).

Secondary Metrics

MetricDefinitionWhy It Matters
DR@DPD0Default rate at original due dateMeasures on-time repayment. If treatment DR@DPD0 is higher, postponement may reduce urgency.
DR@DPD7, DPD15Default rate at 7 and 15 days past dueRepayment curve shape — are treatment borrowers catching up?
Time to repaymentDays from disbursement to full repaymentEven if DR is similar, postponement may delay cash collection.
Next-loan take rate% who take another loan within 30d of repaymentRetention/engagement signal — does postponement improve loyalty?
Postponement adoption% of treatment group who actually postponeFeature usage rate. Expected ~1–2% based on current data.
Collection costCalls/SMS per loan in 0–30 DPD windowIf postponement reduces delinquency, it should reduce outreach costs.

Sample Size & Duration

ParameterValueNotes
Baseline DR@DPD303.65%From eligible population (Nov – Feb)
MDE (minimum detectable effect)1.0ppDetect if treatment DR is ≥ 4.65% or ≤ 2.65%
Power80%Standard
Significance5% (two-sided)Standard
Required N per arm~7,000 loans reaching DPD30For proportions test on 3.65% base rate with 1pp MDE
Expected weekly eligible volume~5,000 loans/weekBased on ~85K eligible loans in ~17 weeks
DPD30 maturity lag~60–75 days from disbursementLoan term (~30d) + 30 DPD observation
Enrollment period3 weeks~15K loans per arm
Total duration~13 weeks3 weeks enrollment + 10 weeks for last cohort to reach DPD30

Timeline

Week 0–1 Implementation: add client-level flag to PostponementEligibilityService, stratified randomization, logging
Week 2–4 Enrollment: eligible clients randomly assigned. Monitor for balance (SRM check)
Week 5–8 Observation: early DPD0/DPD7 reads available. Check guardrails
Week 9–13 Maturation: DPD30 data fills in. Final readout at week 13

Guardrails (stop the test if breached)

GuardrailThresholdAction
Treatment DR@DPD7 vs control> 3pp worse at week 6Stop test, revert to treatment-for-all
SRM (sample ratio mismatch)Chi-square p < 0.01Investigate randomization bug
Control group complaintsSupport tickets mentioning missing featureMonitor; tolerable if < 5 tickets/week

Implementation Notes

  1. Randomization point: Add a check in PostponementEligibilityService.isEligible(). Before returning true, check if the client is in the treatment group. If not, return false. This keeps all other eligibility logic intact.
  2. Assignment persistence: Hash client_id + experiment_salt to deterministically assign groups. No need for a lookup table — same client always gets the same group.
  3. Logging: Log the assignment (postponement_ab_group: control/treatment) on every eligibility check, even for control. This lets us measure intent-to-treat.
  4. Stratification: Pre-stratify by LN bucket (1–10, 11–20, 21+) and FS bucket (500–599, 600–699, 700+). Hash-based assignment naturally balances if volume is sufficient, but verify with a balance check at week 1.

6. Decision Framework

How to interpret results and what to do with them.

OutcomeTreatment DR vs ControlAction
Clear win Treatment DR significantly lower Roll out to 100%. Postponement prevents defaults. Consider relaxing the 1-per-lifetime cap.
Neutral No significant difference Keep the feature — it's not hurting credit and likely improves retention/engagement. Measure next-loan take rate as the tiebreaker.
Mild negative Treatment DR 1–2pp higher Segment analysis: keep for LN21+ (low risk, high value), tighten for lower-tenure segments.
Clear negative Treatment DR >2pp higher Disable feature or restrict to FS ≥ 650 / LN ≥ 20. Redesign the UX to reduce moral hazard.

7. Methodology

Data source: GHANA_PROD.ML.LOAN_INFO_TBL — installment-level FDR columns.

Population: Disbursed single-installment loans, Fido Score > 500, Nov 1 2025 – Feb 23 2026.

Postponed group: LOAN_POSTPONEMENT_DATE IS NOT NULL (N=905). DR measured from the new (extended) due date.

DPD0 missers: Non-postponed loans where REPAID_AMOUNT_DPD0 < 95% of DISBURSED_AMOUNT_DPD0.

Eligibility rules: Verified from PostponementEligibilityService.java in the fido-loan codebase.

Key limitation: All observational comparisons suffer from selection bias. The A/B test is the only way to establish causation.