I have both SC and MC and I'm using Journey Builder (using Salesforce Data entry) to inject customers into a Journey.

My data model is as follows: Person Account has many Orders (master-detail), and an Order has many Order_Payments.

The journey is triggered whenever an update is made to Order_Payments. What I'm trying to do is check to see if the parent object (Order) has Order.Status == X. I planned to use Decision Splits to check Order.Status but the nature of how this activity works is it will find the first matching Order instead of the one related to my injected record.

My idea to get round this would be to do a comparison and use Journey Data.Order_Payments.Order.Id = Contact Data.Order.Id in the filter logic, but the problem with this is that in Marketing Cloud the Order_Payments.Order field is nullable, which means I cannot use it as filter criteria. As this is a syncronised DE I cannot change it either.

Does anyone have any ideas how I can achieve this would recreating Data Extensions and copying data from my sync'd DE's into them? The issue is I need to inject these users relatively quickly and the 1 hour automation run time is not quick enough.

  • How quick is quick in your case? Keep in mind that, depending on your order sync configuration it might take up to anything between 15 and 60 minutes for your updated data to be available for decision splits in the first case Nov 27, 2019 at 20:21
  • Surely the sync will only take up to 15 minutes? I’m just trying to avoid having to maintain a separate data extension which we need to populate using queries. Nov 27, 2019 at 20:22
  • 15 minutes is the default sync interval configuration but better make sure and check if you didn't set up the sync yourself Nov 27, 2019 at 20:27

2 Answers 2


I just remembered something that should work in your case without extra data extensions and within your speed requirement.

There's a feature called data binding that is originally intended for custom activities but can also be used in decision splits. It basically provides a syntax to dynamically retrieve field values from your contact model and the event context. An explanation how that works is provided in this thread where Eliot Harper invested quite some effort to evaluate a working solution.

A fairly easy way to get the correct data binding syntax for the required order Id is the following approach that works when you have a connected Salesforce Org as you have:

  1. Add a Salesforce object update activity to the canvas. It doesn't matter too much what sort of object as it will be deleted in the end.
  2. Click through to the field value mapping part of the activity.
  3. Select any text type field on the left side from the Salesforce object
  4. For the value on the right side you click into your journey data and select the Order Id field
  5. This will populate the field on the left side with the correct data binding syntax for the field in your journey entry data.
  6. Copy this to your clipboard
  7. In your decision split you select the Order object from contact data and add the Id field to the filter canvas
  8. Set the operator to "equals" and paste the data binding string in the value field.
  9. Add your other filter operators.

This process basically mocks the attribute comparison that doesn't work here. As the Id fields logically can't be empty in your case you don't need the more complex version of the syntax to handle empty values that is mentioned in the referenced thread.

Hope that helps!

  • Hi, I have tried this solution but I can't get it working successfully. I added the event binding data into my decision split data but the criteria is never met. Dec 3, 2019 at 11:42
  • I have raised a case with Salesforce about the issue above and they claim the {{Contact.Attribute.Persona.FirstName}} binding value is searched as a string rather than the data binded value itself. Does this sound right? Dec 10, 2019 at 17:42

As journey builder has a problem with one-to-many relationships and lookups only happen based on the contact key, even if the salesforce id of the needed record is in the entry source, I use a custom activity for this purpose.

In your case this custom split activity would receive the Salesforce Id of your Order_Payments object as input from Journey Builder and then check the status field of the parent object directly via the Sales/Service Cloud API (from the split's backend) and returns the correct branch-result to Journey Builder.

I created such an activity, that can be deployed to heroku after adapting it to your needs. The needed changes (except for the use case specific ones i described above) are documented in the README-file. You can find the complete code and documentation on my github-account: Salesforce Marketing Cloud - Service Cloud Custom Split Activity.

However, you need to be aware that this solution consumes Salesforce API calls for every evaluation!

Another post on stackexchange where I described the problem and solution can be found here: Contact Data Decision Split for synchronized Salesforce DE leads to wrong path

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.