Invoice outcomes
WITH first_try AS (
SELECT invoice_id, MIN(at) AS first_at
FROM payments GROUP BY invoice_id
),
outcome AS (
SELECT p.invoice_id,
MAX(CASE WHEN p.at = f.first_at AND p.outcome = 'decline' THEN 1 ELSE 0 END) AS failed_first,
MAX(CASE WHEN p.outcome = 'success'
AND julianday(p.at) - julianday(f.first_at) <= 8 THEN 1 ELSE 0 END) AS paid_in_ladder,
MAX(CASE WHEN p.outcome = 'success'
AND julianday(p.at) - julianday(f.first_at) > 8 THEN 1 ELSE 0 END) AS paid_late,
COUNT(*) AS attempts
FROM payments p
JOIN first_try f USING (invoice_id)
JOIN invoices i ON i.id = p.invoice_id
-- Invoices from the last two weeks may still be mid-ladder.
WHERE datetime(i.issued_at) < datetime((SELECT MAX(issued_at) FROM invoices), '-14 days')
GROUP BY p.invoice_id
)
SELECT COUNT(*) AS invoices,
ROUND(100.0 * SUM(failed_first) / COUNT(*), 1) AS first_attempt_failure_pct,
ROUND(100.0 * SUM(CASE WHEN failed_first = 1 AND paid_in_ladder = 1 THEN 1 ELSE 0 END)
/ SUM(failed_first), 1) AS recovered_in_ladder_pct,
ROUND(100.0 * SUM(CASE WHEN failed_first = 1 AND paid_in_ladder = 0 AND paid_late = 1 THEN 1 ELSE 0 END)
/ SUM(failed_first), 1) AS recovered_late_pct
FROM outcome;- invoices
- 15506
- first_attempt_failure_pct
- 7.8
- recovered_in_ladder_pct
- 52.9
- recovered_late_pct
- 31.5
holds on the current window