Sample output from the Customer Health Scoring prompt in the Sonar AI Prompt Library, run against a NetSuite test account. Every name and number here is test data. Back to the post · The library
Parent Company NetSuite TD3016323 · Prepared via Sonar AI

Customer Health & Churn Risk
Proactive Outreach Register

Behavioral churn-risk scoring for every active customer, derived from three leading indicators inside NetSuite: order-cadence decay, basket contraction, and payment-latency drift.

August 22, 2026  ·  Data window: Sep 1, 2024 – Aug 22, 2026  ·  1,841 sales transactions analyzed

01Executive Summary

State of the customer base at a glance.
Active customers
(24-month window)
Scored for churn risk
(≥5 orders of history)
4
At Risk — outreach
this week
18
Watch — monitor
& touch this month
Lifetime revenue in
At Risk + Watch bands
$641K
Lifetime revenue on the
3 largest drifting B2B accts
$799K
Overdue open A/R
(27 accounts)
$473K
Of that, >90 days
past due
Revenue figures are transaction-line totals (CustInvc + CashSale), elimination subsidiary excluded. A/R figures are open invoice balances as of report date.

Key Findings

  1. Karmabit is the clearest quiet-churn case in the B2B book. A steady ~31-day reorder rhythm for 20 orders — now silent for 123 days (3.9× its own cycle). Order count fell 6→2 across the last two half-years. $64.6K lifetime revenue. No open balance, no dispute on record — it simply stopped ordering.
  2. Design Excellence Ltd. ($238.7K lifetime) is splitting its wallet. It still orders every few days — frequency actually rose 6→14 — but average order value halved ($11,318→$5,183), basket breadth compressed from 11 to 7.2 distinct items, and days-to-pay drifted +5.9d. High-frequency/shrinking-basket is the classic pattern of a customer diverting share to another supplier.
  3. Jones Manufacturing — the single largest account ($316.7K) — shows early-stage drift. AOV down 49% ($13,838→$7,055) and days-to-pay +5.6d, while cadence still holds. This is the cheapest possible moment to intervene.
  4. Entenmanns LLC ($60.5K) has gone quiet. 80 days of silence against a 44-day rhythm; order count halved. Last order Jun 3.
  5. A separate "won-then-lost" cohort holds $473K of >90-day A/R. Global Information ($110.6K, 262d), Red Rivers Consulting ($102.9K, 155d), Mercury Co. ($80.1K, 460d), Gotter inc. ($68.1K, 256d) and Haskell Associates ($43.9K, 327d) each placed one large order, never paid in full, and never returned. These route to collections, not retention.
  6. Payment behavior is a corroborating signal here, not a leading one. 89% of applied invoices in this account pay same-day, so days-to-pay drift rarely fires alone — but where it does (Design Excellence +5.9d, Jones +5.6d, Hugo +6.0d, Marshall +5.5d), it reliably co-occurs with basket decay. The model weights it accordingly.

02Risk Distribution

69 scored customers by band. Thresholds: Critical ≥60 · At Risk 40–59 · Watch 20–39 · Healthy <20.
Critical
0 accounts
At Risk
4 · $75.4K LTV
Watch
18 · $668.3K LTV
Healthy
47 · stable

43 additional customers had fewer than 5 orders — too little history for trend scoring. They are triaged separately in Section 05; several carry the largest open balances in the book.

03Priority Accounts

The four accounts where outreach this week has the highest expected value. Quarterly revenue shown Sep 2024 – present; Q3 2026 is partial (through Aug 22).
Karmabit Customer 278 · B2B · Rep: Tim Dietrich 40/100 · AT RISK
123 days
Silent vs 31d rhythm (3.9×)
6 → 2
Orders, prior vs recent 180d
$64,603
Lifetime revenue
$0
Open A/R
Quarterly revenue · peak $11.2K (Q1'25) → $3.6K (Q2'26) → $0 QTD
Twenty orders on a metronomic monthly cycle, then full stop after April 21. Basket composition was stable to the end — this is disengagement, not downsizing. Accounts that pass 3× their own cycle rarely return without contact.
PlayRep call this week. Frame as service check-in, not sales. Probe for a competitive displacement or an internal change of buyer. A reorder incentive on their standard 8-item basket is the lowest-friction reactivation path.
Entenmanns LLC Customer 258 · B2B · Rep: Tim Dietrich 26/100 · WATCH — cadence break
80 days
Silent vs 44d rhythm (1.8×)
4 → 2
Orders, prior vs recent 180d
$60,495
Lifetime revenue
$0
Open A/R
Quarterly revenue · steady $6–12K/quarter for 7 quarters → $0 QTD
A dependable mid-market account approaching the 2×-cycle threshold where reactivation rates drop sharply. Basket and payment behavior were healthy through the last order — the earlier the touch, the better the odds.
PlayReorder-reminder outreach now, before the 90-day mark. Their basket is consistent (4–6 SKUs); a one-click reorder proposal is appropriate.

04Churn-Risk Register

All 69 scored customers, ranked by risk score. Pillar bars show Cadence / Basket / Payment sub-scores (red ≥50). Hatched = insufficient data for that pillar; the score renormalizes over available pillars.
#CustomerSegScoreBand C · B · P Lifetime $Silent / Cycle Orders P→RAOV P→RPrimary drivers

05The Won-Then-Lost Cohort

Single- and low-order customers with material aged receivables. Not scoreable for churn — they already churned. This is a collections and root-cause exercise: 27 accounts hold $799K overdue; the 13 below account for $773K of it.
CustomerRepLast Order Open A/RDays Past Due
Global Information 263Joel Williams2025-11-04$110,579262
Red Rivers Consulting 402Matt Fisher2026-02-20$102,906155
Magna Tech Limited 284Tim Dietrich2026-06-22$97,94232
Falcon Systems 259Tim Dietrich2026-04-30$86,00782
Mercury Co. 292Joel Williams2025-04-20$80,079460
Gotter inc. 265Joel Williams2025-11-10$68,119256
Blockster Inc. 280Tim Dietrich2026-06-27$53,42480
Haskell Associates 268Tim Dietrich2025-08-31$43,941327
John G. Roche Opticians 275Tim Dietrich2026-03-16$31,810129
Informics International 271Tim Dietrich2026-02-23$29,239152
Greenwood Consulting 267Tim Dietrich2026-05-25$26,27556
Heidelberg Haus 269Tim Dietrich2026-05-26$22,47455
Dazzlesphere Company 254Tim Dietrich2026-06-19$20,05435

Pattern worth investigating

Every account above follows the same shape: one or two large orders (avg ~$45K), Net 30 terms granted immediately, partial or zero payment, no repeat business. Before pursuing collections, examine whether onboarding credit checks were applied to these accounts — the recurrence of the pattern suggests a process gap at customer creation, not 13 independent bad actors. The customer-onboarding-check process in this account can be run against new accounts going forward.

06Outreach Routing

Who owns what, and in what order.
OwnerQueueAccounts
Tim Dietrich Retention — this week Karmabit (40), Design Excellence Ltd. (33), Jones Manufacturing (28), Entenmanns LLC (26)
Joel Williams Collections escalation Global Information ($110.6K/262d), Mercury Co. ($80.1K/460d), Gotter inc. ($68.1K/256d)
Matt Fisher Collections + monitor Red Rivers Consulting ($102.9K/155d); watch Realpoint inc. (16, breadth narrowing)
A/R team Aging follow-up Magna Tech, Falcon Systems, Blockster, Haskell, John G. Roche, Informics + 15 smaller (Section 05)
Store ops / e-comm B2C win-back campaign 3 At Risk + 15 Watch retail customers (no assigned rep) — candidates for automated re-engagement offers; largest: Layla Tilley, Jamber Rose, David Montague, Maria Dale

Suggested operating rhythm: re-run this scoring monthly after close. An account entering At Risk generates a rep task; an account crossing 3× its own order cycle generates an immediate alert. Both are automatable as a NetSuite scheduled script — the agent-builder process in this account can take this report's model as its Step-1 blueprint.

07Methodology

Fully deterministic and reproducible from NetSuite data. No external data, no black-box model.
40%

Order Cadence

Lapse ratio — days since last order ÷ the customer's own average order gap; risk ramps from 1× to 3× cycle. Frequency momentum — order count, trailing 180d vs the 180d before.

30%

Basket

AOV contraction — average order value, recent vs prior window. Diversity loss — distinct items per order, recent vs prior. Captures share-of-wallet leakage that top-line revenue hides.

30%

Payment

Days-to-pay drift — invoice→payment application latency, recent vs prior; ramps to max risk at +14d. A/R age — oldest open invoice past due; ramps to max at 90d.

pillar  = max(signal₁, signal₂) + 0.4 × min(signal₁, signal₂)   // worst signal dominates; corroboration escalates
score   = 100 × (0.40·cadence + 0.30·basket + 0.30·payment)  // renormalized when a pillar lacks data
bands   = Critical ≥60 · At Risk ≥40 · Watch ≥20 · Healthy <20

Each sub-signal is clamped to [0,1] before combination. Comparison windows are trailing 180 days vs the prior 180 days, measured from the report date. The worst-plus-corroboration pillar design was chosen over simple averaging because churn signals are asymmetric: one screaming signal (123 days of silence) matters more than three mild ones, and averaging dilutes it.

08Source Queries

