Attributes: Difference between Message, Custom, and Event Attributes

Message attributes:

Attributes that are set on each message that define a structure for each message. Message attributes are used to customize look and feel of in-app message by passing the structured data in the message payload. The developer must build logic in their app to extract a message attribute and display it. Then the app looks for the attribute and passes certain information back for the end user to see. 

Common use case:

  • Used when you use in app message with a custom view and you want to create a custom call to action.
  • A test message with a button.

Message attributes are set up by navigating to Settings > Developer > Advanced.

The message attributes you've created are listed when you create a new in-app message.

For the sake of an example, the message attribute is called CTA_button_copy. The app is coded to look for that attribute and display a black button. Over this button is the next "Buy Now". When a user clicks on this button, they will be directed to the URL set in the attribute CTA_button_link.


Custom Attributes:

Sometimes, targeting users is not possible unless there is certain custom information added to the device about that user. Custom Attributes are custom information about the user / device set by the app. For instance, some common examples of custom attributes are the user's first name, last name, birthday, city of residence, or state of residence.

You can then build Audiences based on this custom information or personalize your message with liquid templating.

Hey {{custom.first_name | default:"there"}}!

If the custom attribute first_name is set on the device and has a value, the user with a value set to "Joe" will see "Hey Joe!" If there is no custom attribute set or the custom attribute is empty, the user will see "Hey there!"

There are some limitations with custom attributes:

  1. There is a limit of 50 different custom attributes per device.
  2. If the attribute is a string, limit of 250 characters.
  3. You can also set arrays of integers, floats, dates, strings; limit is 50.


Event Attributes:

Developer sets the event in the app. When the user does the event (e.g., searches for a type of food, watches a video, likes a song, follows an artist, etc). The event is set on the device. Carnival can then adds the device to the Audience built for the specific event.

You can then send a push notification or in-app message based on behavioral triggers on the message: no trigger, triggers on entry, triggers on exit.

A client wants a custom event for every type of cuisine. Workaround: You can have a single event search_cuisine and a custom attribute for cuisine type. You can set up an array if the client is likely to have multiple values for the same attribute.


  • 50 unique events per device.
  • All events are strings.

Use case example to consider and workaround to challenges:

Your app allows users to follow an artist. You may want to send a push notification three days after a user follows an artist to let them know the artist name they're following is a great find. You log the event follow_artist and populate the artist with a custom attribute.

However, if a user follows more than one artist, you would need to confidently know which artist the user followed exactly three days ago to make sure the correct artist name is displayed.

Showing the artist the user follows can be done assuming the user does not follow multiple new artists that day and week. If the users do, it requires more planning on the messaging strategy (your CSM can help discuss this with you!). 

This is not a limitation of the platform; the platform is not a single source of truth or database for all attributes and events. Every time the action performs, the attributes will update. Carnival is meant to hold the most recent actions so you can action off of those. 

A workaround here would be to send a push notification if the user has not followed a new artist recently and display the name of the most recent artist the user followed with liquid templating:

"Hey {{custom.first_name | default:"there"}}, we haven't seen you in a while! Follow more artists like {{custom.artist_follow_name}}!"

What if you fail to capture the artist? Use liquid templating to show a default text if the attribute doesn’t exist or is empty:

"Hey {{custom.first_name | default:"there"}}, we haven't seen you in a while! Follow more artists like {{custom.artist_follow_name | default:"the ones you love"}}!"

See our documentation on how to log a custom event here: