{"id":4436,"date":"2026-11-08T14:35:00","date_gmt":"2026-11-08T14:35:00","guid":{"rendered":"https:\/\/dataopsschool.com\/blog\/?p=4436"},"modified":"2026-11-08T14:35:00","modified_gmt":"2026-11-08T14:35:00","slug":"data-request-ticket-diagnosis","status":"publish","type":"post","link":"https:\/\/dataopsschool.com\/blog\/data-request-ticket-diagnosis\/","title":{"rendered":"Why Data Requests Bounce and the One-Page Brief That Fixes Them"},"content":{"rendered":"<p>Every data team recognises the ticket that reads &#8220;need numbers for the board deck.&#8221; Three days later a table arrives, the requester says it is not what they meant, and the cycle restarts with a bit less goodwill on each side. The fault is rarely carelessness. The request itself was underspecified, and no one at either end had a template that forced the missing details into the open. This post diagnoses the usual failure modes in data requests and proposes a compact written brief as the remedy, aimed at analysts, engineers and the stakeholders who depend on them.<\/p>\n<h2>The problem: a request that cannot be completed, only guessed at<\/h2>\n<p>A data request is a small contract. Someone needs an output, someone else produces it, and both assume the same finish line. When the contract is verbal or a single sentence, the producer fills gaps with plausible guesses. Some guesses are right. The wrong ones surface late, usually in front of an audience.<\/p>\n<p>Symptoms are consistent across companies:<\/p>\n<ul>\n<li>The same ticket is reopened several times with the comment &#8220;not quite.&#8221;<\/li>\n<li>Engineers spend the first hour of each task asking who will use the output and for what.<\/li>\n<li>Two analysts handed the same sentence deliver tables that disagree.<\/li>\n<li>Requesters stop filing tickets and message people directly, which removes any record of what was asked.<\/li>\n<li>Deadlines are discovered after the fact, so urgent and routine work are indistinguishable in the queue.<\/li>\n<\/ul>\n<h2>Diagnosis: five missing elements<\/h2>\n<p>When you audit a batch of reopened tickets, the same five omissions appear again and again. Treat the list as a diagnostic: the more of these missing from a ticket, the more likely it will bounce.<\/p>\n<h3>1. The purpose is absent<\/h3>\n<p>&#8220;Customer churn by region&#8221; could feed a quarterly review, a retention experiment or a regulatory filing. Each implies different history length, different tolerance for lateness and different rigor. Without the purpose, the producer cannot choose sensible defaults.<\/p>\n<h3>2. The audience and the form of delivery are absent<\/h3>\n<p>A one-time extract for a spreadsheet is a different job from a refreshed table that a dashboard will read each morning. If the output will be recurring, it becomes a pipeline with owners and monitoring, which is a larger piece of work than the requester imagined.<\/p>\n<h3>3. The deadline and its reason are absent<\/h3>\n<p>A date is useful; the reason for the date is better. &#8220;Needed by Thursday because finance locks the pack at noon&#8221; lets the team negotiate a smaller, earlier version. &#8220;ASAP&#8221; lets nobody negotiate anything.<\/p>\n<h3>4. Constraints are absent<\/h3>\n<p>Which columns are sensitive, which sources are off-limits, what freshness is acceptable and which systems may be queried during business hours are all constraints. Discovering them mid-task forces rework.<\/p>\n<h3>5. The acceptance test is absent<\/h3>\n<p>This is the largest gap. Few tickets state how the requester will decide that the output is right. A single sentence, such as &#8220;totals should reconcile with the finance report for last month within a small tolerance,&#8221; converts an opinion contest into a check anyone can run.<\/p>\n<h2>The solution: a one-page brief with fixed headings<\/h2>\n<p>A ticket template with the following headings costs the requester ten minutes and saves the team hours. Keep each field to a sentence or two.<\/p>\n<ol>\n<li><strong>Outcome wanted.<\/strong> The decision or action this data will support.<\/li>\n<li><strong>Consumer.<\/strong> A person, report, model or service, and how it will read the data.<\/li>\n<li><strong>Needed by, and why.<\/strong> Date, time and the event that creates it.<\/li>\n<li><strong>Effort range.<\/strong> How much analyst or engineer time the requester is willing to spend; a rough range is enough.<\/li>\n<li><strong>Constraints.<\/strong> Privacy rules, sources, freshness, volume, tools the consumer can read.<\/li>\n<li><strong>Done looks like.<\/strong> The check the requester will run and the sample rows they expect to see.<\/li>\n<li><strong>Afterwards.<\/strong> One-off, or recurring with a named owner?<\/li>\n<\/ol>\n<p>Notice that no heading asks for technical design. The brief describes the need; the data team replies with an approach, which may differ from what the requester pictured.<\/p>\n<h2>How the brief changes the engineering conversation<\/h2>\n<p>Once the acceptance check is written, tests follow naturally. A team that already validates its tables will find it easy to turn that sentence into an assertion; the walkthrough on <a href=\"https:\/\/dataopsschool.com\/blog\/great-expectations-for-data-validation-in-dataops-a-practical-guide\/\">writing data validation rules in a DataOps workflow<\/a> shows how such checks are expressed in code. Likewise, if the requested output is a derived table, the stated consumer tells you whether it belongs in a modelled layer. A piece such as <a href=\"https:\/\/dataopsschool.com\/blog\/master-data-transformations-with-dbt-in-modern-dataops-pipelines\/\">building reliable transformations with dbt<\/a> describes how teams keep derived tables maintainable, and the &#8220;Afterwards&#8221; field tells you if this request deserves that treatment.<\/p>\n<p>When the answer to &#8220;Afterwards&#8221; is &#8220;recurring,&#8221; the brief becomes the first draft of an orchestration requirement: schedule, upstream dependencies, failure behavior and owner. For teams that schedule jobs through a workflow engine, reading <a href=\"https:\/\/dataopsschool.com\/blog\/how-dagster-brings-order-to-your-data-chaos\/\">how an orchestrator organises messy data jobs<\/a> helps decide whether the request belongs there.<\/p>\n<h2>A worked example, before and after<\/h2>\n<p><strong>Original ticket:<\/strong> &#8220;Can you pull order data for last year, we need it for planning.&#8221;<\/p>\n<p><strong>Rewritten brief:<\/strong><\/p>\n<ul>\n<li><strong>Outcome wanted:<\/strong> decide next quarter&#8217;s warehouse staffing by site.<\/li>\n<li><strong>Consumer:<\/strong> an operations manager, working in a spreadsheet; no database access.<\/li>\n<li><strong>Needed by:<\/strong> Wednesday noon, because the staffing proposal goes to leadership that afternoon.<\/li>\n<li><strong>Effort range:<\/strong> up to half a day of analyst time; a recurring pipeline is out of scope.<\/li>\n<li><strong>Constraints:<\/strong> no customer names or addresses; cancelled orders excluded; refreshed no later than yesterday.<\/li>\n<li><strong>Done looks like:<\/strong> weekly order totals per site, matching the finance summary within a small tolerance, delivered as one file with a short note describing what was excluded.<\/li>\n<li><strong>Afterwards:<\/strong> one-off; if leadership wants it monthly, a new request will follow.<\/li>\n<\/ul>\n<p>That ticket can be accepted, estimated or politely challenged within minutes. The original could only be guessed at.<\/p>\n<h2>Handling pushback from both sides<\/h2>\n<p>Requesters sometimes say the form is bureaucratic. A reasonable reply is that the form is for them: it protects them from receiving something unusable. Offer a short version for small asks, such as outcome, date and done-check, and reserve the full template for anything that exceeds a defined size or touches sensitive data.<\/p>\n<p>Data teams sometimes treat the brief as a shield against work. Avoid that. If every incomplete ticket is bounced with a form letter, requesters will route around you. Instead, fill in the blanks together during a short call, then paste the result into the ticket.<\/p>\n<h2>When the work goes outside the team<\/h2>\n<p>Not every data task stays in-house. Small companies without a data function often hire a contractor for a dashboard, a migration or a cleanup. The same brief works as the opening message. One place to start is <a href=\"https:\/\/professnow.com\/\">ProfessNow, where visitors pick a profession and a city, scan the profiles shown and send a booking request<\/a>; attaching the brief means the specialist knows the scope before the first call.<\/p>\n<h2>Measuring whether the template works<\/h2>\n<p>Keep it modest. After a month, look at how many tickets were reopened for &#8220;not what I meant&#8221; compared with the month before, and ask the team whether first-hour questions have decreased. You do not need a dashboard; a tally in the ticket tool is enough. If reopen rates have not moved, inspect the briefs themselves. Usually the done-check is too vague, and a sample row or an expected total will tighten it.<\/p>\n<h2>Summary<\/h2>\n<p>Data requests fail when the finish line is invisible. Diagnose the failure by looking for the five missing elements, apply a one-page brief with fixed headings and make the acceptance check the centrepiece. The effect is practical: fewer reopened tickets, fewer awkward surprises before meetings and a written record that tells everyone what was promised.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reopened data tickets usually trace back to a request with no purpose, deadline or acceptance check. A one-page brief with fixed headings fixes the cycle.<\/p>\n","protected":false},"author":6,"featured_media":4437,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[814],"tags":[],"class_list":["post-4436","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dataops"],"_links":{"self":[{"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/4436","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=4436"}],"version-history":[{"count":1,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/4436\/revisions"}],"predecessor-version":[{"id":4506,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/4436\/revisions\/4506"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4437"}],"wp:attachment":[{"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=4436"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=4436"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=4436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}