SuiteQL, run against TD3016323 on Aug 22, 2026. House conventions applied: elimination subsidiary (id 4) excluded via tl.subsidiary <> 4; single-currency account, no currency joins.
Q1 — Per-order facts (basis for cadence + basket metrics; 1,841 rows)
SELECT
    t.entity,
    TO_CHAR(t.trandate, 'YYYY-MM-DD') AS trandate,
    ROUND(SUM(ABS(tl.netamount)), 2)  AS order_total,
    COUNT(DISTINCT tl.item)           AS distinct_items,
    COUNT(DISTINCT tl.class)          AS distinct_classes,
    SUM(ABS(tl.quantity))             AS units
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id AND tl.mainline = 'F' AND tl.taxline = 'F'
WHERE t.type IN ('CustInvc', 'CashSale')
  AND tl.subsidiary <> 4
GROUP BY t.id, t.entity, t.trandate
ORDER BY t.entity, t.trandate
Q2 — Per-customer cadence & basket aggregates (recent = trailing 180d, prior = 180d before)
SELECT
    o.entity,
    COUNT(*)                                        AS n_orders,
    TO_CHAR(MAX(o.odate), 'YYYY-MM-DD')             AS last_order,
    ROUND(TRUNC(SYSDATE) - MAX(o.odate), 0)         AS days_since_last,
    ROUND((MAX(o.odate) - MIN(o.odate)) / NULLIF(COUNT(*) - 1, 0), 1) AS avg_gap_days,
    SUM(CASE WHEN o.odate > TRUNC(SYSDATE) - 180 THEN 1 ELSE 0 END)   AS n_recent,
    SUM(CASE WHEN o.odate <= TRUNC(SYSDATE) - 180
              AND o.odate > TRUNC(SYSDATE) - 360 THEN 1 ELSE 0 END)   AS n_prior,
    ROUND(AVG(CASE WHEN o.odate > TRUNC(SYSDATE) - 180 THEN o.total END), 2)  AS aov_recent,
    ROUND(AVG(CASE WHEN o.odate <= TRUNC(SYSDATE) - 180
                    AND o.odate > TRUNC(SYSDATE) - 360 THEN o.total END), 2)  AS aov_prior,
    ROUND(AVG(CASE WHEN o.odate > TRUNC(SYSDATE) - 180 THEN o.ditems END), 2) AS items_recent,
    ROUND(AVG(CASE WHEN o.odate <= TRUNC(SYSDATE) - 180
                    AND o.odate > TRUNC(SYSDATE) - 360 THEN o.ditems END), 2) AS items_prior,
    ROUND(SUM(o.total), 2)                          AS lifetime_rev
FROM ( /* Q1 subquery: one row per order */ ) o
GROUP BY o.entity
Q3 — Days-to-pay from real invoice→payment application links
SELECT
    d.entity,
    COUNT(*)                                                          AS paid_invoices,
    ROUND(AVG(CASE WHEN d.inv_date >  TRUNC(SYSDATE) - 180 THEN d.dtp END), 1) AS dtp_recent,
    ROUND(AVG(CASE WHEN d.inv_date <= TRUNC(SYSDATE) - 180 THEN d.dtp END), 1) AS dtp_prior
FROM (
    SELECT inv.entity, inv.id, inv.trandate AS inv_date,
           MAX(pay.trandate) - inv.trandate AS dtp
    FROM previoustransactionlinelink ptl
    JOIN transaction pay ON pay.id = ptl.nextdoc     AND pay.type = 'CustPymt'
    JOIN transaction inv ON inv.id = ptl.previousdoc AND inv.type = 'CustInvc'
    GROUP BY inv.entity, inv.id, inv.trandate
) d
GROUP BY d.entity
Q4 — Open A/R exposure
SELECT
    t.entity,
    COUNT(*)                              AS open_invoices,
    ROUND(SUM(t.foreignamountunpaid), 2)  AS open_balance,
    MAX(TRUNC(SYSDATE) - TRUNC(t.duedate)) AS max_days_overdue
FROM transaction t
WHERE t.type = 'CustInvc' AND t.status = 'A' AND t.foreignamountunpaid > 0
GROUP BY t.entity

Supporting: customer identity/rep/terms joined from customer, employee, term; quarterly trend from Q1 regrouped by TO_CHAR(trandate,'YYYY-"Q"Q'). Score computation performed deterministically in JavaScript (formulas in Section 07); full scored roster exported alongside this report as CSV.

09Assumptions & Limitations

Assumptions

Limitations

This document was generated from live NetSuite data (account TD3016323, production) on August 22, 2026 by Sonar AI at the request of Tim Dietrich. Scores are behavioral risk indicators intended to prioritize human outreach; they are not predictions of certain churn and should not be used as the sole basis for credit or contractual decisions. All monetary figures in USD. Source queries are reproduced in full in Section 08; the complete scored roster accompanies this report as CSV.
Boardroom Series · Customer Health · 2026-08