Hi,
We frequently encounter sync errors from records that have moved to a status further in the status progression in SF, but remain in the previous status in Marketo, triggering a validation error for statuses that should not be allowed to move backwards.
For example, a lead was created in Salesforce as Pre-Qualified, updated to MQL in Marketo, then updated to Working (which is a status further in the progression than MQL). When the sync took place, it triggered the validation error: "FIELD_CUSTOM_VALIDATION_EXCEPTION: Lead Status should not be moved backward (other than Unqualified or Nurture). Sales Ops can make the change if necessary."
How can I prevent this from happening?
Please see my response to Miray. The progressions are symmetrical, though we don't have them tied to a program status. So it seems to be an issue with timing between when a rep updates the status in SF and a sync is occurring from Marketo with a competing "previous" value in the progression.
Hi @Dave-Silva
Sync errors like these can definitely be frustrating. Based on your example, it sounds like the issue stems from a mismatch between the lead status progression in Salesforce and how it's being updated in Marketo.
A few clarifying questions to help pinpoint the root cause:
From the error message, it seems Salesforce has a validation rule that prevents leads from moving backward in status — except to "Unqualified" or "Nurture." If Marketo is trying to sync a status that violates this rule (e.g., reverting from "Working" to "MQL"), Salesforce will reject it.
I'm just not sure how to prevent that from happening, given that we definitely want the validation rule in place, and it works properly the majority of the time.
@Dave-Silva I might be mistaken, but I believe when you refer to “status,” you mean the Lead Status field rather than Campaign Status. Most of these updates occur when the person is created in SFDC.
If that’s correct, you may want to add constraints in your flow steps. For example:
Yes, Lead Status is what I'm referring to -- it's in the subject 🙂
The problem is, I believe, that Marketo isn't "aware" of the new status yet. So I can't restrict setting the Lead Status to MQL if it's "Working", because it's only "Working" in SF.
So:
1. Lead is created in Marketo with a status of "Pre-Qualified"
2. Lead syncs to SF with that status.
3. Based on scoring or other automation, the lead is then set to "MQL" in Marketo.
4. The lead is updated to "Working" by a rep or other process in Salesforce (perhaps an Outreach automation).
5. Marketo attempts to sync the status of "MQL".
6. Sync fails due to a field validation error because it's already "Working" in SF.
To maintain consistency and avoid conflicts, it’s best to restrict updates to the Lead Status field to a single system—either Salesforce (SFDC) or Marketo. This ensures that one platform acts as the source of truth. ( I would keep leda status Update in SFDC )
Additionally, I recommend separating Lead Status from Lead Lifecycle. , you can still map or translate those values to reflect the appropriate stage in your Lead Lifecycle model. This approach allows you to maintain alignment between systems also give better visibility person can stay as "MQL" in lifecyle and "Working " in Lead status at the same time
Additionally, I recommend separating Lead Status from Lead Lifecycle. , you can still map or translate those values to reflect the appropriate stage in your Lead Lifecycle model. This approach allows you to maintain alignment between systems also give better visibility person can stay as "MQL" in lifecyle and "Working " in Lead status at the same time
Hmm, wrt OP’s situation that would mean Lead Lifecycle stage has the same behavior — if changed by both sides within a short time window, you have a sync conflict. Nature of the beast with all fields that are gradually reconciled.
Yeah @Miray, I'm not sure this would solve the problem, which is that ultimately we have situations where we want to advance a lead status/lifecycle in SF (Sales team actions), and other times where it is Marketo driven (scoring). Even decoupling the status from lifecycle, there are still the two systems trying to update them and it would be difficult to ensure that they never try to update at the same time.
Instead, Pardot had an option to chose a system that should be defaulted to if there is a value conflict, which we'd want to set to SF in this case, since the further progressions are almost always sales-driven.
- We use smart campaigns to set change the status, but don't have it tied to Program Statuses\
The flow step Change Status in SFDC Campaign runs immediately (e.g. it connects to the SFDC API outside of the scheduled sync).
It’s extraordinarily unlikely that someone is updating the Campaign Status in SFDC close enough to the time that flow step executes for there to be a race condition in the fine-grained way we usually use that term in Marketo, e.g. when multiple tasks are operating in parallel with no guaranteed order. But in a broad sense, yes, there is a race condition if the Campaign Status is updated in SFDC and the periodic sync hasn’t run to flush that update to Marketo, so Marketo thinks it can still update the field.
The only way to eliminate that case is to send an Apex callout that updates Marketo immediately, similar to how the flow step works. I’d be wary of that path unless you have super sharp SFDC folks working on it.
To be clear, these aren't campaign statuses -- it's the our core Lead Status field. So these aren't "Change Status in SFDC Campaign" flows, but rather simply field value updates, which are used to drive our lead lifecycle progression.
So it should be comparable to someone updating the value in Marketo, while the value is simultaneously updated in SF, and then the conflict occurs. Instead of Marketo syncing the updated value from SF, it tries to sync Marketo's value, which is earlier in the progression and trips the field validation error.
To be clear, these aren't campaign statuses -- it's the our core Lead Status field. So these aren't "Change Status in SFDC Campaign" flows, but rather simply field value updates, which are used to drive our lead lifecycle progression.
OK, this definitely wasn’t clear! Lead Status has no special meaning in Marketo — it might as well be a notes field — and the progression in SFDC is irrelevant. (In contrast, Program Status is a system-enforced progression.)
Anyway, the same solution applies. The bidirectional sync is eventually consistent and by definition isn’t immediate. If you want to immediately update Marketo to avoid conflicts, use an Apex callout.
The sync error doesn't seem to ever get resolved automatically -- I need to intervene and update Marketo's value to what's in Salesforce to allow the sync to resume.
Pardot used to provide an option for conflicts, where the value in SF (or Pardot) could be chosen to overwrite the other, but I'm not aware of any such thing with Marketo. 🤔
Pardot used to provide an option for conflicts, where the value in SF (or Pardot) could be chosen to overwrite the other, but I'm not aware of any such thing with Marketo. 🤔
Marketo uses the SFDC systemmodstamp during reconciliation. Individual fields don’t have conflict resolution. So if you have automation in SFDC that continually rejects changes from Marketo, the sync cannot reconcile. That’s how it always works.
As noted above, if you have specific fields you want to push from SFDC to Marketo immediately on update, use an Apex callout that hits the Marketo REST API.