Skip to content
8 min read

How an engineering toil ledger finds payroll waste

Build an engineering toil ledger from real deploy fixes, access requests, alerts, and data repairs to rank payroll waste by removal effort.

How an engineering toil ledger finds payroll waste
Table of Contents

Most founders can name their engineering payroll. Far fewer can point to the repeated operational work that quietly consumes a third of it. The money does not appear as one alarming invoice. It arrives as a senior engineer repairing a broken deploy, approving another access request, closing an alert that has fired before, and correcting the same data defect for a customer.

A toil ledger makes that work visible in a form you can fund, challenge, and remove. It is not a timesheet and it is not an invitation to inspect whether individuals worked hard enough. It is a record of recurring system demands, priced in payroll hours and ranked against the work required to eliminate them.

Google's SRE book defines toil as production work that tends to be manual, repetitive, automatable, tactical, without enduring value, and proportional to service growth. That definition is useful because it separates a difficult one-off engineering problem from a routine human patch that the product or operating model keeps demanding.

Founders often respond to repeated operational work in one of two bad ways. They either accept it as the cost of running a business, or they announce that "we need more automation" and ask the team to collect ideas. Neither response creates a decision. A ledger does: it says what happened, how often it happens, who must handle it, what it costs, what removal would take, and what should happen first.

A ledger turns interruptions into an investment queue

An engineering toil ledger is a backlog with a stricter standard of evidence. Every row describes a recurring unit of work that consumed a person's time. It also states the system condition that created the work and the smallest permanent change that could reduce or remove it.

This matters because "our engineers are busy with operations" is too vague to act on. It permits every familiar argument. The head of engineering says the team needs another hire. Finance asks why the cloud bill is not the issue. Product asks why planned features slipped. Each statement may be true, but none identifies the work that displaced the feature.

A usable ledger produces a different conversation:

  • "Two engineers spent 18 hands-on hours this month repairing failed releases caused by mutable environment configuration."
  • "The same work costs roughly $1,800 a month at our loaded internal rate."
  • "A deployment contract check and immutable release configuration should take five engineering days."
  • "If the issue stays at the current rate, the payback is less than two months."

That is an investment case. It still may lose to a customer deadline or a security project, but it can now compete honestly.

Do not turn the ledger into a catalog of everything engineers dislike. Meetings, code review, architectural decisions, customer discovery, and a first serious incident can take time without being toil. Some of that work creates judgment, product knowledge, or a permanent improvement. The ledger is for work that returns in substantially the same shape because the organization has not changed the underlying condition.

There is another distinction that leaders routinely blur: effort spent operating a product is not automatically waste. A payment reversal that needs an authorized reviewer may be an intentional control. A manual production database update because the application has no safe correction path is a design debt. Both use time. Only the second should normally lead to an engineering removal project. Treating them as identical creates unsafe automation and bad priorities.

Record the work while the evidence still exists

A ledger built from quarterly memory becomes political within an hour. The people with the loudest incidents, strongest opinions, or best recall win. Record an entry when someone finishes the task, while the ticket, alert, pull request, terminal history, and affected service are still visible.

The record does not need a new meeting. Put a small form in the ticketing system, incident workflow, or a shared table. Make the form quick enough that an engineer can complete it in two minutes after stabilizing the issue. If the form asks for a mini postmortem, people will skip it. If it only asks for time, people will understate the work and lose the context that explains why it recurs.

Use these fields for every entry:

Date:
Work category:
Service or business process:
Trigger:
What the engineer did:
Hands-on minutes:
People involved:
How often this class occurred in the last 30 days:
Customer or revenue impact, if any:
Likely root condition:
Removal candidate:
Confidence in recurrence estimate: low / medium / high
Evidence reference: ticket, incident, request, or pull request ID

The field "what the engineer did" needs concrete verbs. "Investigated deployment" tells you almost nothing. "Compared environment variables, restored the previous secret value, redeployed the worker, and confirmed queue depth fell" tells you whether the task can become a validation check, an automatic rollback, an ownership fix, or a product change.

Hands-on minutes are the basic unit. Count the time people actively spent reading, deciding, typing, coordinating, checking, or waiting on a call where they could not return to useful work. Do not count the elapsed time of a build, an import, or a vendor queue unless a person had to monitor it. Otherwise slow systems will dominate the ledger even when people were free to do other work.

