Workflow AutomationOperationsSchemaZapier

Dropdown Values Don't Match Between Your Systems

Mismatched dropdown values between systems are a governance problem rather than a mapping problem, because the option set is editable by ordinary users in Salesforce, HubSpot, and Airtable. The durable fix is to name exactly one system as the vocabulary owner, match on the stable internal value instead of the display label, and route an unrecognized value to a queue instead of defaulting it to Other.

Alexey YushkinFounder, GENERAL INFORMATICS3 min read

A sync that fails on a status dropdown is almost never fixed by fixing the mapping. You correct the values, it runs clean for six weeks, then someone in sales adds a stage called "Verbal Yes" and it breaks again in exactly the same place. The option set is editable by ordinary users in every major CRM and database tool, which makes a value map a snapshot of something that keeps moving. Three decisions make it stop: which system owns the vocabulary, which key you match on, and what the sync does with a value it has never seen.

The mapping table is the easy half

Every vendor guide on this ends at the same three sentences. Values must match exactly. Use the API name. Add the missing option or standardize the set. All three are correct, and none of them are the reason the problem keeps coming back.

Look at how a dropdown option actually gets created. Nobody files a schema change request. A rep is working a deal that does not fit any existing stage, they have edit rights on the field, and they add one. In Salesforce that is nominally an admin action, but in most mid-size orgs a handful of non-admins hold the permission. In HubSpot, anyone who can edit properties can add an option to a dropdown. Airtable is the one that draws the line where you would actually want it: its documentation on single select fields states that Owners and Creators can add new options from the data layer, while Editors, Commenters, and read-only users can only pick from what already exists.

So the option set has a write path your integration does not control and does not observe. A mapping table maintained by hand is a document describing the world as it was on the day someone last looked at it. That is a governance gap, and no amount of remapping closes it.

Match on the internal value, not on what the field displays

Before you can decide who owns the vocabulary, you have to know which string you are actually matching. All three of these tools keep a display name and an underlying value, and all three handle the relationship between them differently.

SystemWhat the API stores and returnsRenaming the display labelChanging the underlying value
Salesforce picklistThe API Name. Query results return the API Name; the Label is display only.Safe. Integrations reference the API Name and keep working.Possible, but Salesforce warns that altering API names once they are in use can disrupt automations, formulas, and integrations.
HubSpot dropdown propertyThe internal value, which defaults to the label at creation.Safe. Label and internal value are independent after creation.Not possible. HubSpot documents that once saved, internal values cannot be updated.
Airtable single selectThe option name string itself. The field schema holds a stable choice id, but the record payload carries the name.Breaks matching. The rename changes the exact string every integration reads.The name is the value.

Three different answers to the same question, which is why advice copied off a Salesforce blog fails in Airtable and the reverse. In Salesforce, a marketing manager renaming "Closed Won" to "Won" is a non-event. In Airtable, the identical rename silently rewrites the key. And the restricted-picklist error that ops teams hit most often comes from the other side of the same distinction: Salesforce names a differing Label and API Name, with the integration sending the Label, as a direct cause of the bad value for restricted picklist field error.

The HubSpot row deserves its own warning, because it is a one-way door. The internal value is generated from the label the first time the option is saved. If somebody creates an option by typing "Closed Won" with two spaces, or pastes in a label carrying a trailing character, that string is your integration key permanently. HubSpot's documented remedy is to create a new option with the correct internal value and migrate the records onto it. So create options deliberately, with the internal value set on purpose, rather than by typing a label into a box and moving on.

For every field you sync, write down two things: the key you match on, and whether a person with normal permissions can change that key. If the answer to the second is yes, the field needs the rule in the next section.

Exactly one system is allowed to invent an option

Pick the system where the value is decided by a human doing the actual work, and make it the only place a new option can be minted. Deal stage is decided in the CRM. Job status is decided in the field app, by the crew that finished the job. Billing status is decided in the billing system. Every other system holding a copy of that field is a receiver.

Receivers get one of two configurations, and the choice is deliberate:

  • Permissive, meaning the field will accept a value it has never seen. This is right when the receiver is a reporting or notification destination and the cost of a stale option list is a slightly messy chart.
  • Restricted with a hard reject, meaning an unknown value fails loudly and the record does not quietly land in a wrong state. This is right when the field drives something downstream.

The configuration to avoid is a restricted receiver paired with an owner that mints freely, because that combination produces its failure only at the moment a real record moves. It is also the Salesforce default. Turn on "Restrict picklist to the values defined in the value set," point an integration at it, and the error is built into the design.

