Three tenure fields produced three different numbers
The fastest way to lose a leadership meeting is to show up with a number somebody else can contradict from a different report. I watched that happen at a 9,000 employee manufacturer last spring. The VP of Talent had a retention deck built on a report called Headcount by Tenure Band. HR Operations ran their own for the same review. Finance pulled a third from a custom report inherited from a contractor who rolled off in 2023. Three reports, three answers to how many people had passed two years of service, off by 214 heads between the highest and the lowest.
None of them was wrong in the way people assume. Each one was computed off a different calculated field. The first read Continuous Service Date. The second read Original Hire Date. The third read Hire Date and then subtracted leaves of absence longer than thirty days, because somebody in 2021 needed that treatment for a bonus eligibility question and never renamed the field. All three were named something close to Tenure in Years. Sorting the calculated field list alphabetically put them within four rows of each other and nobody noticed for two years.
Nobody sets out to build a redundant library. Each field gets created to solve one report on one deadline, by somebody who searched for an existing field, did not find it because it was called CF_Tenure_YRS_v2, and built their own. Multiply that by four years and six consultants and you get a tenant where the report everybody trusts is the one nobody can explain. That is how a dashboard quietly turns into a decision surface nobody ever approved.
Start with what nothing references anymore
Before you touch the duplicates, clear the dead weight. Pull the full calculated field list with the Where Used column populated. In most tenants I have audited, somewhere between a quarter and a third of calculated fields have no active reference at all. They were built for a report that got retired or an integration that got replaced three releases ago.
Where Used matters here, and most teams open it one field at a time, right before deleting something. Pull it in bulk instead. Export the whole list, count references per field, sort ascending. Everything at zero is a first tier candidate. So is anything with a single reference from a report nobody has run since the last fiscal close.
Do not mass delete. Rename the zero reference fields with a retirement prefix, something like ZZ_RETIRE_, and leave them alone for one full quarter. Anything quietly feeding an annual process surfaces when that process runs, and you find out in March rather than in a support ticket. This is the same habit as keeping a retirement list alongside the roadmap.
Group the near duplicates by what they actually compute
The dead fields are easy. The duplicates cost you credibility, and sorting by name will never find them, because inconsistent naming is the reason they exist.
What has worked for me is grouping by what the fields read rather than what they are called. Export the calculated field list with the business object and the source field, then group by source field. Every field reading Original Hire Date lands in one bucket. Every field reading Continuous Service Date lands in another. In a tenant carrying four hundred calculated fields this usually produces fifteen to twenty clusters where two or more fields compute the same concept with a different edge case rule inside.
Then go concept by concept and make somebody own the definition. Tenure is the obvious one. Full time equivalent is the other one that bites, because the comp team and the finance team almost always want different rounding on partial months. Agreeing which definition is the reporting standard takes a decision from a named business owner, and it belongs in the same conversation as deciding who gets to define a core metric. Writing that definition down before the report gets built is the same discipline as making analytics questions a product requirement.
Trace the nesting depth on your heaviest reports
Performance is where sprawl stops being a tidiness problem. A calculated field that references another calculated field that references a third gets evaluated for every instance in the report population. Workday does not flatten that chain for you. On a report scoped to all active workers in a 40,000 person tenant, a four deep chain sitting on a Date Difference field can take a run from twelve seconds to past the timeout, and the person paged is the report owner who changed nothing.
Take your five slowest reports, the ones people complain about in the first week of every month. Open every calculated field on each and follow the references down until you hit delivered fields only. Write the depth next to the report name. I have traced chains eight levels deep more than once, usually where an Evaluate Expression sits on top of a Lookup Related Value that sits on top of another Evaluate Expression somebody wrote for an entirely different purpose.
The fix is rarely clever. Flatten the chain into one calculated field that reads the delivered fields directly, even when the logic gets uglier to read. One evaluation per instance beats four. Where the intermediate step earns its place, check whether it can become an indexed field on the worker instead of being recomputed on every run.
Naming and ownership so the next search works
Every duplicate in that manufacturer's tenant existed because search failed. Somebody typed tenure into the calculated field prompt, got nine results with no way to tell which one was current, and built a tenth. A naming convention fixes that for one afternoon of agreement and a long weekend of renaming.
The convention I keep recommending has four parts in a fixed order: a functional prefix, the business concept, the return type, and a status marker. HR_Tenure_Years_STD for the standard. HR_Tenure_Years_COMP for the comp specific variant that deliberately handles leaves differently. STD means exactly one per concept, and that is the one reports should point at. Any field with no status marker counts as unreviewed, which makes the gap countable in an export.
Ownership is the other half. Put a named owner and a review date in the description on every STD field. Description is close to the only metadata you get, most tenants leave it empty, and that is how a contractor's 2023 logic ends up running a 2026 board deck. Who can create these fields in production matters just as much, since that group is usually wider than anybody intended, which pairs with the work on who can actually configure what in your tenant.
Make the next one harder to create than to find
An audit cleans up what exists. It does nothing about the field somebody creates next Tuesday. The control that holds is a short intake step. Before a new calculated field reaches production, the requester names the concept it computes and shows that a search on it returned nothing suitable. Two minutes of friction catches most honest duplicates.
Put that check wherever your tenant already reviews configuration changes. If you run a design review for Extend apps, this belongs in the same forum, and the reasoning matches the case for setting governance before the first custom app ships. A small standing group with the authority to say the field already exists will catch far more than a written policy ever does.
Before your next workforce review, pull your headcount report and your attrition report side by side, find the tenure calculation sitting behind each one, and check whether it is the same field. If it is not, you already know how that meeting is going to go.



