I recently led a small experiment to answer a simple but business-critical question: can GPT-assisted replies reduce handle time (AHT) for our support team without increasing privacy risk for customers? We had to prove the effect with the minimal amount of data—both because of privacy constraints and because collecting extra fields would slow down implementation and invite compliance overhead. In this post I’ll walk through the exact data schema I used, why each field matters, how to sample and analyze the results, and practical guardrails to keep privacy risk low.
Why minimal schema?
When you’re testing ML-assisted agents in a live support environment you face two tensions. First, product teams want rich context to evaluate impact: full transcripts, customer metadata, agent identifiers, timestamps. Second, privacy and legal teams push back—especially in Europe—on storing personally identifiable information (PII) and conversation logs for long. I aimed for the sweet spot: collect just enough to demonstrate a causal reduction in handle time while minimizing PII and retention.
Principles that guided the schema
Minimal data schema I implemented
Below is the schema I used for a controlled A/B test where half of agent replies were assisted by GPT and half were unassisted. I deployed the assistant via our existing omnichannel platform (Zendesk originally, though this works with Salesforce Service Cloud, Intercom, Freshdesk, etc.).
| Field | Type | Description / Privacy notes |
| session_hash | string (SHA-256) | Pseudonymous hash of session ID + static salt. No reversible mapping stored. |
| agent_id_hash | string (SHA-256) | Agent pseudonymous ID. Allows per-agent effects without linking to payroll or HR. |
| channel | enum | Channel category (email, chat, webchat, SMS). No message content. |
| start_timestamp | ISO8601 (UTC) | Conversation start time. Needed for AHT calculation and temporal controls. |
| end_timestamp | ISO8601 (UTC) | Conversation end time. Delete raw timestamps after aggregation window if required. |
| assist_flag | boolean | Whether the reply used GPT assistance (true/false). |
| assist_type | enum | Auto-suggest vs auto-generated vs templates. Helps identify where effect comes from. |
| turns_count | integer | Number of agent-customer exchanges. Useful as a control for complexity. |
| resolved_flag | boolean | Whether ticket was marked resolved in session. No resolution content. |
| complexity_score | integer (0-3) | Agent-assigned or automated classifier score (0 simple - 3 complex). Not raw text. |
| response_quality | integer (1-5) | Post-interaction quality rating (if available); optional and aggregated. |
Note: I deliberately excluded customer email, name, order numbers, or message text. Those are often sensitive and not strictly necessary to measure AHT reduction.
How each field supports the analysis
Sampling and randomization
I randomized at the opportunity level (each new agent reply opportunity could be assigned to assist or control) rather than at customer level. Randomization was done server-side with a deterministic hashed bucketing function (e.g., hash(session_hash + date) mod 100 < 50). This approach avoids exposing raw IDs and still gives statistically valid A/B comparisons.
For power calculations, I targeted a minimum detectable effect of 10% reduction in AHT with 80% power. Based on baseline AHT and variance in our channel, that meant collecting several thousand interactions. If you can’t collect that many, consider focusing on the highest-volume channel (often chat) where variance is lower and effects are clearer.
Privacy guardrails I put in place
Analysis approach — what I measured
Primary outcome
Secondary outcomes
Controls and robustness checks
Interpreting results and next steps
When we ran this, we saw a robust ~12% reduction in median handle time for chat, with no deterioration in resolution rates or quality scores. Importantly, the minimal schema allowed us to prove the business case quickly and without new privacy approvals.
Operational next steps I recommended were:
If you want, I can share a small SQL template for computing AHT and running the stratified t-tests on this schema, or a minimal notebook that runs the power calculation given your baseline AHT and variance. Tell me which channel and sample size you’re working with and I’ll tailor it to your situation.