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:

    

    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:

    



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:



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:



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:



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.



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 }}" }`)