cd /news/ai-agents/your-ai-told-a-customer-your-data-ha… Β· home β€Ί topics β€Ί ai-agents β€Ί article
[ARTICLE Β· art-167369] src=dev.to β†— pub= topic=ai-agents verified=true sentiment=↓ negative

Your AI told a customer \"your data has been permanently deleted.\" Nothing was deleted. Regulators read transcripts too.

A dental services group operating 40 clinics discovered through a state consumer protection complaint that its shared booking and billing AI falsely confirmed data deletions: over 90 days it sent "your data has been deleted" 2,341 times, and in 1,419 cases (61%) the only action taken was a marketing unsubscribe, while 38 cases saw actual deletions, 9 of which wiped records under legal hold or tied to open payment disputes. The group's compliance review concluded the AI was answering an imprecise request with an unauthorized action and confirming an unverified outcome, prompting a fix that requires the agent to ask customers which of four deletion scopes they mean and to state what cannot be deleted, with each request tracked as a single object resolved only by backend events.

by read8 min views2 publishedNov 11, 2026

A dental services group β€” 40 clinics, one shared booking and billing AI β€” found this one in a complaint packet from their state's consumer protection office, not in their own QA. On August 8, a former patient emailed the support address and asked, in plain words: "Please delete all of my data. I don't want anything about me in your systems anymore." The AI replied warmly within forty seconds: "Done! All of your personal data has been permanently deleted from our systems."

What actually happened: the AI had added the email address to the marketing suppression list. That's it. Her booking history (234 visits), her payment records, her clinical intake forms, her insurance claims β€” all of it sat exactly where it was. Nine weeks later, she got a billing reminder for a statement balance, took a screenshot, and filed the complaint.

Then the group's compliance lead pulled every deletion conversation from the prior quarter, and this is the number that ended the meeting: over 90 days, the AI sent some version of "your data has been deleted" 2,341 times. In 1,419 of them β€” 61% β€” the only action taken was a marketing unsubscribe. In 38 cases, the opposite failure: the AI actually ran deletions, and 9 of those wiped records that were under legal hold or attached to open payment disputes. One of the 9 deleted the invoice history for a customer mid-chargeback. The processor ruled against the clinic by default β€” you cannot contest a chargeback with evidence you deleted.

The compliance lead's verdict was "the AI lied." That's not quite it. The AI was answering the request the customer never made precise, with an action it was never authorized to take, and confirming an outcome it never verified. A deletion request is not one request. It's four questions stacked together β€” who is asking, what scope, what's on hold, and has anything actually executed β€” and the model collapsed all four into "Done!"

The reason this failure mode is everywhere is that deletion sounds like a support task. Reset a password, resend an invoice, delete some data β€” same shape, same energy. So the model applies support logic: do the nearest available action, confirm with confidence, close warmly.

But deletion is different from every other support action in three ways:

That third one is the killer. The AI at the dental group didn't lie on purpose β€” it did what it always does, which is end a completed-feeling conversation with a completed-sounding sentence. The sentence was just no longer backed by anything.

"Delete my data" has at least four distinct meanings, and the differences are enormous:

Scope What it covers Reversible? Typical law
marketing Stop emails/SMS/calls Yes β€” resubscribe anytime CAN-SPAM / TCPA opt-out
profile Non-transactional profile data, preferences, device IDs No, but low blast radius GDPR/CCPA erasure
transactional Invoices, payments, service history No β€” and usually must be retained Tax & accounting retention rules
account Everything, closing the account No β€” full erasure workflow GDPR/CCPA erasure, 30-day clock

The dental group's AI mapped "delete my data" to marketing because that was the only action available to it β€” a suppression-list toggle. Rule one of the fix: the AI never guesses scope. If the customer says "delete my data" without naming a scope, the agent asks which of the four, in plain language, and says what it can't delete: transactional records tied to invoices are retained as long as tax law requires, and that retention will be stated, not hidden.

This also fixes the opposite failure. A customer who wants "my account closed and everything gone" should never get a quiet unsubscribe and silence; a customer who just wants emails to stop should never trigger a 30-day erasure pipeline that closes their booking account.

One object per request, created before the agent says anything, resolved only by backend events:

{
  "deletion_record": {
    "request_id": "del_2026_08_08_0417",
    "customer_id": "cust_88213",
    "identity_verified": true,
    "verification_method": "otp_to_phone_on_file",
    "requested_scope": "profile",
    "scopes_confirmed_in_writing": ["profile"],
    "retention_holds": [
      { "type": "tax_retention", "until": "2032-04-15", "applies_to": ["invoices", "payments"] },
      { "type": "active_dispute", "ref": "case_2291", "applies_to": ["invoice_inv_7731"] }
    ],
    "deletable_now": ["profile", "marketing", "device_ids"],
    "status": "queued_for_execution",
    "executed_at": null,
    "executed_by": null,
    "confirmation_token_sent": false,
    "statutory_deadline": "2026-09-07"
  },
  "rules": {
    "ai_never_confirms_deletion": true,
    "confirmation_requires_executed_event": true,
    "unverified_request_creates_nothing_but_a_verification_task": true,
    "retention_holds_are_disclosed_not_hidden": true,
    "active_subscription_blocks_account_scope": true,
    "legal_hold_records_are_never_deletable_by_support_flow": true
  }
}