Auto-creation at the receiver is a third option, and it has a narrow but real use. In Airtable it is the typecast parameter, which the Web API documentation describes as converting string values on a best-effort basis and keeps disabled by default to protect data integrity. Best-effort is the operative phrase. Point it at a deal-stage field fed by a source with inconsistent casing and you get Closed Won, closed won, and Closed-Won living side by side as three legitimate-looking options, each holding its own slice of your records. Use typecast for a descriptive field such as lead source detail. Never for a field a workflow branches on.

What the sync should do with a value it has never seen

This is a decision, not a default, and the right answer depends entirely on what the field controls once the record lands.

What the field drivesBehavior on an unknown valueWhy
Money, consent, or legal state (billing status, opt-out reason, contract stage)Reject the write, alert, do not create the recordAn empty field in this category reads downstream as a default, and the default is usually "safe to charge" or "safe to send"
Routing or assignment (queue, territory, priority, job type)Write the record, park the field in an explicit Unmapped option, and exclude that option from every routing ruleThe customer record has to exist so nobody loses them, but it must not fall into the catch-all queue where it looks handled
Reporting and description only (lead source detail, product interest)Create the option at the receiver and log itA duplicate option costs you a messy report. Blocking the sync costs you the record.

What most teams ship instead is a default to "Other," or to the first option in the list. That is not a mapping decision. It is data loss wearing a friendly label, and it is worse than a blank, because "Other" looks like a value a human chose. Nothing alerts on it and nobody goes back.

Two smaller rules fall out of the same table. Blank and unmapped are different states and need different values, because a blank target field cannot tell you whether the source had nothing or the source had something you could not translate. And in a two-way sync, never map two source values onto one target value. The round trip has to pick one of them, and it will overwrite the other on the way back.

Catch the drift before a customer does

Every one of these systems will tell you its current option set through an API. Salesforce returns the picklist value set from a field describe. The HubSpot properties API returns each option with both its label and its internal value. Airtable's field model returns the choices array with an id and a name for each single select option.

Run a scheduled job, weekly is enough, that pulls the option set from the system owning the vocabulary, diffs it against your map, and posts the additions somewhere a person reads. The output should be one line: three new options on Deal Stage, none of them mapped. That turns a customer-visible sync failure into a Monday morning ticket, which is the whole point. Pair it with a log of every unmapped-value event recording the raw string and the record id, because that log is what tells you whether a new option is a real business change or a typo somebody needs to delete.

One cleanup caveat before you start merging duplicate options in HubSpot: merging does update the records that carried the old option, but HubSpot documents that it will not update any segments, workflows, or filters still referencing the merged value. Cleanup is two jobs, not one, and the second is the one people forget. We treat that downstream reference sweep as part of the change rather than as a follow-up when we build workflow automation systems that move records between tools.

Where to start

Take the one field that has broken your sync more than once. Answer three questions about it in writing, somewhere your team can find them: which system is allowed to create a new option, which key the integration matches on and whether that key is mutable, and what happens when an unrecognized value arrives. Then build the schema-diff job for that single field before extending it to the rest.

If you have more than a handful of these fields spread across a CRM, a billing system, and an operations tool, the real problem is that nobody owns the shared vocabulary, and that is a data model question rather than an integration question. It is the work behind data intelligence platforms, and it is worth doing before you stack another connector on top. If you want a second pair of eyes on which system should own which field, tell us what you are syncing.

Frequently Asked Questions

SOURCES & CITATIONS

  1. Understanding Picklist Value Labels and API Names in Salesforce Salesforcehttps://help.salesforce.com/s/articleView?id=004205234&language=en_US&type=1
  2. Error 'bad value for restricted picklist field' appears when a record is created Salesforcehttps://help.salesforce.com/s/articleView?id=000384095&language=en_US&type=1
  3. Manage enumeration property options HubSpothttps://knowledge.hubspot.com/properties/manage-enumeration-property-options
  4. Web API: field model and record field values Airtablehttps://airtable.com/developers/web/api/field-model

About Alexey Yushkin

Alexey is the founder of GENERAL INFORMATICS LLC. He designs and ships AI and automation systems for businesses and operators across the US.

Connect on LinkedIn

Related reading

Want this kind of system in your business?

We build practical AI and automation systems for operators. Send us your current workflow and we will show you what to automate first.