- Flows
A flow can only have 50 versions
Deploying an unchanged, active flow still creates a new version. About fifteen deploys in one day used up a flow's limit, and every deploy after that failed.
What to do instead. Leave unchanged flows out of a deploy, and keep an eye on the version count of flows that ship often.
- Flows
A dry run won't warn you about it
A validation-only deploy doesn't create flow versions, so it passes even when the real deploy is about to hit the version limit.
What to do instead. A passing dry run is necessary for flows, not sufficient.
- Flows
Flows that look changed but aren't
Retrieving a flow reshuffles the order of its elements without changing what it does, so version control shows edits that never happened. Paused interviews that pile up every day also keep old versions from being deleted.
What to do instead. Judge flow changes by behavior, not by the file diff, and clear paused interviews on a schedule.
- Deploys
The deploy said success. The class wasn't deployed.
The workflow picked Apex classes by file name pattern. A class named outside the pattern was skipped while the run still reported success, and a helper class whose name matched the test pattern failed the whole deploy until it was renamed.
What to do instead. Name files to the pattern your pipeline uses, or list them explicitly.
- Deploys
Old classes with no tests block new ones
Deploying the whole source folder swept in four legacy classes with zero test coverage, which failed the org-wide coverage check.
What to do instead. Deploy what changed, not everything in the folder.
- Apex
Nested lists arrive empty
Data passed from a Lightning component two classes deep reached Apex with its inner lists silently empty. No error, just nothing there.
What to do instead. Send nested data as JSON text and parse it on the server.
- Apex
You can't move a product to another opportunity
A product line's opportunity can be set when it's created but never changed. Moving products means recreating them and deleting the originals, and on insert, total price and unit price can't both be set.
What to do instead. Plan any product move as delete and recreate, and write only one of the two price fields.
- Apex
Cloning copies things that must stay unique
Four billing and ERP ID fields are unique, so copying any of them fails with a duplicate-value error. Cloning a record that was queried with relationship fields fails too.
What to do instead. Build the clone's field list from the object's field definitions, minus an explicit exclusion list.
- Integrations
Calls to other systems have a budget
A Salesforce transaction gets 100 outside calls and 120 seconds of call time in total, and each call waits 10 seconds by default. Some Asana calls needed longer than that.
What to do instead. Raise the timeout only as far as the total budget allows, and batch work so each job stays under the call limit.
- Integrations
A mapping key that quietly got cut off
A 40-character text field silently truncated long mapping keys, which hid a broken mapping across 161 opportunities. Separately, a key still set to an old picklist value left 22 opportunities unsynced.
What to do instead. Size keys for the longest value, and check every key against the picklist values that exist today.
- Rollups
The bypass belongs to a user
Rollup Helper's validation-rule bypass is a per-user setting, so which user a rollup runs as decides whether it works. Flow custom errors ignore the bypass entirely, and rules inside managed packages can't take it.
What to do instead. Check the running user first when a rollup fails on a validation rule.
- Lightning
You can't replace the Delete button
Lightning doesn't let you override the standard Delete action. And a quick action that closed itself before its dialog did left the record page unable to scroll.
What to do instead. Guard deletes with a blocking check that points to the fix, and close dialogs before the action that opened them.
- Formulas
MIN() only takes numbers
Salesforce's MIN() in a formula works on numbers, so it can't pick the earlier of two dates.
What to do instead. Compare dates with IF instead.
- Sheets
Blank cells that aren't blank
Formulas that return an empty string look blank but still count as values for functions like MAXIFS. And CONCATENATE inside an array formula hit Sheets' 50,000-character limit on a single result.
What to do instead. Return true blanks where a result can be empty, and split long joins across cells.
- Tools
A published page can't call Salesforce
Published Claude pages are blocked from reaching Salesforce, and an unattended Claude Code run doesn't have the tool that republishes a page. The Reconciliation Desk reads its data from each run's Asana task for that reason.
What to do instead. Route data through a system the page can read, and plan for the refresh step to be manual.