Record every person pulled into the task. The senior engineer who answers a message for four minutes, the support lead who reproduces the issue, and the on-call engineer who executes the repair all count. The ledger should show the true human cost, not merely the duration assigned to the ticket owner.

Capture the interruption tax separately

A task can be small and still expensive when it breaks concentrated work. Do not pretend you can measure that cost to the minute. Use a simple, visible rule instead.

If a task takes less than 15 minutes but interrupts planned work, add one standard interruption allowance, such as 15 minutes, for each engineer who had to context switch. If the task occurred during an on-call rotation already dedicated to interrupts, do not add it again. You want a repeatable estimate, not theatrical precision.

For example, a four-minute request to add a customer to a feature flag may involve a support manager and an engineer. Record the actual eight person-minutes. If both were pulled away from planned work, add the defined interruption allowance to each. That entry then reflects why a hundred "tiny" requests can consume a week.

The purpose is not to punish teams for helping. It is to expose where the company has built a human API instead of a product capability, a controlled workflow, or clear ownership.

Start with the four work streams that hide best

Deploy fixes, access requests, alert handling, and manual data repairs make a strong first ledger because they leave traces and they recur in recognizable forms. They also cross the line between engineering, support, security, and operations, which is why no one team usually owns the total cost.

Deploy fixes reveal release process debt

A deploy fix includes rollback, rerun, configuration correction, emergency migration repair, manual scaling, release approval chasing, and post-release cleanup. Do not lump all failed deployments together. The useful categories describe the demand:

  • Build or test instability
  • Environment drift or missing configuration
  • Migration and data compatibility failures
  • Release sequencing and dependency failures
  • Manual verification that a pipeline should perform

The popular mistake is to call every release failure "human error" and ask engineers to be more careful. The actual pattern often says the opposite. If a release needs one person who remembers the correct order, the process has stored production knowledge in a human brain. That person may be excellent. The system is still fragile.

Google's SRE material treats release requests, rollbacks, emergency patches, and repeated manual configuration changes as sources of toil. It also argues that automated release work must be applied carefully, because automation can multiply a flawed process instead of fixing it.

Your ledger should therefore carry both the immediate task and the removal type. "Create a script to rerun deploy" is a different proposal from "make release configuration immutable and validate it before promotion." The script may be appropriate as a short-term control. The second option usually has a larger payoff because it eliminates the condition that creates the page.

Access requests often expose a missing product boundary

Access work includes account provisioning, role changes, production access grants, secret sharing, customer workspace corrections, and vendor permission changes. Some access changes require human judgment. A regulated approval, an exceptional administrator grant, or a time-limited break-glass event should have a deliberate human record.

Routine access work is different. If an engineer receives the same request repeatedly because roles are unclear, onboarding is manual, customer administration is missing, or ownership has no definition, your team has built a queue around a predictable operation.

Record the request type, requester role, requested system, approval path, execution path, and whether the requester could safely have completed the action through a controlled self-service flow. Do not mark it "automatable" simply because someone could write a script. A script that bypasses review, leaves permanent permissions, or hides audit history is a security regression.

The removal options tend to fall into four classes: standardized roles, time-bound permissions, self-service administration with policy checks, or a clearer policy that stops invalid requests early. The ledger lets you see which one applies. That is better than asking security to approve a vague project called "automate permissions."

Alert handling needs a recurrence test

The first alert for a new failure mode is not automatically toil. It may demand real diagnosis and lead to an important design change. The third alert with the same symptom, same runbook, and same manual repair deserves a ledger row.

Classify alert work by response, not alert name. "CPU high" is a signal. "Log in, find the stuck tenant job, restart it, and tell support it is complete" is the work that costs payroll. Several alerts can create the same repair. One noisy alert can cause several different actions. Your ledger needs to follow human behavior.

A useful recurrence test asks three questions:

  1. Did the engineer follow roughly the same procedure as last time?
  2. Could a system check, safe remediation, or product change perform that procedure?
  3. Did the prior response make the next occurrence less likely?

If the answers are yes, yes, and no, treat it as a removal candidate. If the response requires a new technical judgment each time, keep collecting evidence before you fund automation.

Do not solve alert volume by simply raising thresholds or deleting notifications. That lowers the ledger by hiding work, not removing it. First decide whether the underlying issue needs prevention, whether the alert needs aggregation, whether the system can repair itself, or whether the service owner needs a clearer operating target.

