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 CompanyNetSuite 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.
112
Active customers (24-month window)
69
Scored for churn risk (≥5 orders of history)
4
At Risk — outreach this week
18
Watch — monitor & touch this month
$744K
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
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.
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.
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.
Entenmanns LLC ($60.5K) has gone quiet. 80 days of silence against a 44-day rhythm; order count halved. Last order Jun 3.
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.
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 Dietrich40/100 · AT RISK
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.
Quarterly revenue · top-line holds, but order economics are deteriorating underneath
Frequency more than doubled (6→14 orders) while every order got smaller and narrower. Total revenue looks fine this quarter — which is exactly why this pattern goes unnoticed. The account appears to be moving categories to another supplier while keeping fill-in volume here. Payment drift (+5.9d) is a secondary tell of reduced strategic priority.
PlayLine-level review before the call: identify which of the ~4 lost item categories disappeared after Q1 2026, then lead with a targeted win-back offer on those SKUs. Ask directly about supplier consolidation.
Jones Manufacturing Customer 276 · B2B · Rep: Tim Dietrich28/100 · WATCH — largest account in the book
−49%
AOV $13,838 → $7,055
+5.6d
Days-to-pay drift
31 days
Since last order (28.5d cycle)
$316,711
Lifetime revenue — #1 overall
Quarterly revenue · volatile but trending down from the Q3'25 peak; Q3'26 QTD $3.2K
Cadence still holds (score reflects that), but the value per order has halved and payment latency is drifting on an account that historically paid instantly. On a $317K relationship, a 49% AOV contraction is a ~$66K/year revenue-run-rate problem if it persists.
PlayExecutive-level QBR within two weeks. Bring the item-mix comparison (recent vs prior 180d). Early-stage drift on a flagship account justifies senior attention before the cadence signal fires too.
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.
#
Customer
Seg
Score
Band
C · B · P
Lifetime $
Silent / Cycle
Orders P→R
AOV P→R
Primary 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.
Customer
Rep
Last Order
Open A/R
Days Past Due
Global Information 263
Joel Williams
2025-11-04
$110,579
262
Red Rivers Consulting 402
Matt Fisher
2026-02-20
$102,906
155
Magna Tech Limited 284
Tim Dietrich
2026-06-22
$97,942
32
Falcon Systems 259
Tim Dietrich
2026-04-30
$86,007
82
Mercury Co. 292
Joel Williams
2025-04-20
$80,079
460
Gotter inc. 265
Joel Williams
2025-11-10
$68,119
256
Blockster Inc. 280
Tim Dietrich
2026-06-27
$53,424
80
Haskell Associates 268
Tim Dietrich
2025-08-31
$43,941
327
John G. Roche Opticians 275
Tim Dietrich
2026-03-16
$31,810
129
Informics International 271
Tim Dietrich
2026-02-23
$29,239
152
Greenwood Consulting 267
Tim Dietrich
2026-05-25
$26,275
56
Heidelberg Haus 269
Tim Dietrich
2026-05-26
$22,474
55
Dazzlesphere Company 254
Tim Dietrich
2026-06-19
$20,054
35
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.
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.
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
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
Sales activity = CustInvc + CashSale transaction lines (mainline/tax lines excluded); Sales Orders are excluded to avoid double-counting demand that later invoices.
Scoring eligibility requires ≥5 orders. Below that, cadence and trend math is noise; those 43 customers are triaged by A/R exposure instead.
Days-to-pay uses payment application links (previoustransactionlinelink), not invoice closedate — closedate proved unreliable as a paid-date proxy (uniform ~4d lag artifact).
Windows: "recent" = trailing 180 days from Aug 22, 2026; "prior" = the 180 days before that. Customers whose entire history predates the prior window (e.g., Kasson Ltd) fall out of trend scoring.
Segment inference: accounts with an assigned sales rep and company name are treated as B2B; unassigned retail-pattern accounts as B2C.
Limitations
Weights (40/30/30), ramps (3× cycle, +14d pay drift, 90d A/R) and band cuts (60/40/20) are judgment-based starting points, not fitted parameters. After 2–3 monthly cycles, back-test against realized churn and recalibrate.
~89% of applied invoices in this account pay same-day, so the payment pillar has limited variance; it functions as a corroborator, not a primary detector.
Q3 2026 quarterly figures are partial (through Aug 22). The 180-day windows are unaffected.
Walk-in Customer (3892) and five Aug-2026 first-time buyers appear in totals but are not meaningful churn subjects.
No seasonality adjustment: a customer with a genuinely annual rhythm could over-score on lapse. None of the current At Risk accounts fit that profile (all had sub-50-day cycles).
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.