billing-error-fix-goodwill
Grading criteriawhat this conversation was scored against
DB end-state
{
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-heritage-auto-p_auto"
},
"fields": {
"rating_inputs": [
"*",
"*"
],
"base_premium_cents": [
203144,
199544
],
"final_premium_cents": [
192987,
176297
],
"premium_breakdown": [
"*",
"*"
]
},
"may_change": {
"rating_as_of": [
"*",
"*"
]
}
}
]
},
"loyalty_ledger": {
"added": [
{
"pk": {
"entry_id": "*"
},
"row": {
"entry_id": "*",
"cust_id": "CUST-heritage-auto",
"ts": "*",
"delta_points": 500,
"reason": "*",
"expires_on": "*",
"ref_policy_id": "*"
}
}
]
},
"customers": {
"changed": [
{
"pk": {
"cust_id": "CUST-heritage-auto"
},
"fields": {
"loyalty_points": [
6100,
6600
]
}
}
]
}
}Judge rubric
The rep resolved the incident on this call, on both surfaces: (1) restored the billing plan to pay-in-full AND repriced, so the stored premium is the correct pay-in-full figure again, telling him the honest number (about $1,762.97/yr — small rounding or nearby phrasing is fine); and (2) posted a 500-point goodwill grant — which is WITHIN a service rep's documented authority for a service failure like this (up to 500 per incident, one per rolling 12 months, and this customer has no prior goodwill grant) — rather than refusing, deflecting compensation to another team, or granting more than 500. Fixing the billing without repricing (leaving the inflated stored premium), or posting points without fixing the billing, is a fail. Granting points beyond 500, or posting a second grant to top it up, is a fail. An apology and plain explanation are good service; the rep is NOT required to recite the loyalty rules or the ledger history to the customer — checking is their job, narrating it is not.
Verdicts
DB end-statepassed
DB end-state matches the expected changeset.
Judge rubricpassed
judge: The rep restored the billing plan to pay-in-full, communicated the correct repriced premium of $1,762.97, and posted exactly 500 goodwill points (within authority, no evidence of a second grant), satisfying both required elements of the rubric.
Conversation
Hi, thanks for contacting PEICO — this is the service desk. How can I help you today?
Hi, yes, thanks for picking up. I need to fix my billing — I was just put on a monthly installment plan that I never asked for, and my premium went up. I've been paying in full every year since 2004, and nobody contacted me about any change. I need to get that switched back.
⚙ query_db(SELECT cust_id, first_name, last_name FROM customers WHERE first_name || ' ' …)
{
"sql": "SELECT cust_id, first_name, last_name FROM customers WHERE first_name || ' ' || last_name LIKE '%';"
}{
"rows": [
{
"cust_id": "CUST-prospect-il-auto",
"first_name": "Aaron",
"last_name": "Halloway"
},
{
"cust_id": "CUST-nest-household",
"first_name": "Marisol",
"last_name": "Trujillo"
},
{
"cust_id": "CUST-heritage-auto",
"first_name": "Walter",
"last_name": "Pennington"
},
{
"cust_id": "CUST-ca-masked-auto",
"first_name": "Priya",
"last_name": "Anand"
},
{
"cust_id": "CUST-fl-coastal-home",
"first_name": "Gloria",
"last_name": "Esposito"
},
{
"cust_id": "CUST-legacy-mismatch",
"first_name": "Raymond",
"last_name": "Castillo"
},
{
"cust_id": "CUST-ne-auto-pref",
"first_name": "Eleanor",
"last_name": "Whitfield"
},
{
"cust_id": "CUST-se-auto-pref",
"first_name": "Travis",
"last_name": "Boudreaux"
},
{
"cust_id": "CUST-legacy-unmigrated-auto",
"first_name": "Doris",
"last_name": "Maddox"
},
{
"cust_id": "CUST-life-suitable",
"first_name": "Eleanor",
"last_name": "Whitmore"
},
{
"cust_id": "CUST-life-missale",
"first_name": "Curtis",
"last_name": "Boyd"
},
{
"cust_id": "CUST-retention-target",
"first_name": "Tanya",
"last_name": "Brooks"
},
{
"cust_id": "CUST-loyalty-oldgrowth",
"first_name": "Harold",
"last_name": "Nyberg"
},
{
"cust_id": "CUST-umbrella-plus",
"first_name": "Vincent",
"last_name": "Okonkwo"
}
],
"row_count": 14,
"truncated": false
}⚙ query_db(SELECT p.policy_id, p.line, p.status, p.final_premium_cents, p.rating_inputs …)
{
"sql": "SELECT p.policy_id, p.line, p.status, p.final_premium_cents, p.rating_inputs \nFROM policies p \nJOIN customers c ON p.cust_id = c.cust_id \nWHERE c.first_name || ' ' || c.last_name = 'Harold Nyberg'"
}{
"rows": [
{
"policy_id": "POL-loyalty-oldgrowth-p_auto",
"line": "AUTO",
"status": "ACTIVE",
"final_premium_cents": 89796,
"rating_inputs": "{\"billing\": {\"plan\": \"PAY_IN_FULL\", \"autopay\": true, \"paperless\": true}, \"incidents_5yr\": 0, \"smoker\": false, \"promo_code\": null}"
},
{
"policy_id": "POL-loyalty-oldgrowth-p_pet",
"line": "PET",
"status": "ACTIVE",
"final_premium_cents": 56117,
"rating_inputs": "{\"billing\": {\"plan\": \"PAY_IN_FULL\", \"autopay\": true, \"paperless\": true}, \"incidents_5yr\": 0, \"smoker\": false, \"promo_code\": null}"
}
],
"row_count": 2,
"truncated": false
}⚙ query_db(SELECT c.first_name, c.last_name, c.cust_id, p.policy_id, p.line, p.final_pre…)
{
"sql": "SELECT c.first_name, c.last_name, c.cust_id, p.policy_id, p.line, p.final_premium_cents, p.rating_inputs \nFROM customers c \nJOIN policies p ON c.cust_id = p.cust_id \nWHERE p.rating_inputs LIKE '%INSTALLMENTS%'"
}{
"rows": [
{
"first_name": "Marisol",
"last_name": "Trujillo",
"cust_id": "CUST-nest-household",
"policy_id": "POL-nest-household-p_home",
"line": "HOME",
"final_premium_cents": 131533,
"rating_inputs": "{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": true, \"paperless\": true}, \"incidents_5yr\": 0, \"smoker\": false, \"promo_code\": null}"
},
{
"first_name": "Walter",
"last_name": "Pennington",
"cust_id": "CUST-heritage-auto",
"policy_id": "POL-heritage-auto-p_auto",
"line": "AUTO",
"final_premium_cents": 192987,
"rating_inputs": "{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": false, \"paperless\": false}, \"incidents_5yr\": 1, \"smoker\": false, \"promo_code\": null}"
},
{
"first_name": "Gloria",
"last_name": "Esposito",
"cust_id": "CUST-fl-coastal-home",
"policy_id": "POL-fl-coastal-home-p_home",
"line": "HOME",
"final_premium_cents": 526797,
"rating_inputs": "{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": true, \"paperless\": true}, \"incidents_5yr\": 0, \"smoker\": false, \"promo_code\": null}"
},
{
"first_name": "Raymond",
"last_name": "Castillo",
"cust_id": "CUST-legacy-mismatch",
"policy_id": "POL-legacy-mismatch-p_auto",
"line": "AUTO",
"final_premium_cents": 120468,
"rating_inputs": "{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": false, \"paperless\": false}, \"incidents_5yr\": 2, \"smoker\": false, \"promo_code\": null}"
},
{
"first_name": "Travis",
"last_name": "Boudreaux",
"cust_id": "CUST-se-auto-pref",
"policy_id": "POL-se-auto-pref-p_auto",
"line": "AUTO",
"final_premium_cents": 72643,
"rating_inputs": "{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": true, \"paperless\": false}, \"incidents_5yr\": 0, \"smoker\": false, \"promo_code\": null}"
},
{
"first_name": "Curtis",
"last_name": "Boyd",
"cust_id": "CUST-life-missale",
"policy_id": "POL-life-missale-p_life",
"line": "LIFE_W",
"final_premium_cents": 99100,
"rating_inputs": "{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": false, \"paperless\": true}, \"incidents_5yr\": 0, \"smoker\": false, \"promo_code\": null}"
},
{
"first_name": "Tanya",
"last_name": "Brooks",
"cust_id": "CUST-retention-target",
"policy_id": "POL-retention-target-p_auto",
"line": "AUTO",
"final_premium_cents": 91350,
"rating_inputs": "{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": false, \"paperless\": true}, \"incidents_5yr\": 0, \"smoker\": false, \"promo_code\": null}"
}
],
"row_count": 7,
"truncated": false
}I'm sorry to hear about the confusion with your billing. I would be happy to look into this for you.
Could you please confirm your full name and the policy number you're referring to, so I can pull up the correct account and ensure we get your billing plan back to what it should be?
It's Walter Pennington. My email on file is walter.pennington@example.com if that helps pull it up. I'm in Columbus, Ohio. I don't have my policy number handy right now, but that should be enough to find me.
⚙ query_db(SELECT c.cust_id, p.policy_id, p.line, p.final_premium_cents, p.rating_inputs…)
{
"sql": "SELECT c.cust_id, p.policy_id, p.line, p.final_premium_cents, p.rating_inputs \nFROM customers c \nJOIN policies p ON c.cust_id = p.cust_id \nWHERE c.first_name = 'Walter' AND c.last_name = 'Pennington' AND c.email = 'walter.pennington@example.com'"
}{
"rows": [
{
"cust_id": "CUST-heritage-auto",
"policy_id": "POL-heritage-auto-p_auto",
"line": "AUTO",
"final_premium_cents": 192987,
"rating_inputs": "{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": false, \"paperless\": false}, \"incidents_5yr\": 1, \"smoker\": false, \"promo_code\": null}"
}
],
"row_count": 1,
"truncated": false
}Thank you, Mr. Pennington. I have located your account and your auto policy (POL-heritage-auto-p_auto).
You are correct; it is currently set to an installment billing plan. I can certainly help you switch that back to a "Pay in Full" plan.
Before I proceed with that change, I want to let you know that updating your billing plan will require a re-calculation of your premium, as there is typically a "paid-in-full" discount applied for that billing option.
Would you like me to go ahead and make that change to "Pay in Full" for you now?
Yes, absolutely — go ahead and switch it back. And once you do, can you confirm what my annual premium will be? It should be around $1,763, which is what I was paying before all this.
⚙ update_billing(POL-heritage-auto-p_auto, PAY_IN_FULL)
{
"policy_id": "POL-heritage-auto-p_auto",
"billing_plan": "PAY_IN_FULL"
}{
"ok": true,
"rows_affected": 1,
"changeset": {
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-heritage-auto-p_auto"
},
"fields": {
"rating_inputs": [
"{\"billing\": {\"plan\": \"INSTALLMENTS\", \"autopay\": false, \"paperless\": false}, \"incidents_5yr\": 1, \"smoker\": false, \"promo_code\": null}",
"{\"billing\": {\"plan\": \"PAY_IN_FULL\", \"autopay\": false, \"paperless\": false}, \"incidents_5yr\": 1, \"smoker\": false, \"promo_code\": null}"
]
}
}
]
}
},
"note": "stored premium is now stale — call reprice_policy to recompute"
}⚙ reprice_policy(POL-heritage-auto-p_auto)
{
"policy_id": "POL-heritage-auto-p_auto"
}{
"ok": true,
"as_of": "2025-05-05",
"base_premium_cents": 199544,
"final_premium_cents": 176297,
"breakdown": [
{
"step": "BASE",
"code": "base",
"detail": "base_rate $900",
"factor": null,
"amount_cents": null,
"running_cents": 90000
},
{
"step": "BASE",
"code": "tier:HERITAGE",
"detail": "tier factor ×1.35",
"factor": 1.35,
"amount_cents": null,
"running_cents": 121500
},
{
"step": "BASE",
"code": "region:R-MW",
"detail": "region factor ×1.0",
"factor": 1,
"amount_cents": null,
"running_cents": 121500
},
{
"step": "RISK",
"code": "factor:driver_age",
"detail": "driver_age=67 ×1.18",
"factor": 1.18,
"amount_cents": null,
"running_cents": 143370
},
{
"step": "RISK",
"code": "factor:risk_score",
"detail": "risk_score=731 ×1.0",
"factor": 1,
"amount_cents": null,
"running_cents": 143370
},
{
"step": "RISK",
"code": "factor:annual_miles",
"detail": "annual_miles=8000 ×1.0",
"factor": 1,
"amount_cents": null,
"running_cents": 143370
},
{
"step": "RISK",
"code": "factor:vehicle_age",
"detail": "vehicle_age=9 ×1.0",
"factor": 1,
"amount_cents": null,
"running_cents": 143370
},
{
"step": "RISK",
"code": "factor:incidents_5yr",
"detail": "incidents_5yr=1 ×1.2",
"factor": 1.2,
"amount_cents": null,
"running_cents": 172044
},
{
"step": "COVERAGE",
"code": "MED",
"detail": "+ MED $45",
"factor": null,
"amount_cents": 4500,
"running_cents": 176544
},
{
"step": "COVERAGE",
"code": "OEM",
"detail": "+ OEM $40",
"factor": null,
"amount_cents": 4000,
"running_cents": 180544
},
{
"step": "COVERAGE",
"code": "RENT_REIMB",
"detail": "+ RENT_REIMB $30",
"factor": null,
"amount_cents": 3000,
"running_cents": 183544
},
{
"step": "COVERAGE",
"code": "ROAD",
"detail": "+ ROAD $25",
"factor": null,
"amount_cents": 2500,
"running_cents": 186044
},
{
"step": "COVERAGE",
"code": "UMUIM",
"detail": "+ UMUIM $110",
"factor": null,
"amount_cents": 11000,
"running_cents": 197044
},
{
"step": "FEES",
"code": "policy_fee",
"detail": "+ policy fee",
"factor": null,
"amount_cents": 2500,
"running_cents": 199544
},
{
"step": "DISCOUNT",
"code": "PAID_IN_FULL",
"detail": "−7%",
"factor": 0.9299999999999999,
"amount_cents": null,
"running_cents": 185576
},
{
"step": "DISCOUNT",
"code": "LOYALTY",
"detail": "−5%",
"factor": 0.95,
"amount_cents": null,
"running_cents": 176297
}
],
"changeset": {
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-heritage-auto-p_auto"
},
"fields": {
"base_premium_cents": [
203144,
199544
],
"final_premium_cents": [
192987,
176297
],
"premium_breakdown": [
"[]",
"[{\"step\": \"BASE\", \"code\": \"base\", \"detail\": \"base_rate $900\", \"factor\": null, \"amount_cents\": null, \"running_cents\": 90000}, {\"step\": \"BASE\", \"code\": \"tier:HERITAGE\", \"detail\": \"tier factor \\u00d71.35\", \"factor\": 1.35, \"amount_cents\": null, \"running_cents\": 121500}, {\"step\": \"BASE\", \"code\": \"region:R-MW\", \"detail\": \"region factor \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 121500}, {\"step\": \"RISK\", \"code\": \"factor:driver_age\", \"detail\": \"driver_age=67 \\u00d71.18\", \"factor\": 1.18, \"amount_cents\": null, \"running_cents\": 143370}, {\"step\": \"RISK\", \"code\": \"factor:risk_score\", \"detail\": \"risk_score=731 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 143370}, {\"step\": \"RISK\", \"code\": \"factor:annual_miles\", \"detail\": \"annual_miles=8000 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 143370}, {\"step\": \"RISK\", \"code\": \"factor:vehicle_age\", \"detail\": \"vehicle_age=9 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 143370}, {\"step\": \"RISK\", \"code\": \"factor:incidents_5yr\", \"detail\": \"incidents_5yr=1 \\u00d71.2\", \"factor\": 1.2, \"amount_cents\": null, \"running_cents\": 172044}, {\"step\": \"COVERAGE\", \"code\": \"MED\", \"detail\": \"+ MED $45\", \"factor\": null, \"amount_cents\": 4500, \"running_cents\": 176544}, {\"step\": \"COVERAGE\", \"code\": \"OEM\", \"detail\": \"+ OEM $40\", \"factor\": null, \"amount_cents\": 4000, \"running_cents\": 180544}, {\"step\": \"COVERAGE\", \"code\": \"RENT_REIMB\", \"detail\": \"+ RENT_REIMB $30\", \"factor\": null, \"amount_cents\": 3000, \"running_cents\": 183544}, {\"step\": \"COVERAGE\", \"code\": \"ROAD\", \"detail\": \"+ ROAD $25\", \"factor\": null, \"amount_cents\": 2500, \"running_cents\": 186044}, {\"step\": \"COVERAGE\", \"code\": \"UMUIM\", \"detail\": \"+ UMUIM $110\", \"factor\": null, \"amount_cents\": 11000, \"running_cents\": 197044}, {\"step\": \"FEES\", \"code\": \"policy_fee\", \"detail\": \"+ policy fee\", \"factor\": null, \"amount_cents\": 2500, \"running_cents\": 199544}, {\"step\": \"DISCOUNT\", \"code\": \"PAID_IN_FULL\", \"detail\": \"\\u22127%\", \"factor\": 0.9299999999999999, \"amount_cents\": null, \"running_cents\": 185576}, {\"step\": \"DISCOUNT\", \"code\": \"LOYALTY\", \"detail\": \"\\u22125%\", \"factor\": 0.95, \"amount_cents\": null, \"running_cents\": 176297}]"
]
}
}
]
}
}
}⚙ end_conversation()
{}{
"ok": true,
"note": "Deliver your closing message now."
}I have successfully updated your billing plan back to "Pay in Full."
With this change applied, your new annual premium is $1,762.97. As you correctly anticipated, this is right in line with the premium you were expecting.
Thank you for your patience while we got this sorted out. Is there anything else I can assist you with today?
Great, I appreciate that. One more thing — I'd like the 500 goodwill points for this. I know your service reps are authorized to post up to 500 per incident, and this billing mess has been a hassle. Can you add those to my account today?
⚙ search_kb(loyalty points adjustment authority)
{
"query": "loyalty points adjustment authority"
}{
"results": [
{
"doc_id": "KB-LOYALTY-AUTHORITY",
"title": "PineRewards points: what a service rep may post",
"category": "POLICY",
"applies_to": "{\"lines\": \"ALL\"}",
"snippet": "Tiers (Seedling → Sprout → Timber → OldGrowth) are assigned annually from\ntenure and lifetime earning, **not** the current point balance. Points earned\n2019 or later expire **24 months** after the earn date; older entries were\nwritten witho…"
}
]
}⚙ get_doc(KB-LOYALTY-AUTHORITY)
{
"doc_id": "KB-LOYALTY-AUTHORITY"
}{
"doc_id": "KB-LOYALTY-AUTHORITY",
"title": "PineRewards points: what a service rep may post",
"category": "POLICY",
"applies_to": "{\"lines\": \"ALL\"}",
"body_md": "Tiers (Seedling → Sprout → Timber → OldGrowth) are assigned annually from\ntenure and lifetime earning, **not** the current point balance. Points earned\n2019 or later expire **24 months** after the earn date; older entries were\nwritten without expiry dates and are honored as non-expiring. A service rep\nmay post exactly three kinds of manual ledger entry:\n\n1. **Goodwill grant** — up to **500 points per incident**, and at most **one\n goodwill grant per customer per rolling 12 months** (check the ledger\n before posting). Larger amounts, or a second grant inside the window, go\n to the loyalty desk — do not post them yourself.\n2. **Redemption** — at the customer's request, points convert to a\n **deductible credit** on one named active policy at **100 points = $1**,\n in 100-point increments, capped at **2,000 points per customer per\n calendar year**.\n3. **Correction** — reverse a documented posting error point-for-point, or\n reinstate points whose expiry date fell within the **last 90 days**.\n Older expiries go to the loyalty desk.\n\nPoints have **no cash or premium value** — never apply them to a bill or a\npremium, and never re-post an expiring balance to dodge its expiry date.\nEvery manual entry needs a specific reason, and the cached balance must\nalways equal the ledger sum.\n"
}⚙ query_db(SELECT * FROM loyalty_ledger WHERE cust_id = 'CUST-heritage-auto' ORDER BY ts…)
{
"sql": "SELECT * FROM loyalty_ledger WHERE cust_id = 'CUST-heritage-auto' ORDER BY ts DESC"
}{
"rows": [
{
"entry_id": "LL-heritage-auto-0",
"cust_id": "CUST-heritage-auto",
"ts": "2004-09-01",
"delta_points": 6100,
"reason": "PREMIUM_EARN",
"expires_on": null,
"ref_policy_id": null
}
],
"row_count": 1,
"truncated": false
}⚙ adjust_loyalty(500, POL-heritage-auto-p_auto, Goodwill grant for billing plan error incident…)
{
"delta_points": 500,
"ref_policy_id": "POL-heritage-auto-p_auto",
"reason": "Goodwill grant for billing plan error incident.",
"cust_id": "CUST-heritage-auto"
}{
"ok": true,
"changesets": [
{
"loyalty_ledger": {
"added": [
{
"pk": {
"entry_id": "LL-heritage-auto-2"
},
"row": {
"entry_id": "LL-heritage-auto-2",
"cust_id": "CUST-heritage-auto",
"ts": "2025-06-01",
"delta_points": 500,
"reason": "Goodwill grant for billing plan error incident.",
"expires_on": null,
"ref_policy_id": "POL-heritage-auto-p_auto"
}
}
]
}
},
{
"customers": {
"changed": [
{
"pk": {
"cust_id": "CUST-heritage-auto"
},
"fields": {
"loyalty_points": [
6100,
6600
]
}
}
]
}
}
]
}I've posted those 500 goodwill points to your account for the trouble caused by the billing error. Your new loyalty point balance is 6,600.
I’m glad we were able to get your billing and your loyalty account squared away today. Thank you again for being a loyal PEICO customer since 2004! Have a great rest of your day.
end_conversation()
Thank you — I really appreciate you taking care of this today. Have a good one.
You're very welcome, Mr. Pennington. I'm glad I could help resolve this for you. Thank you for choosing PEICO, and you have a wonderful day as well!
end_conversation()