Manual data repairs point to missing business operations

Manual data repair is easy to rationalize because each request sounds unique. A customer needs a status corrected. A duplicate record blocks an invoice. A failed integration leaves an order half processed. An engineer runs a query, changes rows, and moves on.

The repeated pattern usually sits one level above the database. A business state machine permits impossible transitions. An import has no idempotency. An administrator cannot correct a legitimate customer mistake. A support agent lacks a safe repair action. An integration reports failure without preserving enough information to retry.

The ledger entry must include the business action, not only the SQL command. "Updated five rows" tells a database story. "Restored a paid subscription after an invoice event arrived twice" tells a product story and points toward idempotency, reconciliation, an operator action, or a customer-facing correction flow.

Be strict here. An engineer should not repeatedly operate a production database because product operations have no place to live. Database access is powerful, hard to audit, and usually handled by the people who understand it least well: the person trying to clear the immediate queue.

Price time with a rate people can inspect

Your ledger needs a fully loaded hourly rate for each role group. Use a simple internal model, publish the inputs, and update it when compensation changes materially. The aim is comparable decisions, not accounting perfection.

A practical calculation is:

loaded annual cost = salary + employer taxes + benefits + equipment + allocated management cost
loaded hourly cost = loaded annual cost / productive annual hours
monthly toil cost = total hands-on hours in a month × loaded hourly cost
annualized toil cost = monthly toil cost × 12

Do not use 2,080 hours as productive annual hours if your team spends a meaningful share of time in holidays, meetings, planning, interviews, learning, and coordination. That denominator makes hourly cost look artificially cheap. Pick a conservative internal assumption and apply it to every role.

If you use contractors, include their invoice rate and the internal coordination time they consume. A contractor who takes an hour to repair a deployment may require another half hour from an employee who knows the environment. Hiding the employee contribution is how a seemingly cheap contractor workflow becomes permanent.

Use role bands if individual compensation data is sensitive. For example, you may publish one rate for junior engineers, one for senior engineers, and one for staff or leadership. The exact person matters less than the fact that a senior person repeatedly handles work that a lower-cost workflow, a product control, or an automated system could handle.

There is a second cost that should not be forced into the formula: delayed feature delivery. You can note it as context, especially when a recurring operational task repeatedly displaces a committed launch. Do not manufacture a revenue number unless you can defend it. Payroll cost alone is enough to identify a large amount of work that should not exist.

Rank removal work by payback and operational risk

Turn recurring work into capacity
Oleg works with startup teams worldwide as a fractional CTO and startup advisor.

A raw list sorted by hours is better than nothing, but it leads teams to chase the biggest annoyance. Some work is frequent but cheap to tolerate. Some is modest in volume but repeatedly requires your most expensive engineer during a release or incident.

Use a score with four visible inputs: annual payroll cost, expected reduction, implementation effort, and operational risk. Do not hide judgment inside a magic formula. Leaders should be able to see why an item rose or fell.

Start with these calculations:

recoverable annual cost = annualized toil cost × expected reduction percentage
removal cost = estimated engineering hours × loaded hourly cost
simple payback months = removal cost / (recoverable annual cost / 12)

Then apply a risk modifier in plain language. A task with a three-month payback may still wait if automating it would create unsafe production writes, weaken access controls, or depend on a vendor change you cannot control. Conversely, a task with a longer payback may move forward because it repeatedly puts customers at risk or pulls the only engineer who understands a critical system.

Expected reduction should rarely be 100 percent. A new deployment check may remove most configuration failures but leave legitimate rollback decisions. A self-service permission flow may remove routine requests but retain exception review. Claiming full elimination makes the business case look better today and damages trust later.

A useful weekly ranking table looks like this:

Work itemAnnual payroll costExpected reductionRemoval effortPaybackDecision
Fix mutable release configuration$21,60080%40 hours2.3 monthsFund now
Add routine customer role workflow$12,00070%80 hours6.9 monthsScope and schedule
Restart stuck batch jobs$7,20050%120 hours20 monthsFix root cause only if reliability case supports it
Correct duplicate payment state$18,00060%160 hours14.8 monthsPair with billing redesign

