Custom fields become ERP debt faster than custom code

Custom code gets a review process. Custom fields get an “add field” button — and three years later nobody remembers who approved the 47 that got added to one record.

By Timothy Carter — Chief Revenue Officer

Everyone understands custom code because everyone recognizes that it is a customization. However, many times, people don't understand custom fields. People consider custom fields to be harmless. Creating a field typically takes a few minutes and then they begin to slowly become part of reporting, integrations, and other business processes where people cannot remember if anyone approved their inclusion in the first place.

Most ERP teams are very cautious with regards to developing custom code.

When you want to develop a new module within your ERP software, there will usually be some sort of formalized requirement process. That formalized process typically includes estimating how long the work will take (and thus how much it will cost). There is also testing of the code prior to its release to production.

Fields can be created before lunch:

  • “Can we add a Contract Type?”
  • “Can we track the sales person here?”
  • “Can we add another status?”

All three of these questions seem reasonable; all three of these questions represent small individual changes.

However, three years from now, the customer record will have 47 additional fields added. Only eleven of those additional fields will be required. Eight of those additional fields will be feeding into reports. Six of those additional fields will be being utilized through integrations. Additionally, nobody will fully understand exactly what the remaining twenty eight additional fields were intended to do.

Again, the issue isn't the fields.

The issue is that nobody was treating the creation of those fields as the design of the system.

Where 47 added fields on one record actually went
Actually required11 fieldsFeeding a report8 fieldsRead by an integration6 fieldsPurpose nobody remembers28 fieldsIllustrative — directional only
A familiar shape, not a strict accounting: fields accumulate one “quick add” at a time, several purposes overlap, and most are never revisited. Categories aren't mutually exclusive, so they needn't sum to 47.

The cheapest change rarely feels like customization

An individual field doesn't resemble an individual piece of code.

There is no developer involved. Therefore, there are no changes made to a repository. There are no changes made to a deployment process.

Therefore, based upon the above reasons alone, a field is perceived as having little or no cost associated with it.

But that is incorrect.

Each time an individual field is created, that represents yet another potential configuration for an individual record. And therefore somebody has to make decisions regarding who will enter this data, when this data will change and whether this data is mandatory. In addition, each report must determine if this field affects the report's output. Each integration must determine if this field must be sent along with the data. Finally, permissions may require modification.

Although the technical costs associated with creating a field could be virtually non-existent once the field exists, the operational costs associated with creating a field can occur immediately after the field is created.

Custom code causes the technical costs associated with creating such code to be visible at the time the code is developed.

In contrast, custom fields often mask the technical costs associated with creating custom fields until some future date.

Every field creates downstream obligations

Consider a field named “Customer Tier.”

Initially, sales wishes to utilize this field as a means of segmenting customers. The available options for this field include Gold, Silver and Bronze.

Simple.

Later on, finance wishes to utilize this field in determining payment terms for customers. Customer Success wishes to use this field in establishing service levels for customers. Lastly, a dashboard displays revenue grouped by tier.

Then somebody adds “Strategic.”

This change is not simply updating the dropdowns for “Gold,” “Silver” and “Bronze.”

Will Strategic receive Gold payment terms? Should historical dashboards display this tier separately? Does the CRM already contain the new value for Strategic? Will an integration fail when attempting to send the new value for Strategic?

One field, four owners
Customer Tier fieldSalessegmentationFinancepayment termsCustomer Successservice levelsRevenue dashboardgrouped by tier
“Customer Tier” started as a sales segmentation label. It didn't stay one team's problem.

This single field has now become a tiny piece of business logic.

Because this single field appears so simple, this occurs quietly without anyone realizing it.

As soon as one additional process relies upon a field, that field becomes part of the overall architecture of a company's system.

Thus, just as with custom code, the maintenance of that field should reflect that.

Empty does not mean optional

Missing values are also caused by the same fields as ambiguity.

Consider an implementation that adds “Renewal Type”. Half of all existing contracts were migrated without a value for this field. What does blank mean? (blank) might represent that there is no renewal. It may be that the team has not been identified. Or, (blank) could indicate that the migration missed to capture the value. Those are three different facts. The report will not know which fact they are trying to identify.

In most cases teams solve this problem by making the field required. However, this creates another problem. Users enter whatever information gets them past the screen. “Other” becomes the most popular answer.

Only when users know the answer and the options describe reality do required fields improve data quality. Otherwise, the system collects cleaner-looking bad data.

Reports expose the real cost

When someone wants to run a report on a new field in the application, usually at that point the field becomes expensive. The request sounds straightforward.

Example — show revenue by customer segment.

However, then questions start coming up. Was the customer segment captured historically? Can the customer segment change over time? If the customer moves from Mid-Market to Enterprise today should last year's revenue move with it? That question matters.

