Who This Is For / When to Use
Use this article when a workflow appears to run successfully, but the expected result does not show on the contact record or customer experience.
A race condition may be involved when Kyrios shows that a workflow action executed, but one or more of the following still happens:
A tag appears in Execution Logs but is missing from the contact record.
A contact field, opportunity stage, assignment, or status does not update as expected.
A contact receives a duplicate email or SMS.
A message sends before the expected contact, appointment, membership, or opportunity data is available.
A workflow action depends on a previous step, but the next step runs too soon.
Multiple workflows or triggers affect the same contact at nearly the same time.
This article is most useful when the issue is inconsistent, difficult to reproduce, or only affects some contacts.
Why This Happens
A workflow timing conflict can happen when two or more workflow actions try to update the same contact record at nearly the same time.
When Kyrios processes multiple updates simultaneously, the actions may complete in an unexpected order. One action may also overwrite or interrupt another update before the contact record finishes saving.
This can cause Execution Logs to show that an action ran successfully even though the final contact record does not show the expected result.
A Race Condition is a timing conflict that occurs when two or more workflow actions try to update the exact same contact record at the same time (within the same second).
Because the system is trying to process multiple updates simultaneously, the actions "race" against each other. The final outcome becomes unpredictable: the changes might execute out of order, or one server action might overwrite and erase the data saved by the other.
Common Symptoms in Kyrios Workflows
When a race condition happens, your workflow execution logs might say an action completed successfully, but the actual contact card won’t reflect it. Common signs include:
"Executed but Not Added": The execution log shows a tag was added or an Opportunity stage was updated, but when you look at the contact record, the change isn't there.
Duplicate Messages: A contact receives the exact same email or SMS twice because two triggers fired at the same millisecond.
Missing Custom Values: An email sends with blank or
undefinedvalues because the workflow tried to pull appointment or membership data before the database finished saving it.Loop Lockouts: Workflows getting stuck in an infinite loop because simultaneous triggers are constantly re-activating each other.
Why Does It Happen?
Race conditions are usually caused by:
Multiple triggers for the same action: For example, having both the Appointment Status trigger and a Customer Booked Appointment trigger firing simultaneously in your account.
Overlapping automations: Multiple separate workflows triggering at the exact same moment for the same contact.
Rapid-fire actions: Adding a tag to a contact at the exact same time they change an opportunity status.
Most Common Cause
The most common cause is two or more triggers, workflows, or actions updating the same contact at the same time.
This often happens when:
Two workflows start from the same customer action.
A form submission, appointment booking, tag change, or pipeline update triggers multiple automations.
A workflow sends a message before a related contact, appointment, opportunity, or membership field has finished saving.
Separate workflows update the same contact field, tag, assignment, or opportunity close together.
Common Signs of a Workflow Timing Conflict
Use this when a workflow action appears to run, but the expected result is missing, delayed, duplicated, or inconsistent.
Common signs include:
A tag, note, assignment, opportunity stage, or status update appears in Execution Logs but is missing from the contact record.
A contact receives the same email or SMS more than once.
An email or SMS sends with blank, missing, or undefined values.
A workflow step depends on a previous update, but runs before that update is available.
Multiple triggers or workflows act on the same contact at nearly the same time.
The issue happens inconsistently or only affects some contacts.
How to Confirm Using Execution Logs
Open the workflow.
Click Execution Logs.
Locate the affected contact and action.
Check the timestamp for each action.
If multiple actions (for example, Add Tag and Add to Workflow) executed at the exact same second, the workflow is experiencing a race condition.
What Causes Race Conditions in Workflows
Race conditions occur when two or more dependent actions execute at the same time and attempt to update the same contact record.
Common Causes
Multiple actions modifying contact data simultaneously
Actions relying on previous steps that have not fully completed
External processes updating the contact at the same moment
Example
A workflow triggers Add Tag and Send Email at the same second.
The email sends successfully, but the tag does not apply because another process modified the contact record at the same time.
What to Check First
Before changing the workflow, confirm what actually failed.
Check the contact record for the missing update. Then check Execution Logs for the same contact.
Compare:
The action that should have happened.
The time the action executed.
Any other workflow actions that executed at the same second.
Any other workflows that updated the same contact at the same time.
Whether the missing item is a tag, field update, assignment, opportunity update, email, SMS, or custom value.
A workflow timing conflict is likely when the action appears in Execution Logs but the expected update is missing from the contact record.
Quick Fix: Add a Wait Step Before the Conflicting Action
The fastest way to fix most workflow timing conflicts is to add a Wait step before the action that is not applying correctly.
Use this fix when an action shows as executed but the contact record does not update.
Steps:
Open the affected workflow.
Find the action that is not applying correctly.
Look at the step immediately before it.
Add a Wait step before the affected action.
Set the Wait step to 1 minute.
Save the workflow.
Test the workflow with a test contact.
Check that the affected action now appears on the contact record.
For actions involving webhooks, API calls, external integrations, appointment data, or membership data, use a longer Wait step if 1 minute is not enough.
How to Prevent Race Conditions Using a Wait Action
The most reliable way to prevent race conditions is to introduce a delay between critical workflow actions.
Step-by-Step Fix
Open the workflow in Builder.
Identify actions that execute at the same time and modify contact data.
Click Add Action.
Select Wait.
Set the wait time to 1 minute.
Place the wait step before the next critical action.
Save and test the workflow.
How to Optimize Wait Times Without Slowing Workflows
Wait times should be long enough to ensure sequential execution but short enough to maintain performance.
Recommended Guidelines
Start with 30–60 seconds for contact-modifying actions.
Use longer waits for:
Webhooks
API calls
External integrations
Reduce wait time gradually after confirming consistent execution order.
Additional Ways to Reduce Race Conditions
Race conditions can also be reduced through better workflow design.
Best Practices
Use Conditional Branching: Split logic paths instead of running actions simultaneously.
Sequence Actions Linearly: Ensure dependent actions are placed one after another.
Limit Concurrent External Calls: Avoid triggering multiple integrations at the same moment.
How to Verify the Issue Is Fully Resolved
A workflow is considered stable once actions execute in a predictable, sequential order.
Verification Checklist
Execution logs show different timestamps for each action.
Test contacts receive all intended tags, updates, and emails.
No actions appear executed without applying to the contact.
Triggers do not overlap or fire concurrently.
Using Internal Notifications to Detect Race Conditions
Internal notifications can reveal race conditions when they conflict with contact data.
If an internal notification confirms a workflow stage but the contact is missing the expected tag or status, a race condition likely occurred. Immediately review execution logs and compare timestamps.
When This May Not Be a Timing Conflict
The issue may not be a timing conflict if the action does not appear in Execution Logs at all.
Check for other causes when:
The contact never entered the workflow.
The workflow is unpublished or inactive.
The trigger filters do not match the contact.
The contact was removed by a workflow setting.
An If/Else branch sent the contact down a different path.
The email or SMS failed because of sending, compliance, or contact data issues.
A timing conflict is most likely when the action did execute, but the expected result did not apply correctly.
FAQ
Why does the workflow say a tag was added, but the contact does not have the tag?
This can happen when another workflow action updates the same contact at nearly the same time. Add a Wait step before the Add Tag action, then test the workflow again.
Why did my contact receive the same email or SMS twice?
Duplicate messages can happen when multiple triggers or workflows fire for the same contact at nearly the same time. Check Execution Logs for duplicate workflow entries or actions with the same timestamp.
How long should the Wait step be?
Start with 1 minute. Use a longer Wait step for webhooks, API calls, external integrations, appointment data, membership data, or actions that depend on another system finishing first.
How do I confirm the issue is fixed?
Run the workflow with a test contact. Confirm that Execution Logs show the actions running in order and that the contact record shows the expected tag, field update, assignment, opportunity update, email, or SMS.
Is a race condition the same as a failed workflow?
No. A failed workflow usually means the action did not complete. A race condition can show the action as completed in Execution Logs, even though the final result is missing or incorrect on the contact record.