The amounts in the example are placeholders. Replace them with your rates and records. The point is the decision pattern: high annual cost plus a small, low-risk removal effort goes first. Work that needs a larger redesign should not vanish from the ledger, but it should not pretend to be a quick automation win.

Do not let AI hide the removal cost

AI can shorten the work needed to build runbooks, test scripts, classify tickets, draft migration checks, and implement internal tools. That reduces removal effort. It does not make an unclear process safe.

If a human cannot state the trigger, inputs, approvals, safe outcomes, rollback condition, and owner, an agent will guess across those gaps. The result may complete a ticket faster while creating an opaque operational risk. Use AI to accelerate well-defined changes, not to turn undocumented production judgment into unattended execution.

For each AI-assisted removal project, add two fields: "human approval required" and "evidence of safe completion." A data repair helper might propose a correction and prepare an audit record, while an authorized person approves the write. A deploy assistant might identify configuration drift, open a corrective change, and stop before production promotion. Those boundaries preserve accountability.

Walk one deploy fix all the way through the ledger

Keep AI production work bounded
AI team transformation can use Claude Code, Codex, MCP tools, and multi-agent pipelines.

Consider a startup whose background worker deployment fails after a configuration value changes in one environment but not another. The on-call engineer compares settings, restores the prior value, reruns the deployment, checks queue depth, and tells support that processing has resumed.

The first time, record it as an incident and investigate. The second similar event deserves a ledger row. By the fourth occurrence, the team has enough evidence to stop calling it bad luck.

A completed entry might read like this:

Work category: deploy fix
Service: document processing worker
Trigger: deployment completes, but queue depth rises and jobs remain unprocessed
Human action: compare runtime configuration with approved release values; restore prior value; redeploy worker; confirm successful job completion
People involved: on-call senior engineer, release engineer, support lead
Hands-on time: 95 person-minutes
Occurrences in last 30 days: 3
Root condition: runtime configuration can differ by environment without a promotion-time check
Removal candidate: store approved configuration with the release artifact; compare environment values before promotion; block drift; add a post-deploy worker health check
Expected reduction: 80%
Evidence: incident records and deployment run links

Assume the three events consumed 4.75 person-hours in a month after including direct work and a consistent interruption allowance. At a loaded blended rate of $150 per hour, that is $712.50 per month, or $8,550 per year. An engineer estimates 24 hours to create the configuration contract and health check, including test coverage and rollback behavior. The removal cost is $3,600. At an 80 percent reduction estimate, the project pays back in a little over six months.

That is not an automatic yes. If the worker affects a high-value customer path, the reliability benefit may move it ahead. If a platform migration will replace the whole deployment mechanism next quarter, a temporary control may be smarter. The ledger does not replace judgment. It gives judgment a record and a price.

Now compare that with a proposed fix of "write a runbook for restoring the variable." The runbook may reduce the repair from 95 minutes to 55. It does not prevent drift, it still requires a person with privileged access, and it keeps the release process dependent on a manual response. Call that containment, not removal. The distinction matters when you report progress.

Give each row an owner and a retirement test

A ledger without ownership becomes a museum of known problems. The person who records an item should not automatically own the removal project. Assign ownership to the team that can change the source condition, even if another team pays most of the payroll cost.

An alert caused by an application retry loop belongs with the application owner, not the on-call team that restarts workers. A recurring access request caused by unclear customer roles belongs with the product or identity owner, not the engineer who approves it. A manual data repair caused by a missing operator action belongs with the business workflow owner and the engineering team that supports it.

Give every funded item a retirement test before work starts. The test states what evidence proves the toil has fallen. Examples include:

  • No manual configuration restoration across ten normal releases
  • Routine access requests completed through a policy-controlled workflow for one month
  • The same alert class reduced below an agreed count without silencing the underlying signal
  • Manual database corrections replaced by an audited business action for the defined request type

Do not retire a row when a pull request merges. Retire it after the new behavior survives normal operation. Engineers have seen too many "automation" projects where a script exists, no one trusts it, and the same manual work continues beside it.

Review the ledger every two weeks with the people who can authorize tradeoffs: engineering, product, operations, and whoever owns the budget. Keep the review tight. Add new high-confidence entries, update recurrence counts, decide whether top items receive capacity, and close entries that no longer recur. Do not spend the meeting reading every row aloud.