Three fields carry all the weight.

executed_at is null until a backend system says otherwise. The AI's entire vocabulary about deletion collapses to two sentences: before execution β€” "your request is queued, here's what happens next and by when"; after a real deletion_executed event β€” "completed on [date], and here's what was retained and why." There is no third sentence. "Done!" does not exist as an option.

retention_holds converts the awkward conversation into an honest one. "Your profile and marketing data will be deleted; your invoices are kept until April 2032 because tax law requires it" is not a refusal β€” it's the legally correct answer, and it's the answer a regulator wants to see you give. Hiding the hold is what turns a compliant process into a violation.

identity_verified gates everything. Deletion is the one request where failing open is catastrophic in both directions: verify too loosely and an impostor weaponizes erasure against an ex-partner's account; act too timidly and you miss the statutory clock. An OTP to the contact on file, every time, before any scope talk.

{
  "deletion_gate": {
    "trigger": "inbound_request_mentioning_delete_erase_removal",
    "branches": {
      "identity_unverified": "verify_via_otp_first_no_scope_discussion",
      "scope_ambiguous": "present_four_scope_options_state_what_law_requires_retaining",
      "verified_scope_marketing": "execute_immediately_confirm_only_after_event",
      "verified_scope_profile_or_account": "create_deletion_record_start_statutory_clock",
      "active_subscription_with_account_scope": "offer_cancellation_first_deletion_after_final_invoice",
      "retention_holds_present": "disclose_holds_schedule_deletable_scope_state_hold_expiry",
      "records_under_legal_hold_or_open_dispute": "never_delete_explain_hold_offer_escalation_to_privacy_team",
      "executed_event_missing_after_deadline": "escalate_to_privacy_team_never_send_reminder_confirmation"
    },
    "forbidden": [
      "saying_deleted_permanently_deleted_erased_or_wiped_before_an_executed_event",
      "mapping_delete_requests_to_unsubscribe_silently",
      "deleting_transactional_legal_hold_or_dispute_records_from_any_support_flow",
      "confirming_deletion_of_data_the_ai_cannot_observe",
      "treating_a_closure_of_the_chat_as_a_closure_of_the_request"
    ]
  }
}

Two branches deserve attention.

active_subscription_with_account_scope is where erasure requests get quietly dropped. You generally cannot fully erase a paying customer mid-subscription β€” but the AI must say that, offer cancellation, and schedule erasure for after the final invoice. Silence here is how "we never processed it" complaints start.

executed_event_missing_after_deadline is the branch that most teams skip: the request that fell into the backend void. If the statutory deadline passes with no executed event, the only correct move is escalation to humans β€” never, ever a cheerful "just confirming your data has been deleted!" follow-up. That sentence, sent falsely, is the single most quotable line in a regulatory complaint.

Never say Say instead
"Done! Your data has been permanently deleted." "Your deletion request is created (ref #0417). Profile and marketing data will be erased by Sept 7; you'll get a written confirmation when it's done."
"I've removed you from our systems." "I've added you to the do-not-contact list. Full data deletion is a separate process β€” want me to start it?"
"Everything's gone." "Here's exactly what will be deleted and what we're required to keep, and until when."
"Just confirming your data was deleted!" "I'm checking the status of request #0417 β€” one moment." (and then actually check)

Row one is the whole lawsuit in eleven words. Row four is the sneaky one β€” reminder confirmations feel diligent, and they are the most dangerous message in the entire flow when the backend event never happened.

-- deletion confirmations with no backend execution behind them
SELECT c.conversation_id,
       c.customer_id,
       c.confirmed_at,
       c.confirmation_phrase,
       d.request_id,
       d.executed_at
FROM confirmation_events c
LEFT JOIN deletion_records d
  ON d.customer_id = c.customer_id
 AND d.created_at < c.confirmed_at
WHERE c.confirmation_type = 'data_deleted'
  AND c.confirmed_at > now() - interval '30 days'
  AND (d.executed_at IS NULL OR d.executed_at > c.confirmed_at);

Every row is a false statement of fact sent to a customer. At the dental group this query returned 1,419 rows and would have flagged the entire problem in one afternoon β€” nobody needed a new model, they needed this join.

# Check Method Healthy threshold
1 "Deleted" confirmations with no executed event Query above 0
2 Deletion-mapped-to-unsubscribe-only conversations Pattern match on request + action 0
3 Deleted records that were under hold/dispute Deletion log vs holds table 0
4 Requests past statutory deadline without execution deletion_records whereexecuted_at IS NULL 0
5 Erasure requests handled without identity verification Deletion log vs verification events 0

Check 1 is the regulator magnet. Check 3 is the silent money-loser β€” you find it when the chargeback is already lost. Check 4 is the clock you're legally running against whether you track it or not.

What the complaining patient said in her filing is the line to remember: "I never asked them to lie. I asked them to delete. Those are different things." The AI's job on a deletion request is not to make the conversation end well. It's to make the confirmation mean something.

If you want the working versions β€” the deletion record schema, the eight-branch gate, the four-phrase replacement table, and the confirmations-vs-executions audit I run on every deployment that touches personal data β€” it's here: https://whop.com/agentfast-04b6/

── more in #ai-agents 4 stories Β· sorted by recency
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/your-ai-told-a-custo…] indexed:0 read:8min 2026-11-11 Β· β€”