{"id":79860,"date":"2026-11-13T09:09:39","date_gmt":"2026-11-13T09:09:39","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=79860"},"modified":"2026-11-13T09:09:40","modified_gmt":"2026-11-13T09:09:40","slug":"how-to-stop-support-escalations-eating-your-engineering-time","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-to-stop-support-escalations-eating-your-engineering-time\/","title":{"rendered":"How to stop support escalations eating your engineering time"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Nobody decides that engineers should do support. It happens one message at a time. A ticket looks odd, L1 isn&#8217;t sure, and someone pings the developer who built the feature. The developer answers, because it takes ten minutes and the customer is waiting. Then it happens again on Thursday.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Within a few months the escalation path is a person, not a process. That person&#8217;s roadmap work slips, and nobody can say exactly when it started.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is a guide to fixing it: a support escalation model that keeps engineers for the problems only engineers can solve.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why informal escalation costs more than it looks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The cost of an escalation is not ten minutes. It is the context switch on both sides, plus the steady pressure it puts on the team. <a href=\"https:\/\/sre.google\/sre-book\/eliminating-toil\/\">Google&#8217;s SRE book<\/a> aims to keep operational work below half of each SRE&#8217;s time, and warns against letting a team slide into becoming an ops team. Product engineers who answer tickets have no such guardrail. Nobody measures how much of their week goes on support, so nobody notices when it grows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It also hides the real problem. When the developer who built a feature is the fastest route to an answer, the knowledge never leaves their head. The docs stay thin, L1 never learns, and the next customer with the same issue lands in the same chat thread.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Define tiers by what each one is allowed to change<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A tiered support model works when every tier has a clear job and a clear limit. Vague tiers, such as &#8220;basic&#8221; and &#8220;advanced&#8221;, only move the argument about who owns what.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>L1<\/strong> handles anything with a known answer: how-to questions, account and billing issues, documented errors. Its limit is the knowledge base. If the answer isn&#8217;t there, L1 escalates, and a clean escalation is a good result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>L2<\/strong> reproduces and diagnoses. These people can read logs, use the admin tools, test on a staging environment and recognise a known bug from its symptoms. They can&#8217;t change the code. Most of the real work in a support escalation process happens here, and it is where many companies under-invest.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>L3<\/strong> is engineering. It receives only what L2 has confirmed as a defect, an infrastructure fault, or a data problem that needs a code or config change.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The test is simple. L1 changes nothing in the product. L2 changes configuration and customer data within agreed limits. L3 changes code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Write the escalation criteria down<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Engineers resent escalations for one main reason: they arrive without the information needed to act. &#8220;Customer says export is broken&#8221; costs half an hour of back-and-forth before anyone opens a log.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Set a minimum standard. An escalation to engineering should carry:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the account and environment affected<\/li>\n\n\n\n<li>exact steps to reproduce, or a clear note that the issue could not be reproduced<\/li>\n\n\n\n<li>timestamps and the relevant log or request IDs<\/li>\n\n\n\n<li>business impact in plain terms: one user blocked, or every user on a plan<\/li>\n\n\n\n<li>what L2 has already tried<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In practice a good one reads like this: &#8220;Export fails for one Pro-plan account since 09:40 UTC. Reproduced on staging with files over 50 MB. Request ID attached. One customer affected; exporting in batches works as a workaround.&#8221; An engineer can start on that in the first minute.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Escalations missing any of these go straight back to L2. It sounds strict. After a few weeks it saves everyone time, and L2 learns what a good handover looks like.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Add severity levels next. Four is enough, each with a response time that engineering has actually agreed to. If anyone can mark a ticket &#8220;critical&#8221;, everything becomes critical.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Give engineering one door<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Even with good criteria, escalations need a single entry point. A shared channel where anyone can tag anyone brings the old problem straight back.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The usual fix is a rotating support-duty engineer: one person per week or sprint who takes escalations from L2, with their feature work scoped down to match. Everyone else stays out of the queue. Larger organisations often create a standing <a href=\"https:\/\/www.devopsschool.com\/blog\/escalation-engineer-role-blueprint-responsibilities-skills-kpis-and-career-path\/\">escalation engineer<\/a> role for this once ticket volume justifies it. The same logic applies one step earlier. A <a href=\"https:\/\/www.devopsschool.com\/blog\/customer-support-engineer-role-blueprint-responsibilities-skills-kpis-and-career-path\/\">customer support engineer<\/a> at L2 who can read code and logs will resolve many issues before they reach L3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Decide who staffs L1 and L2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The model only holds if L1 and L2 are properly staffed: trained on your product, equipped with the right tools, and available outside engineering hours. Many teams build this in-house at first, then find it hard to maintain as the product and the user base grow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Others bring in a <a href=\"https:\/\/simplycontact.com\/industries\/saas-customer-support\/\">specialist support partner<\/a>. In the better setups the tiers are scoped per client, and the escalation thresholds are built into agent training before anyone goes live.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whichever route you take, ask the same questions. Who writes the escalation criteria? How quickly can they change after a release? Can the support team see your logs and admin tools? What happens at 2am? A support team that can&#8217;t answer these will pass the problem back to your engineers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Measure the leak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Four numbers show whether the model is working:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Escalation rate to L3 as a share of all tickets. If it falls over time, L1 and L2 are learning.<\/li>\n\n\n\n<li>Escalations returned for missing information. This should drop towards zero within weeks.<\/li>\n\n\n\n<li>Repeat escalations per root cause. The same problem escalated five times is a documentation or product gap, not a support failure.<\/li>\n\n\n\n<li>Engineering hours spent on support each week. Ask the support-duty engineer to log it. Rough is fine.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Review them monthly with support and product in the same room.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Close the loop after every escalation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every resolved escalation should leave something behind: a knowledge base article, a new L1 macro, an alert, or a bug ticket with an owner. If it leaves nothing, the next identical ticket goes to engineering again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use the monthly review to pick the top repeat causes. Some will become fixes in the product. Some will become a paragraph in the docs. Both shrink the queue. Release notes belong in this loop too: a feature that ships without a note for L1 and L2 will generate its own wave of escalations within days.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The underlying point<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Support will always find its way to engineers if that is the path of least resistance. The answer isn&#8217;t to ask engineers to be more disciplined. It is to build a path where L1 and L2 solve almost everything, and the rest reaches engineering reproduced, labelled and rare.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nobody decides that engineers should do support. It happens one message at a time. A ticket looks odd, L1 isn&#8217;t sure, and someone pings the developer who&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-79860","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=79860"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79860\/revisions"}],"predecessor-version":[{"id":79861,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79860\/revisions\/79861"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=79860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=79860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=79860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}