The ledger also gives you a clean way to reject false urgency. If a leader says a particular automation must happen immediately, ask for the row: recurrence, people involved, payroll cost, removal effort, safety constraints, and proof that the task recurs. Good work will survive that question. Pet projects usually will not.

A ledger should change staffing decisions before hiring does

Price recurring operational work
The $5,000 Team & AI Audit identifies $50,000+/year in savings within five business days, or it is free.

Hiring can be the correct answer. A company with real product demand, a growing customer base, and underbuilt systems may need more engineering capacity. But hiring before you measure repeated work often scales the very behavior that caused the shortage.

If five engineers spend meaningful time each week handling the same classes of deploy repair, access handling, alert response, and data correction, a sixth engineer can absorb the queue for a while. The company still pays for the queue. The next customer cohort or product surface then creates the same demand again.

Google's SRE workbook recommends identifying and quantifying toil before trying to optimize it, and describes ranking it by cost to fix and time saved. That is the discipline worth borrowing, not a copy of another company's org chart or a target chosen without context.

Use the ledger before a hiring plan, a reorganization, or an AI tooling purchase. Ask how much planned capacity is currently spent on recurring work. Ask which removal projects can return capacity inside a quarter. Ask whether the team needs another engineer because the product is genuinely expanding, or because skilled people operate a collection of manual exceptions.

For teams that need an outside view, a Team & AI Audit can start with the ledger, tickets, release history, and on-call evidence rather than a slide deck about productivity. The useful output is a ranked set of changes with payroll impact, removal effort, ownership, and safe places for AI assistance.

Build the first version with the work already happening this week. Ask the on-call engineer to record the next recurring alert response. Ask the release owner to log the next manual deploy repair. Ask support to tag the next request that needs an engineer to modify customer data. Within a month, you will have evidence that is far more useful than another argument about whether the team feels overloaded.

Frequently Asked Questions

What should go into an engineering toil ledger?

Start with the work that interrupts planned engineering: deploy recovery, access changes, recurring alerts, manual data changes, customer escalations, and release coordination. Do not wait for perfect time tracking. A short record made when the work happens is more useful than a polished retrospective built from memory.

Is every production incident toil?

Not always. The first occurrence may be investigation, learning, or genuine incident response. It becomes toil when the same class of fix returns and a human repeats a predictable procedure instead of changing the system that creates the need.

How do I calculate the cost of engineering toil?

Use loaded payroll cost, not salary alone. Take annual salary, employer costs, benefits, equipment, management overhead, and contractor margin where relevant, then divide by realistic annual working hours. The exact rate can be rough at first, but it must be consistent across entries.

Should I count waiting time in a toil ledger?

Record the engineer's hands-on minutes, not the time a job, build, or vendor ticket spent waiting. Add the interruption cost separately when a task breaks focused work or drags in a second person. A five-minute action that pulls three people out of a release is not a five-minute problem.

Are access requests really engineering toil?

Access requests often expose weak identity design, missing role definitions, or an approval flow that exists only in someone's memory. Some requests require human review for security or compliance. The ledger should separate those judgment calls from routine permission changes that a controlled workflow can handle.

When should a team automate toil?

Do not automate a bad procedure just because it is frequent. First ask whether you can remove the trigger, make the service self-correct, reduce the number of environments, or change ownership. Automation is appropriate when the workflow is stable, safe to encode, and cheaper to maintain than repeating manually.

Who should own items in the toil ledger?

Give each row one accountable owner and one review date. The owner does not need to build the fix immediately, but they must keep the record honest, confirm the recurrence, and decide whether the item remains worth funding. Without an owner, the ledger turns into an archive of complaints.

Is a larger toil ledger a bad sign?

No. A growing ledger can mean your team has finally made hidden work visible. The problem is a ledger that grows while no items are removed, or one where the same high-cost rows remain unowned for multiple planning cycles.

How do we know a toil project worked?

Track hours removed per month, recurrence before and after the change, and whether the work moved to another team. Also track the cost of keeping the automation alive. A script that replaces ten minutes of work but creates weekly maintenance has not improved much.

What should I prepare for a Team & AI Audit?

Bring a representative sample of real tickets, incident notes, deployment history, access requests, and a few payroll assumptions. A Team & AI Audit can turn that evidence into a ranked removal plan, but the useful input is the work your engineers actually performed, not a leadership estimate of where time goes.

Related Posts