Content errors

Simon's content engine is highly flexible so you can send highly personalized messages to your customers. This flexibility, however, creates the possibility of producing content that might fail to populate successfully for certain contacts.

We implement safeguards to prevent this from happening, but because content is generated dynamically at the time of send, these issues can still occur due to missing/invalid data. For example, a campaign might use a 3rd party API to dynamically populate a promo code in the template and this API might fail to return a code due to some unforeseen issue.

How does Simon handle content errors?

When Simon detects a content error in a campaign send, it prevents that send from going out. More specifically, it marks that particular send as skipped and provides a skip description based on the actual error. Find a complete skip log, including number of contacts affected, in the Flow Delivery Metrics reporting for flows or in the Skip Reasons Breakdown for Journeys steps.

Use this guide to review common content errors and their solutions.


Empty properties

We can trace almost all content errors back to one common root cause: empty properties. This happens when you're applying some operation in your content on a dynamic property (like {{ contact.first_name }}) and that operation fails because the value for that property is empty for one or more contacts.

Some strategies to resolve an issue like this are:

  • Are you expecting all contacts receiving the campaign to have a value that isn't null for the property in question? If so, investigate the data source where this property comes from and fix the underlying root cause.

  • If you determine some contacts can have an empty value for the given property but you only want to send to those who do have a value, update the segment definition to only include the eligible contacts. Continuing with the{{ contact.first_name }} example, add a condition of "First Name is available" in your segmentation criteria.

  • You can provide a default value for the property that is used if the property is empty for a certain contact. This would look like this: {{ contact.first_name or "customer" }}

  • Keep the existing behavior of not messaging contacts when the property is empty, but put in a more explicit skip reason for tracking purposes:

    {%- if contact.first_name -%}
    {{ contact.first_name }}
    {%- else -%}
    {{ skip_action('First name not available') }}
    {%- endif -%}
    

    Read more about the skip action here.

  • Are you using the property to render a specific section within your larger template? If so, you can have conditional logic to render that section only if that property is present:

    {%- if contact.first_name -%}
    ... logic which renders this section
    {%- endif -%}
    

👍

Keep these strategies in mind as you read the common errors below because they are often the solution.


Common errors and solutions

Null Input error

Skip reason: Content Error - Null input for field <field_name>

Description: This indicates that for one or more contacts, the value of a required field was empty.

Solution(s):

  • Use any of the strategies listed above for handling empty properties.
  • If this error is occurring on a custom context field, you may decide it's ok to pass an empty value in that field. If so, you can click the bell icon next to the custom context configuration to ensure empty values are not treated as errors:


Format_date error

Skip reason: Content Error - format_date rendering failure

Description: format_date is a Jinja filter that converts a date into a specific format, ( i.e. format "1/11/23" as "Jan 1st, 2023" ). This is how the filter is used in Simon content:

{{ contact.sign_up_date | format_date }}

The format_date error occurs when the filter is unable to apply on the given date property. In the above example, if contact.sign_up_date were empty or not a valid date for a given contact, we expect to see this error.

Solution(s):

  • Identify where the format_date filter is used in your content. Most likely the error is caused by an empty property being passed into the filter. If this is the case, please refer to the empty properties section above.
  • If there's another issue causing an invalid value passing into format_date, you need to diagnose the issue by investigating how that value is generated. Generally this requires tracing down the data source from where the field is derived and troubleshooting it.

'>' operation failure

Skip reason: Content Error - '>' operation failure

Description: This error occurs when the greater than operator (>) is used in your content, but for some share of contacts it is trying to compare non-integer values. This most frequently happens in situations like the one below:

{%- if contact.items_purchased > 0 -%}
...list out items purchased...
{%- endif -%}

In the above example, If contact.items_purchased happens to be empty or some other non-integer value, then this operation will fail and generate this error.

Solution:

  • Identify where in your content the > operator is being used. Most likely the issue is caused due to an empty value being rendered on either side of the ">" operator for some contacts. For example, in the snippet above, if contact.items_purchased returns an empty value for a contact, this error occurs. If this is the case, refer to empty properties above.

List iteration failure

Skip Reason:: Content Error - List iteration failure

Description:: A powerful feature provided by Simon Content is the ability to iterate through a list of objects and do something with each one. For example:

{%- for item in event_raw.cart_items -%}
...print item name and price...
{%- endfor -%}

The list iteration failure indicates that for some contacts, it was not possible to iterate through the list property - in the above example that is event_raw.cart_items. This most frequently occurs due to that property being empty for some contacts.

Solution:

  1. Identify where in the content you are iterating through a list. (Search for the for keyword.)
  2. Once identified, identify the property which we are unable to iterate through. This will likely be a dynamically generated property (such as event_raw.cart_items in the above example).
  3. Most likely the issue is caused by the dynamic property being empty for some contacts. If this is the case, refer to empty properties above.

Missing required argument for realtime content API

Skip Reason: Content Error - Missing realtime content API argument

Description::

Simon Realtime Content lets you make an API call directly from your template during the send to populate some content. Usually, the API will require some arguments to be passed in depending on its functionality. For example, a translation API which translates your content to a different language based on the contact's preferences will likely require an argument for which language to translate to. This error indicates that for one or more contacts in the campaign send, an argument required by the realtime API was not passed in.

Solution:

  1. First determine the API you are using in your content and what are its required arguments. You can generally find this information in the documentation for the 3rd party API you are using.
  2. In your content, find where the API is being called and what arguments are being passed in. If you're not passing in one of the required arguments here, then the API call will fail for all contacts. If you're passing in the required argument, then it's likely that the argument is a dynamic property and that property happens to be empty for some contacts.
  3. If the issue is caused by a property that might be empty for some subset of contacts, then you can resolve this similarly to how you would address the Null Input error described above.

Dictionary conversion error

Skip reason: Content Error - Unable to convert to dictionary

Description:

This error usually arises in webhook actions where you are attempting to send a dictionary payload. The error occurs because there are values in the dictionary which have not been correctly escaped - i.e. they contain characters which prevents them from being processed.

{"event_id":"12345",  
"event_title":"Simon Presents "ID2"",  
"venue": "Simon",  
"date": "Jan 11, 2023"}

In the above example, event_title can’t be parsed because its value contains a character.

Solution(s):

Identify which of your payload items is using a dictionary and which of its values have an unescaped character. For that value, apply the json_safe filter to it (e.g. { "test": "{{ contact.first_name | json_safe }}" })