If the report uses the current value of the customer segment historical results can change when the business changes the field. If the business needs the value to exist as it existed at transaction time then it may belong on the transaction instead.

That is a data model decision.

It should not have been made because one screen had an easy button called “add field.” Reporting requirements often reveal that the business did not really want a new field. They wanted a dimension, classification rule or historical attribute.

Duplicate fields are usually a governance problem

Duplicate fields are probably one of the easiest forms of ERP debt to find.

“Sales Region.”

“Customer Region.”

“Territory.”

“Reporting Territory.”

Each may have had its reason. Maybe someone could not locate an already existing field. Maybe some other team needed slightly different values. Or, maybe another team just did not trust the first field's data. Creating a new field solves the immediate problem. But it makes the underlying problems worse.

Before adding a new field ask yourself if the information already exists elsewhere. If so, ask why that value cannot be used. The answer may reveal a real difference between how two teams view their customers. Or, it may reveal who owns a given piece of information. A new field is a very poor substitute for deciding who has authority for an existing value.

Field governance quadrant
Business impact →Clarity of ownership →Delivery instructions“Territory” vs “Reporting Territory”Customer Tier (ungoverned)Tax status (owned, documented)
Illustrative placement. Low-impact fields can stay informal. High-impact fields with no clear owner are exactly the debt this piece is about.

Put a gate in front of new fields

Custom fields do not need a six week approval process. But they need a small gate. Write down these things before creating any new field.

  • What business decision will use this field?
  • Who will own the definitions of this field?
  • Who will enter and/or update this field?
  • Is this field required?
  • What does a blank mean in relation to this field?
  • What values are allowed for this field?
  • Must we keep track of historical values for this field?
  • Will people run reports using this field?
  • Will some other system read/write against this field?
  • What will happen if/when we eventually decide to remove/retire this field?

All of these take a few minutes to complete for even a very simple field. And that is enough. We are not looking for bureaucracy here. We are simply looking for evidence that someone thought about the consequences of adding this field before it became permanent. Fields that cannot answer any of these questions may not be ready to live yet.

Where this argument is weak

Custom fields are useful tools.

A rigid ERP that cannot represent information specific to your business forces users back into spreadsheets – which is much worse than using custom fields.

There are many fields that remain very simple. Delivery instructions, internal references or secondary identifiers may require little governance. Creating a custom module for such information would clearly be absurd.

The argument is not that custom fields are unacceptable.

But rather, that light configuration should never be confused with zero-cost configuration.

Lighter technical changes are more likely to occur without design discipline than larger ones.

And that is exactly why it needs discipline.

Customization should leave evidence

Just like good custom code comes with a specification and an owner – custom fields deserve a smaller version of the same treatment.

Record purpose and ownership of each field. Record dependencies for each field. Regularly review fields and retire any that no longer serve an active process.

Timothy Carter — Chief Revenue Officer

Timothy Carter is a digital marketing industry veteran and the Chief Revenue Officer at erp.io. With a career spanning over two decades in the dynamic realms of SEO and digital marketing, Tim is a driving force behind revenue strategy. With a flair for the written word, Tim has graced the pages of renowned publications such as Forbes, Entrepreneur, Marketing Land, Search Engine Journal, and ReadWrite, among others. His insightful contributions to the digital marketing landscape have earned him a reputation as a trusted authority in the field.

At erp.io he writes about the commercial side of running the business on one system: what a slow close actually costs, how a reporting gap becomes a pricing mistake two quarters later, and why the numbers a team argues about are usually a data problem rather than a disagreement.

Beyond his professional pursuits, Tim finds solace in the simple pleasures of life, whether it's mastering the art of disc golf, pounding the pavement on his morning run, or basking in the sun-kissed shores of Hawaii with his beloved wife and family.

Who you actually work with is on the team page.

Keep reading

Other posts.

Top Considerations in Custom AI ERP Development

What finance leaders should decide before building a custom AI ERP, from ledger boundaries and agent authority to evaluation harnesses and migration proof.

15 October 2026 · Read →

AI ERP ROI Statistics and Whether Agentic Platforms Beat Traditional Systems

A data-led 2025-2026 comparison of AI-native ERP, AI-enhanced legacy ERP, and traditional systems across TCO, close times, AP automation, and ROI payback.

13 October 2026 · Read →

The True Cost of Keeping Your Legacy ERP Alive

The ongoing cost of integrating and maintaining third party tools around a legacy ERP almost always exceeds the one-time cost of switching to an AI native platform.

12 October 2026 · Read →

Everything else we publish.

Primary research with stated sample sizes, buyer guides, and comparisons scored on published weights.