> Synerise Documentation — Assets > > This file contains the complete "Assets" section of the Synerise documentation. Each article begins with a top-level "# " heading. The manifest listing all sections is at https://hub.synerise.com/llms-full.txt # Events Events are customer activities on the website (visits to a website, adding a product to a shopping cart) and also user's activities towards customers (such as sending messages to them). They are the basic input used for analyses and further actions in Synerise. ## Contents # Introduction to data import If you have data in the external sources and you would like to upload it to Synerise, you can use the data import feature in Data Modeling Hub that allows you to import the following data types to Synerise: - profiles - transactions - events - promotions - vouchers - catalog’s records
The modal with selecting the type of data to import
The modal with selecting the type of data to import
### Import methods During the process of import, you must select how you will import data to Synerise. You can choose from the following options: - Import local file - This method allows you to upload only a `.csv` file from your device and map the columns contained in the file with the equivalent parameters in your workspace. **Recommended use**: Single import of `.csv` files. - Import in Automation - This method allows you to declare how you will provide a file (.`csv`, `.json`, `.jsonl`, and `.xml` ) for import and then you will be redirected to a workflow template which you can adjust to your business assumptions. The template contains a [Data Transformation node](/docs/automation/operation/data-transformation-node) that allows you to select transformation rules if the imported data need modification before the import to Synerise. **Recommended use**: Imports of files stored in external servers (using HTTP and SFTP protocol), periodic imports;
The modal with selecting the import method
The modal with selecting the import method
## Business benefits --- - The possibility to use AI-powered features, prepare recommendations and adjust communication content and content on your website to customer preferences. - Extending the amount of data to gain even broader perspective. - Enlarging your customer database you gain in the external sources. - Importing information about past and current promotions. - Enriching your marketing activities with vouchers. ## Requirements --- - You need user permissions that grants you access to Data Modeling Hub or/and Automation Hub. - The imported files must be smaller than 200 MB. # Introduction to events Events are customer activities on the website (visits to a website, adding a product to a shopping cart) and also user's activities towards customers (such as sending messages to them). They are the basic input used for analyses and further actions in Synerise. ## Use of events --- Events are used mainly in the **Decision Hub**. Because events and their parameters are measurable, users can build various types of analyses. They can group customers into segments, create funnels, count the occurrence of events, their sum, average, minimum and maximum values, prepare reports, calculate conversion rates, build loyalty point structures and so on. They are used in the **Automation Hub** as well. A workflow created in this hub can by triggered by a particular behavior of a customer and their behavior can also determine progressing through the workflow as well. The **AI hub** analyzes events such as visits to the website and purchases to predict churn rate or predict the most successful conversion path. Whereas the statistics of the **AI Hub** are prepared based on product purchase, product search and search click events. ## Event types --- There are two types of events: - default events - these events are collected as a result of implementing a tracking code into the website, SDK event tracking, automations, and more. Examples: `page.visit`, `message.send`, `transaction.charge`. A full list is available [here](/docs/assets/events/event-reference) - custom events - these are all events defined by a user and added on the interface or sent to Synerise. ## Collecting events --- Events are collected as a result of: - [Implementing a tracking code](/docs/settings/tool/tracking_codes) into a website - [SDK event tracking](/developers/web/event-tracking) - API tracking To power the application with archival data, users can also import historical events to Synerise. ## Event definitions --- In **Data Modeling Hub > Events** - You can check the event definitions with description (if added) and parameters assigned to the events. The definitions manage what kind of data is accepted by an event or added to that event when its [enriched](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs).
Event details available on the list of events
Event details available on the list of events
## Viewing events --- In **Behavioral Data Hub > Profiles > Customer's profile > Activity list**, The activity list contains actual events received from customers. Clicking an event results in displaying the details:
Event details available on the activity list on the customer's profile
Event details available on the activity list on the customer's profile
## Event retention --- Each event in Synerise has a defined time range when it is available in the random-access memory. It means that it's available for Synerise users in the application for creating analyses or available on the activity list on the customer's profile. Custom events added by a user are available for 30 days by default. Other events, generated by Synerise in response to the customer's behavior on the website or by actions taken towards customers by Synerise users have various retention period. By default, the retention of events (if not stated differently under a contract): - page visits - 30 days - message events - 90 days - transactions - lifetime ## Denylist of event parameters --- The following event parameters are denylisted by default in every workspace. This means you cannot access them in filters or use them as filter conditions across the Synerise platform. Additionally, denylisted event parameters cannot be used for [event enrichment](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs).
The denylisted event parameters may occur in the event details (in the **Raw data** tab) on the [profile activity list](/docs/crm/crm-profile#activity-list).
| Event name | Denylisted event parameters | |-------------------------|-------------------------------------------------------------------------------------------------------------| | [All events](/docs/assets/events/event-reference/common-parameters#base-parameters) | snr-original-time, nonTradingDays, ssuid, uuid, eventUUID, time, clientId, client_id,
businessProfileId, business_profile_id, formFieldsMapping, formData, ogTags, apikey, tck | | [`session.end`](/docs/assets/events/event-reference/web-and-app#sessionend) | session_start_event_uuid, last_activity_date | | [`transaction.charge`](/docs/assets/events/event-reference/items#transactioncharge) | products`*` | | [`page.visit`](/docs/assets/events/event-reference/web-and-app#pagevisit) | init, last, color, current, ecookies, res, ver, u24_visits, snr_sdk_version | | [`dynamicContent.show`](/docs/assets/events/event-reference/dynamic-content#dynamiccontentshow) | ip | | [`recommendation.generated`](/docs/assets/events/event-reference/recommendations#recommendationgenerated)| results, xRequestId | | [`recommendation.view`](/docs/assets/events/event-reference/recommendations#recommendationview) | xRequestId | | [`recommendation.click`](/docs/assets/events/event-reference/recommendations#recommendationclick) | xRequestId | `*`The list of products in the transaction is preserved; a separate [`product.buy` event](/docs/assets/events/event-reference/items#productbuy) is generated for each product. # Introduction to catalogs Catalogs section enables you to take care of your company data. It is a place, where you are able to run and manage items such as tags, attributes, events, and so on. The most popular use of catalogs is to create a catalog that includes product descriptions or customers’ email addresses. ## Use cases --- - [Supplement data in custom events](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) with data from a catalog. - Prepare catalogs on the basis of imported [product feed](/use-cases/import-product-feed-to-catalog). - Store additional information about your customers and use them in communication with customers to personalize the contents of the message. ## Requirements --- - Permissions that allow the access to Catalogs section and adding new catalogs. # Changes to Documents This article contains a summary of the changes to the Screen views feature. ## Terminology With the release of the new version of the Documents feature, we introduce new terms: - **Group** - It functions as a tag, you can assign documents to various groups. While creating a screen view campaign, you can select a group of documents which will be included in the campaign. Tags also help you you with management of content in screen view campaigns, for example, you can add a new document to a group, and it will automatically show in the screen views which use that group. - **Priority** - A parameter that defines the order of displaying documents (1 is the highest, 99 is the lowest). ## Summary See the comparison below to find out what has changed in the feature recently. | Now | Before | |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | You can select the audience of the document while creating a document | The document was visible for all app users by default. Defining
the audience of the document was only available through creating a screen view campaign with this document. | | You can define the priority of the document | You couldn't define the priority of the document in its settings,
however, you could define the priority of a screen view
campaign a document was used in. | | You can assign a document to a group | You couldn't assign a document to a group/category | | No document versioning | You could define the versions of the document to publish | | A document can have the following statuses:
- **Active** - a document is visible to a profile in a mobile application
- **Scheduled** - a document will be activated at a fixed date
- **Draft** - a document is inactive and editable
- **Paused** - a document that was previously active is not visible in a mobile application, it can be edited and activated again
- **Finished** - a document is not visible, it can't be edited or run again. | A document could take the following statuses:
- Published - a document was published
- Unpublished - a document was active
Documents in both statuses were visible
in the application, however, the document received
the published status, when the **Publish** option was selected.
| | You can schedule a document display | You could schedule a document display | ## UI changes ### General | Now | Before | |-----|--------| | Document wizard | Document wizard | ### In detail | Action | Now | Before | |----------------------------------------|-----|--------| | Define a document title | Doc name | Doc name | | Define the document recipients | Document audience (recipients) field in the new interface | n/a | | Define an identifier of the document | Document identifier (slug) field | Document identifier (slug) field | | Define the type of the document | Document type field | Document type field | | Define the description of the document | n/a | Document description field in the old interface | | Define the content of the document | Document content (body) editor in the new interface | Document content (body) editor in the old interface | | Assign a document to a group/category | Document group and category assignment field | n/a | | Define the priority of a document | Document priority field | n/a | | Preview a document | Document preview in the new interface | Document preview in the old interface | | Schedule a document | Document scheduling settings in the new interface | Document scheduling settings in the old interface | ## Deprecated endpoints - [Create a document - /document](https://hub.synerise.com/api-reference/asset-management#operation/createDocumentPost) - [Get document versions - /document/{uuid}/versions](https://hub.synerise.com/api-reference/asset-management#operation/documentVersionsGet) - [Publish document - /document/{uuid}/publish](https://hub.synerise.com/api-reference/asset-management#operation/documentPublishPost) ## Q&A ### 1 How to create a document? The only difference in the processes before and now is defining the audience. You can also define priority and a group of the document, however, it's optional. If you create a new document, you must complete the following steps (these steps are also required when you edit an existing document): 1. Define the recipients of the document.
Documents in the previous version worked as if the audience was set to **Everyone**.
2. Create the content of a document. Optionally, you can define the priority of a document and assign a group (category to a document). 3. Schedule the activity time (when this document will be visible) of the document. ### 2 How to make my existing document work as previously? The core logic of documents remains the same - you can use documents to inject an object with a specific content into a mobile application. If you're happy with the settings of your active documents, you don't have to do anything. You can still use documents on their own or use them in the [Screen view](/docs/campaign/screen-views/whats-new) campaigns. ### 3 What will happen with existing documents? #### In terms of document status: --- - If the document was published (Published), the document: - receives the **Active** status, - the Audience section is set to **Everyone**, - other versions of the documents, if existed, are deleted - If the document was active (Unpublished), the latest version of the document will be kept and its status will be set to **Draft**. - Expired documents will be deleted You can edit only **Draft** and **Paused** documents. #### In terms of unsupported options --- - If a document has more than one version, the latest is kept and older versions are deleted. - The value of the **Description** field available in the configuration of the document is not visible on the interface. # Introduction to Schema Builder Schema Builder allows you to prepare schemas for working with different kinds of data. You can also create relations between schemas to govern how records of different schemas are correlated. This can be used in combination with other features, such as automations, to create practically limitless opportunities. The articles in this section provide a step-by-step guide to working with the Schema Builder. ## Terms to know ### Schemas Schemas define a layout for data. That layout instructs what kind of data can be saved to a *record* and also how it should be displayed by a GUI. For example, a schema can be used to prepare a form where a person enters their personal details, or where you store information about a product. ### Records A record is a single entry with data, according to a schema. If the schema is a form where a person enters their data, the record stores the data of one person. ### Relations Relations between schemas allow you to connect records from different schemas. For example, you can create a schema for storing projects and another for storing employees. Then, you can use relations to connect employee records with project records.
Relations are not mutually exclusive - at the same time, you can have a relation that allows each person to be assigned to only one project and another, where a person can belong to many projects. An example use case for this is creating one relation to list project leaders (a person can only lead one project at a time) and another relation to store project stakeholders (a project leader can be involved in the workflows of many other projects).
# What makes Brickworks different
This feature is in a [public preview](/glossary/#public-preview) mode.
Brickworks is a flexible schema-building feature within the Synerise platform that allows you to define and customize exactly what kind of data you want to work with. Whether it’s managing content for blog posts, product catalogs, loyalty programs, or marketing campaigns, Brickworks lets you design the structure, storage, and relationships of your data precisely according to your business needs while leveraging Synerise’s AI and customer behavior features to deliver personalized, real-time experiences, all while integrating multiple data sources into a single unified environment. ## What makes Brickworks truly different? ### Complete schema flexibility Build your content architecture exactly how your business works using flexible schema definitions. Define any type of object or entity - from simple posts to complex commerce catalogs, loyalty programs, or campaign content. Every content type, field structure, and relationship is defined by you, for your specific use case. Manage and generate all [records](/docs/assets/brickworks/core-concepts#record) through a simple, secure REST API or in the Synerise platform using Jinjava tags. Control when content is published and available. ### Native Synerise integration When you [create a schema](/docs/assets/brickworks/quick-start/creating-a-schema), you can add [Synerise object fields](/docs/assets/brickworks/synerise-objects), which let you retrieve values of the following Synerise objects to your schema: - Advanced [promotions](/docs/ai-hub/promotions) and [vouchers](/docs/assets/code-pools) - [AI-powered product recommendations](/docs/ai-hub/recommendations-v2) - Real-time [metrics](/docs/analytics/metrics) and [expressions](/docs/crm/expressions) Additionally, you can use real-time [segmentations](/docs/analytics/segmentations) to define the recipients of your schemas and records. ### Unified content and live external data integration Go beyond traditional data integration with true content federation. Connect any external system in real-time through [External Source fields](/docs/assets/brickworks/schema-field-types#external-data) creating federated content, or use dynamic [Jinjava fields](/docs/assets/brickworks/schema-field-types#jinjava-code) for dynamic calculations. Then merge that data with your Brickworks-native content to create unified schemas. Pull live inventory from your ERP, customer data from your CRM, product information from PIMs, or dynamic pricing from any API—all automatically combined into a single, coherent content model that's validated and ready for personalization. ### Enterprise-grade validation and type safety Nothing is hidden. Every record is strictly validated against your custom schema, ensuring complete data integrity and consistency across all your content, integrations, and personalization rules. Any attempt to store data violating validation rules in your declared schema will return a clear validation error, giving you full transparency and control over your data structure. ### Dynamic content with Jinja templating Create truly dynamic content using powerful [Jinjava templating capabilities](/developers/inserts/insert-usage). Your content can adapt not just based on behavioral data but also incorporate real-time calculations, conditional logic, and data transformations directly within your content fields. This means your content is never static—it's a living, breathing part of your customer experience that changes based on context, behavior, and business rules. ### Real-time content personalization Combine Brickworks content with [Synerise objects](/docs/assets/brickworks/synerise-objects) (such as results of [aggregates](/docs/crm/aggregates), [expressions](/docs/crm/expressions), [metrics](/docs/analytics/metrics), [AI recommendations](/docs/ai-hub/recommendations-v2), [promotions](/docs/ai-hub/promotions), and [voucher pools](/docs/assets/code-pools)) to deliver hyper-personalized experiences that adapt based on customer behavior, preferences, and real-time context. ### Built for your business, powered by AI Whether you're managing a complex e-commerce catalog, running sophisticated loyalty programs, or orchestrating multi-channel marketing campaigns, Brickworks gives you the flexibility to build exactly what you need—while automatically optimizing every interaction through behavioral intelligence. ## Advantages --- - You can design your exact content model - You get CMS which adapts to your business logic - You get a tool which has built-in behavioral personalization - You get a tool which unifies data - You are provided with complete flexibility with enterprise reliability ## What's next? --- Before you go [create your first schema](/docs/assets/brickworks/quick-start), you can become familiar with: - [core concepts](/docs/assets/brickworks/core-concepts) and [limits](/docs/assets/brickworks/limits) which may impact the final method of implementing schemas in your workspace. - the [quickstart](/docs/assets/brickworks/quick-start) article that contains guidelines on creating schemas and records Additionally, you can check the [type of fields](/docs/assets/brickworks/schema-field-types) you can add to a schema and what kind of [Synerise objects](/docs/assets/brickworks/synerise-objects) you can use there and how to configure it. Once your [schemas](/docs/assets/brickworks/core-concepts#schema) and [records](/docs/assets/brickworks/core-concepts#record) assigned to the schema are ready, you can invoke the results in message templates by using [Brickworks Jinjava tags](/docs/assets/brickworks/brickworks-jinjava-inserts). # Introduction to documents Documents are objects that allow you to build mobile applications or create single elements to display in the applications. Thanks to the coherent scheme nomenclature and encoding the content in JSON, the application is able to parse the encoded data and take actions specified in the content. Documents can recycle data from other documents or retrieve data from various services. There are no restrictions for any component to use documents, provided a component is able to retrieve data through the API and pass it further to present the data in an appropriate format on the interface. While creating documents, you can indicate the audience to which the document will be displayed in the application. In your document library, you can group documents based on your business units, customers, or other factors. This helps you to keep all of your documents organized and if you create a [screen view](/docs/campaign/screen-views) campaign, you can select a group of documents at once. ## Business benefits --- - Building a presentation layer of a mobile application without the necessity of releasing another version of the application - Easy implementation - Recycling content created in the Synerise application to develop a coherent marketing communication - Preparing documents for specific audiences and organizing them into categories (groups) - Possibility to use documents in [Screen view campaigns](/docs/campaign/screen-views/creating-screen-views) ## Terminology --- - **Group** - It functions as a tag, you can assign documents to various groups. While creating a screen view campaign, you can select a group of documents which will be included in the campaign. Tags also help you you with management of content in screen view campaigns, for example, you can add a new document to a group, and it will automatically show in the screen views which use that group. - **Priority** - A parameter that defines the order of displaying documents (1 is the highest, 99 is the lowest). - **Type** - Another method of categorizing documents. You can define the purpose of the value in the **Type** field (for example, you can use this value to indicate the way of processing of the content in your mobile application). ## Requirements --- - Create a [Profile API key](/docs/settings/tool/api) that has the following permissions: - from the **Schema** permission group: - `SCHEMA_SERVICE_SCHEMA_CREATE` - `SCHEMA_SERVICE_SCHEMA_READ` - from the **Document** permission group: `SCHEMA_SERVICE_DOCUMENT_READ` - Prepare the content you want to use in your documents. You can insert [promotions](/docs/ai-hub/promotions), [recommendations](/docs/ai-hub/recommendations-v2), analyses, other documents, and so on. - If you want to use recommendations, make sure you have [configured AI recommendations](/docs/ai-hub/recommendations-v2/introduction-to-recommendation-campaigns#requirements). ## Document statuses --- A document can have the following statuses: - **Active** - a document is visible to a profile in a mobile application - **Scheduled** - a document will be activated at a future date; you can pause or finish the scheduled document - **Draft** - a document is inactive and editable - **Paused** - a document that was previously active is not visible in a mobile application, it can be edited and activated again - **Finished** - a document is not visible, it can't be edited or run again. ## Exemplary usages --- Document wizard **Build separate sections in an application** The following examples present two documents: AI-driven recommendations and a promotion. These documents use the content created in the Synerise application in order to present a collection of products matched to users' preferences and needs. These documents can be easily edited in terms of the layout (their order may be swapped) and the content itself can present different sets of promotions or types of recommendations (provided you have created them before). **slug: recommended**
{
  "name": "Best offers for You",
  "recommendations": "{% recommendations_json3 campaignId=XRHP6iVS20SG %} {% endrecommendations_json3 %}"
}
**slug: content-widget**
{
  "section-type": "content-widget",
  "background-color": "#ffffff",
  "title": "Best offers for you",
  "action": { 
    "method": "ContentWidget",
        "slug": "{% document recommended %}"
}
}
This example involves inserting the AI recommendations that require you to use an HTTP POST method within the schema-service API. However, normally everywhere else you need to use an HTTP GET. The example is based on our own content Widget for Mobile ([iOS](/developers/mobile-sdk/displaying-recommendations/content-widget/ios), [Android](/developers/mobile-sdk/displaying-recommendations/content-widget/android)).
**slug: autumn-collection**
{
"content-type": "promotion",
  "background-color": "#123321",
  "title": "Seasonal Promotion",
  "promotion": "{% promotion %} insert here the promotion uuid {% endpromotion %}"
}

**Build an application entirely based on documents** You can use documents in order to create a main panel which acts as a container of other documents managed through the Synerise backend. It can be the first screen users see when they log in to the application. The main view can take the following structure: **slug: main**
{
  "sections": [
    "{% document welcome %}",
    "{% document autumn-collection %}",
    "{% document content-widget %}",
    "{% document club %}",
    "{% document daily-promo %}",
    "{% document promo-api %}",
    "{% document promo-sdk %}"
  ],
  "type": "sections-list"
}
# Managing event definitions The activity of your website's visitors is saved in Synerise as events. For example, opening the page is saved as the `page.visit` event. Sometimes, events also define the activities directed to the user, such as sending an email (`message.send`) or a web push notification (`webpush.send`). The application can generate these events thanks to the [implementation of a tracking code](/docs/settings/tool/tracking_codes) and/or mobile SDK. The events are identified by their *action* property, which takes a `.` format. You can add custom event definitions in the following ways: - Through the interface (described in this article) - Through the API by using the [Custom event](https://hub.synerise.com/api-reference/data-management#operation/CustomEvent) method. When you use that method to send an action which is not known in the system, a definition is created automatically from the new data. By default, the custom events you add have a 30-day retention period.
You can use custom events to [train recommendation models](/docs/settings/configuration/ai-engine-configuration/custom-model-training).
## Requirements --- You must have permissions to access Data Modeling Hub and perform operations there. ## User interface of the event manager --- #### Event list This section explains the columns on the list of events. You can define the event data displayed in the columns described below in the ["Adding event definitions" section](#in-the-web-application).
An example event on the list of events
An example event on the list of events
| Column name | Description | |----|------| | **Name** | This column contains both names of the event: display name (top one) and source name (bottom one). It identifies the name of the event and lets you search the list with it. | | **Description** | This column contains the event description, this description is taken from the **Description** field from the **Overview** tab in the event details. We strongly encourage you to add description to the events you create, so other workspace users know the event purpose. | | **Enriched by** | This column contains the catalog names which are used to enrich event information. | | **Visibility** | This column shows you the status of the event visibility in the filters across the Synerise platform. You can change it, by hovering a mouse cursor over the eye icon and clicking it.
Visibility
| #### List of parameters in event preview This section explains the table in the **Parameter** section in the event details preview. You can find instruction on adding parameters to events in [the "Adding parameters to events" section](/docs/assets/events/adding-event-parameters#adding-parameters-to-events).
A fragment of event parameter list available in the Parameter section in the event detail preview
A fragment of event parameter list available in the Parameter section in the client.addTag detail preview
| Column name | Description | |----|------| | **Name** | Lists the event parameters attached to this event. For each parameter, it shows two versions of the parameter name: the **Display Name** (shown at the top) which is user-friendly, and the **Event name** (shown below) which is the original technical identifier used internally. | | **Overwritten** | Indicates whether the event parameter uses the default settings inherited from the event (**OFF**), or if custom settings are applied specifically for this parameter within the selected event context (**ON**). For example, in the screenshot, the `name` parameter of the `client.addTag` uses custom settings - the `name` parameter is overwritten by `tagName` across the filters. You can change state of this setting by clicking Three dot icon **> Edit override** and enabling **Override settings for this event toggle**
The Override settings for this events toggle
| | **Parameter description** | Contains a description explaining the purpose of the event parameters, providing context for other workspace users. | | **Visibility** | Displays the current visibility status of the event parameter within filter lists across the Synerise platform. The status is expressed by the eye icon. The color reflects the parameter's overriding state: greyed-out means disabled, active means enabled
Parameter visibility legend

When overriding is enabled for a specific event parameter, you can manage its visibility using the **Visibility override (Show parameter)** toggle. To access this option, click the Three dot icon icon and select **Edit override**. | ## Adding event definitions --- ### In the Web application 1. Go to Data Modeling Hub icon **Data Modeling Hub > Events**. 2. Click **New event**. **Result**: A pop-up appears. 2. On the pop-up, fill in the fields: - **Event name** is the system name of an event, usually in an `context.action` format, for example `page.visit`. - This name can't be changed later. - It must be 2-32 characters long. - Diacritic characters aren't allowed. - The following special characters are allowed: `-`, `_`, `.` - In event data, this value is saved in the `action` parameter. - **Display name** is a human-readable name shown in the **Data Modeling Hub > Events**, Automation and Decision Hubs. - **Description** is shown in the **Data Modeling Hub > Events** menu. - The **JS SDK event settings** determine how the JS SDK can use the event. Make sure you have already configured a [certificate to validate authentication tokens](/docs/assets/events/event-settings#add-a-certificate). For more details, see [Event authentication settings](/docs/assets/events/event-settings).
Display name and description from the Settings tab shown in the event definition list after saving the settings
Display name and description from the Settings tab shown in the event definition list after saving the settings
- **Availability in Analytics and Automation** cannot be changed when adding a new event. You can [change this setting later](#changing-event-visibility-in-analytics). 4. Click **Create and define settings**. **Result**: You are redirected to the view of event settings. - In **Overview**, you can find a summary of the settings you already defined (event name, label, value type, visibility). - In **Event enrichment**, you can select a catalog or catalogs from which you can supply information about the event.
Unconfigured event enrichment section in the settings of an event
Unconfigured event enrichment section in the settings of an event
1. Click **Open**. 2. Click **Add first catalog**. **Result**: A pop-up appears. 3. From the **Catalog** dropdown list, select a catalog whose data will be used to enrich event parameters. **Result**: The **Catalog item key** and **Event parameter** fields appear. 4. From the **Event parameter** dropdown list, match the event parameter with the primary key of the catalog. By clicking the eye icon next to **Primary key**, you can preview values from the primary key column. When the value of the selected parameter is the same as the value in the primary key column of the catalog, the event will be enriched with data available in the corresponding row of the catalog. You can learn more about it in [Event parameters and enrichment](/docs/assets/events/adding-event-parameters). 5. To add more catalogs, click **Add catalog** and repeat steps III and IV. 6. Confirm by clicking **Apply**. - In **Parameters**, you can add event parameters which will contain information related to a particular occurrence of an event. 1. Click **Define**.
Unconfigured event parameters section in the settings of an event
Unconfigured event parameters section in the settings of an event
In [the "List of parameters in event preview" section](#list-of-parameters-in-event-preview), you can find description of the table available in the screen above.
2. Click **Include or create parameter**. 2. To add existing event parameters: 1. Click **Include event parameter**. **Result**: A pop-up appears. 2. On the pop-up, select the parameters which you want to include in the event information. 3. Optionally, if you want to apply custom settings to the parameter for a particular event, enable **Override settings for this event**. Fill out **Display name override**, **Description override**, **Value type override**, and **Visibility override**, to define custom display name, description, event parameter type, and visibility. 3. Confirm by clicking **Apply**. 3. To create a parameter: 1. Click **Create parameter**. **Result**: A pop-up appears. 2. Fill out the configuration form according to instructions in [Adding parameters to events](/docs/assets/events/adding-event-parameters#creating-event-parameters). 3. **Optional**: On the **Display settings** tab, fill in the fields: - **Display name** is a short event title shown in a Profile's [event history](/docs/crm/crm-profile#activity-list). - **Description** is a longer description shown in a Profile's [event history](/docs/crm/crm-profile#activity-list).
Title and details from the Display settings tab shown in a Profile's event history
Display name and description from the Display settings tab shown in a Profile's event history
In **Display name** and **Description**, you can use Jinjava to refer to the event's parameters or add logic. See [instructions and examples](#using-variables-for-displaying-event-data-in-profiles).
### By sending an event to the API When you send a previously unknown event to the [`/v4/events` API](https://hub.synerise.com/api-reference/data-management#tag/Events), the event's definition and parameters are automatically added to the **Data Modeling Hub > Events** view. Such an event has no display name, description, title, or details, and is visible in analytics. The event's parameters are also added, without any descriptions, and are available in analytics. You can edit the event definition and parameters to fill in the additional data. ## Editing event definitions You can update an existing event. Some settings cannot be edited.
The changes may take up to an hour to apply.
1. Go to Data Modeling Hub icon **Data Modeling Hub > Events**. 2. In the list of events, find the event you want to edit. 3. Click the Three dot icon. 4. From the list, select **Edit**. 5. In the window that appears, edit the data in the same way as when [adding the definition](#adding-event-definitions). ### Changing event visibility in analytics By default, each event is visible in analytics. You can enable or disable the visibility of an event in the analytics: 1. In the list of events, hover over the visibility icon of an event. 2. Switch the toggle that appears. ### Adding parameters See [Event parameters and enrichment](docs/assets/events/adding-event-parameters). ### Managing enrichment See [Event parameters and enrichment](/docs/assets/events/adding-event-parameters) ## Using variables for displaying event data in Profiles If you want insert dynamic values or even logic into an event's summary on a Profile's card, you can use Jinjava. ### Inserting event parameters Additional [parameters](/docs/assets/events/adding-event-parameters#creating-event-parameters) which can be used as variables are stored in the `params` object in the event's data. They are accessed with the `{{ params.paramName }}` syntax. You can also access the system parameters outside of the `params` object, for example `{{ action }}`. The `label` parameter is an exception and is always treated as an empty value. #### Example You can use the `params.message` property of the event from the figure below to display a dynamic Title and Details. In this example, a `world.greet` event with a custom `message` parameter is saved to the Profile's history:
Raw data view of an event
Raw data of an event. The highlighted "message" parameter is a custom parameter used in the examples further in this article.
In the event definition for world.greet, `{{ params.message }}` is added to **Display name** and **Description**, the variable is processed and displayed in the event summary:
Display settings of the world.greet event definition with {{ params.message }} in the Display name and Description fields (top), and the corresponding result on a profile card where the variable is rendered as the text Hello world! (bottom)
Display settings of the world.greet event definition with {{ params.message }} in the Display name and Description fields (top), and the corresponding result on a profile card where the variable is rendered as the text Hello world! (bottom)
### Advanced usage You can use Jinjava elements from the following articles: - [Jinjava tests](/developers/inserts/exptest) - [Jinjava filters](/developers/inserts/filter) - [Jinjava tags](/developers/inserts/tag) #### Example If a parameter does not exist or is an empty string, you can insert a placeholder value.
If the parameter is null, its value is processed as the string `"null"`.
In this example, the `dogname` parameter does not exist in an event's data. In the event definition for world.greet, the following Jinjava is added:
Example of Jinjava IF/ELSE statement in the configuration of an event definition
Example of Jinjava IF/ELSE statement in the configuration of an event definition
On a Profile card, the variables are processed and displayed in the event summary:
Example of the above IF/ELSE statement's result in a Profile card. The IF condition was not met and the ELSE result is displayed
Example of the above IF/ELSE statement's result in a Profile card
# Quick start This article contains guidelines on schemas and records. ## Prerequisites --- To be able to create schemas and records on the user interface, you must be assigned a role with the [Brickworks user permissions](/docs/settings/identity-access-management/permissions/data-management-permissions#work-with-brickworks). ## Schema setup workflow --- 1. **Prepare connections to external sources (optional)** Establish connections to external services or APIs to fetch data that will be integrated into your schema. This step is optional but often required before creating a schema. Instructions for creating external sources are available in [Creating an external source](/docs/assets/brickworks/creating-external-source). 2. **Create a schema** Define the structure and fields of your data using a schema tailored to your needs and optionally define the [schema audience](#schema-and-record-audience). Instructions for creating schemas are available in [Creating a schema](/docs/assets/brickworks/quick-start/creating-a-schema). 3. **Fill the schema with data** Populate the schema with data. Each data submission creates a single record based on that schema. Instructions for creating records are available in [Creating a record](/docs/assets/brickworks/quick-start/creating-a-record). 4. **Generate an object with a record result using Jinjava, REST API, mobile SDK** Instructions for generating an object is available in [Generating objects](/docs/assets/brickworks/generating-objects). ## Schema types --- Brickworks offers three schema types: simple, managed, and singleton.
Each schema type has its constraints; make sure you become familiar with the [limits](/docs/assets/brickworks/limits).
### Simple schema --- A lightweight schema without versioning. - Records created from this schema can only get the [published state](/docs/assets/brickworks/record-lifecycle#record-states). - This schema type can be used with asynchronous APIs. ### Managed schema --- This schema type lets you create draft records before publishing them, and keep a version history of the records. - When a schema is first created, the API response includes the `version` parameter set to 1. - Each time you modify and save the schema, the API response includes a `schemaVersion` parameter that indicates the current schema version. - In the Synerise platform interface, the latest schema version is always displayed. - It is not possible to retrieve schemas by their version through the API and preview schema versions on the interface of the Synerise platform. - When content is generated, the latest version of the schema is used. If the record was made with an older version of the schema: - Fields that were removed from the schema are not returned, even if they exist in the record. - Fields that were added and are not in the record receive the default value from the schema, if applicable. ### Singleton schema --- This schema type doesn't store records. Content is generated from the default value in the schema or Jinjava. - Doesn't store records. - All fields must have a default value. This will be used when generating content. This includes Jinjava fields, whose default value can be Jinjava code. It is processed when you generate content. - When generating content, use the schema's API name (`appName` in API requests)/UUID in place of record slug/UUID. - From the schema editor view, you can preview a singleton schema in the same way as you would [preview a record](/docs/assets/brickworks/quick-start/creating-a-record#previewing-records). - You can pass values for Jinjava fields in the same way as when generating content from records. ## Schema and record audience --- In the settings of the schema, you can define its recipients. [Records](/docs/assets/brickworks/core-concepts#record) created based on the schema inherit audience settings from that schema and the [object generated with record results](/docs/assets/brickworks/generating-objects) will be only visible to the profiles who meet the audience conditions. Here are a few reasons why you would want to define an audience for a schema: - personalization - it allows for more personalized content, recommendations, or offers by applying the schema only to relevant users. - data organization - helps organize and segment data efficiently by associating it with specific user groups or segments. - targeted analytics - enables more precise analysis and reporting focused on defined audiences, improving insights and decision-making. - access control - facilitates managing access rights, ensuring that only the relevant users or teams interact with certain data schemas. - performance optimization - reduces unnecessary data processing by limiting schema usage to specific audiences, improving system performance. - compliance - helps ensure compliance with data privacy regulations by limiting data usage to appropriate user groups. ## Record lifecycle --- For detailed information on record versions for the managed schemas, record states, and record publishing workflows, see [Record lifecycle](/docs/assets/brickworks/record-lifecycle) ## Record usage guidelines --- - **Audience inheritance** Records inherit audience settings from their schema. If you attempt to generate an object based on a record for a profile that does not belong to the intended audience, a [brickworks.generated](/docs/assets/events/event-reference/brickworks#brickworksgenerated) event is generated with the `matchedAudience` parameter set to `false` on the activity list of that profile. - **Populate a record with values expected in the fields** Fill each [field](/docs/assets/brickworks/schema-field-types) with a value matching its data type—use strings for [string fields](/docs/assets/brickworks/schema-field-types#string), booleans (true or false) for [boolean fields](/docs/assets/brickworks/schema-field-types#string), and avoid using Jinja templating in fields that require static values. You can learn more about fields in [Field types](/docs/assets/brickworks/schema-field-types) - **Using Jinjava field type** - Full Jinja templating is allowed only in the [Jinjava code field type](/docs/assets/brickworks/schema-field-types#jinjava-code), - When using the Jinjava field type, consider inserting attributes conditionally. This approach helps handle cases where the requested attribute might be missing from the [profile’s data](/docs/crm/crm-profile). You can learn more about this in [Insert usage](/developers/inserts/insert-usage#good-practice-check-if-value-exists-before-using-it). - **[Brickworks inserts](/docs/assets/brickworks/brickworks-jinjava-inserts) are allowed in**: - the **Primary key** field in the settings of the [catalog field](/docs/assets/brickworks/synerise-objects#catalog), - the **Item context** field in the settings of the [AI recommendation field](/docs/assets/brickworks/synerise-objects#ai-recommendation), - in the [Jinjava code field type](/docs/assets/brickworks/schema-field-types#jinjava-code). - **Generating objects with record results** To use the record result in your desired distribution channel, you can invoke it through the Jinjava and API/SDK methods. For more information, see [Generating objects](/docs/assets/brickworks/generating-objects) - **Changes to the schema don't impact the published and draft records** [Editing a schema](/docs/assets/brickworks/quick-start/creating-a-schema#editing-schemas) does not automatically update or modify existing records. In the record editor, you will see changes reflected (for example, new fields will appear), but you must manually fill in any new fields and save the record for the changes to take effect. ## Contents --- Below you can find instructions on how to create a schema and a record on the user interface in the Synerise platform. To see how to create schemas and records through API, see [Generating objects](/docs/assets/brickworks/generating-objects). # Catalogs Catalogs is a feature that facilitates the import of a CSV file (without the size limits). The data sent in the catalogs can be later used to support the data gathered in the system. ## Benefits --- - [Supplement data in custom events](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) with data from a catalog. - Create catalog on the basis of [imported product feed](/use-cases/import-product-feed-to-catalog) to request products by their `sku` - Store additional information about your customers and use them in campaigns to personalize the contents of the message. ## Requirements --- - Permissions that allow the access to Catalogs section and adding new catalogs. ## Contents # Creating a schema A schema acts as a template for [creating and organizing records](/docs/assets/brickworks/quick-start/creating-a-record), ensuring consistency and structure across your data sets. In this article, you will walk through the process of creating a schema (**Products**) that includes the following fields: - the name of the item - the ID of the item - information about the item - recommendations which will return similar items to the defined item The details of the item will be provided while [creating a record](/docs/assets/brickworks/quick-start/creating-a-record). This example demonstrates how Synerise objects, specifically a catalog and an AI recommendation, can be utilized within a schema. While [creating a record](/docs/assets/brickworks/quick-start/creating-a-record) you will specify the item and will be able to preview recommendation results.
Before creating a schema for your business scenario, we recommend you become familiar [Limits and constraints](/docs/assets/brickworks/limits) as it may affect implementation of the scenario.
The example schema configuration
The example schema configuration
## Procedure --- 1. Go to Data Modeling Hub icon **Data Modeling Hub > Schemas > New schema**. 2. Select one of the following schema options: - **Managed schema** - **Simple schema** - **Singleton schema** See the ["Schema types" section](/docs/assets/brickworks/quick-start#schema-types) for an explanation for each type. 3. On the pop-up, provide the following data: - In **Display name**, enter `Products` In this field, you must provide the schema name; value in this field is displayed on the list of schemas only (Data Modeling Hub icon **Data Modeling Hub > Schemas**). - In **API name**, the value is pre-filled (`products`), if you want to change it, provide your own API name variant. The value in this field is the unique identifier used to reference this schema in API requests. - In **Description**, describe the schema’s purpose to help workspace users understand its function, for example, `Products with Synerise recommendations` This description will display on the list of schemas only. 4. Confirm by clicking **Apply**. ### Adding schema fields In this part of the process, you will add [fields](/docs/assets/brickworks/schema-field-types) to the schema. The schema will contain various field types: [strings](/docs/assets/brickworks/schema-field-types#string) and [Synerise objects](/docs/assets/brickworks/synerise-objects) (a [catalog](/docs/assets/catalogs) and [AI recommendation based on the similar item model](/docs/ai-hub/recommendations-v2/recommendation-types#similar-items)). This procedure focuses on the configuration of the fields. Later on, you will fill out the schema fields with the actual values, which is described in the [Creating a record](/docs/assets/brickworks/quick-start/creating-a-record) article.
A blank configuration form of a schema
A blank configuration form of a schema; that's how the starting point for creating a schema looks like
#### Field with the product name Add the [string field](/docs/assets/brickworks/schema-field-types#string) which will contain the product name. 1. Click **Add new field**. 2. From the dropdown list, select **String**. 3. Fill out the following fields: - **Display name**, enter the title of the field (`Product name`) which will display in the [record](/docs/assets/brickworks/core-concepts#record). - **Description**, optionally provide a purpose of the field to help other workspace coworkers understand the purpose of the field. 4. Select the **Required field** checkbox. 5. Confirm by clicking **Apply**. #### Field with the product ID Add the [string field](/docs/assets/brickworks/schema-field-types#string) which will contain the product identifier. 1. Click **Add new field**. 2. From the dropdown list, select **String**. 3. Fill out the following fields: - **Display name**, enter the title of the field (`Product ID`) which will display in the [record](/docs/assets/brickworks/core-concepts#record). - **Description**, optionally provide a purpose of the field to help other workspace coworkers understand the purpose of the field. 4. Select the **Required field** checkbox. 5. Select the **Unique value** checkbox. 5. Confirm by clicking **Apply**. #### Field with product information Add the [catalog field](/docs/assets/brickworks/synerise-objects#catalog) - it will let you select a catalog which will be the source of product information.
When creating a catalog, you select a primary key column whose values serve as unique identifiers for the catalog entries. In the [catalog field](/docs/assets/brickworks/synerise-objects#catalog) settings, you can specify how to provide the primary key value: either statically (by manually entering the value) or dynamically, by using [Brickwork Jinjava `{{ context }}` insert](/docs/assets/brickworks/brickworks-jinjava-inserts). In the scenario described in this article, we will use a dynamic primary key value.
1. Click **Add new field**. 2. From the dropdown list, select **Catalog**. 3. Fill out the following fields: - **Display name**, enter the title of the field (`Product details`) which will display in the [record](/docs/assets/brickworks/core-concepts#record). - **Description**, optionally provide a purpose of the field to help other workspace coworkers understand the purpose of the field. 4. From the **Primary key format** dropdown list, select **Jinjava**. 5. Confirm by clicking **Apply**. #### Field with recommendations Add the [AI recommendation field](/docs/assets/brickworks/synerise-objects#ai-recommendation) and select the AI recommendation campaign whose results will be returned in the [record](/docs/assets/brickworks/core-concepts#record).
Some recommendation models based on which you can create [AI recommendation campaigns require item context](/docs/ai-hub/recommendations-v2/recommendation-types#recommendation-model-summary) based on which the results are generated. In the [AI recommendation field type](/docs/assets/brickworks/synerise-objects#ai-recommendation) settings, you can specify how to provide the item context (item identifier): either manually (by entering the item identifier) or dynamically by using [Brickwork Jinjava `{{ context }}` insert](/docs/assets/brickworks/brickworks-jinjava-inserts). In the scenario described in this article, we will use a dynamic item context value.
1. Click **Add new field**. 2. From the dropdown list, select **AI Recommendation**. 3. Fill out the following fields: - **Display name**, enter the title of the field (`Products`) which will display in the [record](/docs/assets/brickworks/core-concepts#record). - **Description**, optionally provide a purpose of the field to help other workspace coworkers understand the purpose of the field. 4. From the **Item context format** dropdown list, select **Jinjava**. 5. Confirm by clicking **Apply**. ### Defining schema audience Defining [an audience for a schema](/docs/assets/brickworks/quick-start#schema-and-record-audience) ensures that the schema’s structure and data apply meaningfully and securely to the intended group of users.
This part of the process is optional. If skipped, the schema audience defaults to everyone.
1. Click the **Audience & Settings** tab. **Result**:
The Audience & Settings section
The Audience & Settings section
2. On the **Audience** section, click **Define**. 3. Choose the schema recipients: - **Everyone** - Everyone you have in [Profiles](/docs/crm). - **Segmentations** - Profiles in selected [segmentations](/docs/analytics/segmentations) will be schema recipients. 1. Click **Segmentations**. 2. On the pop-up, select the segmentations. 3. Confirm by clicking **Apply**. - **New audience** - Create audience by defining the conditions profiles must meet to be recipients of selected schema. 4. In the **Audience** section, click **Apply**. ### Reviewing schema settings In the **Audience & Settings** tab, you can preview the **API name** and schema description you defined at the beginning of the process. You can only edit the description at this stage. ### Saving schema In the upper-right corner, click **Save**.
The final configuration of a schema
The final configuration of a schema
## Next steps --- As the next step, you will [create a record](/docs/assets/brickworks/quick-start/creating-a-record) out of the created schema. ### Editing schemas When editing existing schemas, keep the following points in mind: - Modifying schema does NOT affect existing records. If the field has a default value, that value will be applied when content is generated from the record. - Removing a field from a schema does NOT remove it from existing records; but when content is generated from such a record, that value is ignored. - You can't open and view unpublished records created from a previous version of a schema. # Event parameters and enrichment Event parameters are additional pieces of information about a customer activity the event describes. For example, a `page.visit` event can be described by parameters such as: - `IP` (IP address from which a user visited the website) - `UTM source` (the UTM source from which a user was referred to the website) - `device` (the device from which a user accessed the website) - and more For a `product.buy` (an event that describes a purchase of a product) the list of parameters can be long and include: - `name` (name of the product) - `finalUnitPrice` (the final price of the product) - `currency` (the currency of the product) - `quantity` (the quantity of a product) - `og:url` (a page address towards which all shares, likes, and so on, will be counted) - and more Events and their parameters can be used to prepare analyses of various kinds, for example, users can create a metric that counts visits to particular subdomains or they can create an aggregate that calculates the value of abandoned cart for a specific customer.
Become familiar with the [event parameters which are denylisted](/docs/assets/events/introduction-to-events#denylist-of-event-parameters) by default for every workspace. These parameters are still available on the Raw data tab [in event details](/docs/crm/crm-profile#activity-list), if the data is available.
## Creating event parameters ---
If you send an event by using the SDK/API, its parameters (the `params` object) are saved to the database and added to the event's definition automatically. By default, they are visible in analytics. In such a case, you don't need to add the parameters according to the instructions in this article. If needed, you can edit the parameters to add names, descriptions, or enable event enrichment.
1. Go to Data Modeling Hub icon **Data Modeling Hub > Event parameters > Create event parameter**. **Result**: A pop-up appears.
Form for creating event parameters
Form for creating an event parameter
4. In the **Source parameter** field, enter the name of the parameter as it is sent by the SDKs/API. 5. In the **Display name** field, enter a human-readable label for display in the Synerise portal. 6. Optionally, in the **Description** field, you can add an explanation about the purpose of this parameter. 7. From the **Type** dropdown list, select the format of the property value as sent by the SDKs/API. 8. To show this parameter in filters in Decision and Automation Hubs, leave the **Availability in Analytics and Automation** toggle enabled. 9. To complete the process, click **Create**. **Result**: The parameter is saved on the list of event parameters. ## Managing event parameters Event parameters can be used across multiple events within Synerise, and you can manage them centrally from a single location. This centralized management lets you view all events where a parameter appears and configure global settings such as its display name, description, and visibility in filter lists throughout the Synerise platform.
The name parameter which appears in multiple events
The name parameter appears in multiple events - you can change how it's displayed across the filters
Additionally, you can customize a parameter’s title and visibility in analytics specifically for each event it is associated with by using the event parameter override feature. This ensures precise control over how parameters are presented and filtered based on their context. In the filters, when you hover a mouse cursor over the event parameter name for which overwriting is enabled, you can see the source name (original name) of that parameter (as presented on the screen below).
The name parameter which appears in two events: page.visit and client.removeTag
The name parameter which is attached to two events: page.visit and client.removeTag, for the page.visit event this parameter is displayed in the filters as pageTitle and for client.removeTag as tagName
1. Go to Data Modeling Hub icon **Data Modeling Hub > Event parameters**. 2. Open the details of a parameter. 2. In the **Event-level parameter configuration** section, click **Define**. **Result**: A list of events to which this event parameter is attached appears. 3. To add this parameter to an event, click **Include event parameter and configure override**. **Result**: A pop-up appears. ## Adding parameters to events
The Include event parameter and configure override pop-up
The Include event parameter and configure override pop-up
1. From the **Choose event** dropdown list, select the event to which you want to attach the event parameter. If this event is not on the list, you must [create its definition](/docs/assets/events/event-definitions#adding-event-definitions) in the Synerise platform. 2. If you want to: - use the parameter's original settings, click **Add**. - apply custom settings for the event parameter in the context of the selected event, proceed to [Overriding parameter settings](#overriding-parameter-settings). ## Overriding parameter settings
The Include event parameter and configure override pop-up
Configuration form for overriding parameter settings for the specific event
1. Enable **Override settings for this event**. 2. In the **Display name** field, define the name of the parameter which will appear on the filter list across the Synerise platform for the selected event. 3. In the **Description override** field, provide the description for this overridden parameter version. You can provide an explanation or purpose of the override, providing context for other workspace users. This helps collaborators understand what changes have been made and why. 4. From the **Value type override** dropdown list, select the value type of the overridden parameter version. 5. Use the **Visibility override (Show parameter)** toggle to define the visibility of the overridden parameter version in the filter lists for the selected event. 3. Confirm the choice by clicking **Apply**.
See the explanation of [the table in the event parameter details](#table-in-the-event-parameter-details).
## Defining parameter visibility in filters By default, each event parameter is visible in across the filters in the Synerise platform.
An event parameter can be used across multiple events, with custom settings — including visibility — assigned for each event. We recommend reviewing the **Event-level parameter configuration** section in the event parameter details to verify its visibility in the events where it is assigned.
1. Go to Data Modeling Hub icon **Data Modeling Hub > Event parameters**. 2. Open the details of a parameter. 3. In the **Overview** tab, enable or disable the **Availability in Analytics and Automation** toggle. 4. Confirm your choice by clicking **Apply**. ## User interface of the parameter manager ### Table in the list of event parameters This section explains the event parameter list. The list is available in **Data Modeling Hub > Event parameters**.
A fragment of event parameter list available in Data Modeling Hub > Event parameters
A fragment of event parameter list available in Data Modeling Hub > Event parameters
| Column name | Description | |-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Name** | Lists the event(s) that include the event parameter. For each event, it shows two versions of the event name: the **Display Name** (shown at the top) which is user-friendly, and the **Source Name** (shown below) which is the original technical identifier used internally. | | **Description** | Contains a description explaining the purpose of the event parameters, providing context for other workspace users. | | **PII status** | If you enabled [protection of personally identifiable information](/docs/settings/pii-protection) for your workspace, you can mark the parameter as containing personal data. If yo do, the PII iconicon will appear in the column. If not, the space is empty. | | **Visibility** | Shows you the visibility of the event parameter in the filter lists across the Synerise platform.
An event parameter can be used across multiple events, with custom settings— including visibility—assigned for each event. We recommend reviewing the **Event-level parameter configuration** section in the event parameter details to verify its visibility in the events where it is assigned.
| ### Table in the event parameter details This section explains the tables in **Event-level parameter configuration** section within the details of the event parameter.
The Event-level parameter configuration section for the .directedBy event parameter with enabled overwriting
The Event-level parameter configuration section in the details of the event parameters - example .directedBy parameter with enabled overwriting
The Event-level parameter configuration section for the .directedBy event parameter with disabled overwriting
The Event-level parameter configuration section in the details of the event parameters - example .directedBy event parameter with disabled overwriting
| Column name | Description | |------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Name** | Lists the event(s) that include the event parameter. For each event, it shows two versions of the event name: the **Display Name** (shown at the top) which is user-friendly, and the **Source Name** (shown below) which is the original technical identifier used internally. | | **Overwritten** | Indicates whether the event parameter uses the default settings inherited from its global settings (**OFF**), or if custom settings are applied specifically for this parameter within the selected event context (**ON**). For example, in the screenshot, the `name` parameter of the `client.addTag` event is overwritten to appear as the `tagName` parameter. You can change state of this setting by clicking Three dot icon **> Edit override** and enabling **Override settings for this event toggle**
The Override settings for this events toggle
| | **Display name & value type override** | Shows the custom name and data type used to replace the original event parameter name. For example, the original parameter `name` is overwritten and displayed as `tagName`; this column also specifies the data type (e.g., string, number) assigned to the overwritten parameter. | | **Description override** | Contains a custom description explaining the reason or purpose of the overwrite, providing context for other workspace users. This helps collaborators understand what changes have been made and why. | | **Visibility override** | Displays the current visibility status of the event parameter within filter lists across the Synerise platform. The status is expressed by the eye icon. The color reflects the parameter's overwriting state: greyed-out means disabled, active means enabled
Parameter visibility legend

When overwriting is enabled for a specific event parameter, you can manage its visibility using the **Visibility override (Show parameter)** toggle. To access this option, click the Three dot icon icon and select **Edit override**. | ## Enriching events with data from catalogs You can add data from catalogs to an event automatically. This can be used, for example, to automatically add product data to a product-related event without sending that data with the event every time. The data is added to an event from a catalog when the value of the *source parameter* matches a value in the catalog's key. The data of the object identified by that key is added to the event.
The name of the property linked to the catalog does not need to be related to the name of the column that stores the keys. Only one such column exists and the enrichment mechanism detects it automatically.
While defining the [trigger of an in-app message](/docs/campaign/in-app-messages/create-inapp-message#define-trigger-for-the-message), you must use only the original parameters of the event which is selected as the trigger. Parameters that are added by enrichment aren't supported.
Due to the caching, you may need to wait up to one hour until the parameter you want to enrich the event with is added.
### Requirements --- - Before enriching an event with a parameter, ensure the parameter is not on the [workspace’s denylist](/docs/assets/events/introduction-to-events#denylist-of-event-parameters). If it is, the enrichment will not work. - [Create a definition of an event](/docs/assets/events/event-definitions#adding-event-definitions) whose information you will enrich. This event must have at least one event parameter. To see if the event definition exists, go to **Data Modeling Hub > Events**. - [Create a catalog](/docs/assets/catalogs/creating-catalogs) which contains data you want to enrich event information with. You can include as many columns as you need, but for the enrichment process, you'll be limited to using only 5 columns. ### Enrichment limits --- - You can enrich up to 8 events per workspace. - You can enrich an event with data from maximum 2 catalogs. See the ["Conflict resolution"](#conflict-resolution) section in this article to see what happens when the parameter names from 2 catalogs overlap. - You can use up to 10 parameters from a catalog to enrich events. - [Event parameters included on the denylist](/docs/assets/events/introduction-to-events#denylist-of-event-parameters) cannot be used for enrichment. ### Procedure --- 1. Go to Data Modeling Hub icon **Data Modeling Hub > Events**. 2. On the list of events, find an event you want to enrich with data from a catalog. 3. Click Three dot icon.
An example event on the list of events
An example event on the list of events
4. From the dropdown list, select the **Manage enrichment** button. **Result**: A pop-up with enrichment settings appears.
A blank form for enriching an event
A blank form for enriching an event
5. In the **Linked catalogs** section, from the **Catalog** list, select a catalog whose data you want to use to enrich event information. **Result**: The **Catalog item key** and **Event parameter** fields appear.
Catalog item key and Event parameter fields
Catalog item key and Event parameter fields
6. In this step, from the **Event parameter** dropdown list, match the event parameter with the primary key of the catalog. By clicking the eye icon next to **Primary key**, you can preview values from the primary key column. When the value of the selected parameter is the same as the value in the primary key column of the catalog, the event will be enriched with data available in the corresponding row of the catalog. **Result**: The **List of parameters** section appears. 7. To add the next catalog for data enrichment, click **Add catalog** and repeat steps 5 and 6. If you want to enrich an event with information from two catalogs at the same time, the event must include the event parameters linked to the primary key of each catalog if the catalogs don't have the same primary key. 8. In the **List of parameters** and **Show as JSON** sections, you can see the lists: - **Enriching parameters** tab: event parameters with which the event will be enriched, - **Default event parameters** tab: event parameters before enriching, - **All parameters** tab: all event parameters after enriching.
Complete Manage enrichment configuration form
Complete Manage enrichment configuration form
10. If you want to: - add a prefix to the event parameters coming from enrichment, - select or exclude catalog parameters from enriching, - rename the enriched event parameters, click **Manage list**. 12. If you want to differentiate event parameters added through enrichment in the event information, you can add a prefix to them. To do so, select the **Add a prefix to the name** option and provide the prefix. As a result, the system adds `[prefix value].` to the name of the event parameters from enrichment in the event information. For example, you define `movies` as the prefix and the catalog with which you enrich the event information contains the `genre` column. As a result of enrichment, the event information will contain the `movies.genre` parameter. 13. In the **List of catalog properties** section, you are shown the list of available parameters in the catalog. By default, the first 5 parameters are sent to enrich the event. 14. To change the selection of attributes which will enrich the event: 1. Enable **Show bulk actions**. 2. To select a catalog parameter for enrichment, next to the parameter name in the **Catalog parameter name** column, select the checkbox. 3. Set the icon between the columns to Data Modeling Hub icon; this way, this parameter will be used for event enrichment. 4. To exclude the parameter from enrichment, set the icon between columns to Data Modeling Hub icon 15. To change the name under which the parameter will be displayed in the event information, in the **Event parameter name** column, replace the name of the parameter with a new one. The name in the catalog will remain the same. 16. To resolve parameter name [conflicts](#conflict-resolution), click **Check for name conflicts** and follow the instructions on the interface. 16. Confirm the changes by clicking **Save** in the upper right corner. 17. Save the enrichment settings for the event by clicking **Apply**. ### Example result --- When the event parameter value mapped to the catalog's primary key column matches a value in this catalog column, the event information will be enriched with values from the corresponding row in the catalog. The enriched parameters will be available in the `params` object. For example, if you want to enrich a `video.watched` event (which is a custom event) with data about the video that a customer watched, you can send the following event when that video is played, using the data from the example catalog below.
The example catalog with video information
The example catalog with video information
Using the below tabs, check the event before and after enriching with data from the example catalog. The parameters added as a result of enrichment are prefixed by a string defined in the the **Add a prefix to the name** option in enrichment settings or `.` if you left this option unconfigured.
{
  "action": "video.watched",
  ...
  "params": {
    "videoID": "2"
  }
}
{
  "action": "video.watched",
  ...
  "params": {
    "productionYear": "2000",
    "clientId": 0123456789,
    "starring": "Alice Johnson,John Mattinson",
    "uuid": "ce0b66d3-6807-4308-838f-60e29ab2d931",
    "videoID": "2",
    "eventUUID": "9ade0d29-89f7-432b-87f3-6cd87cebdf88",
    "directedBy": "Newton Johnson",
    "runningTime": "65",
    "genre": "drama",
  }
}
### Conflict resolution Conflicts may appear while using two catalogs for event enrichment and both of them contain columns with the same name. You can resolve the conflicts by clicking the **Check for name conflicts option** and replacing the overlapping catalog's column name.
The Check for name conflicts option
The Check for name conflicts option
If you don't rename the overlapping parameters, then the names from the catalog in the **A** tab will be applied during event enrichment. If the parameter from the catalog **A** is empty, then the value from catalog **B** for the corresponding parameter is used.
The genre parameter overlaps
The genre parameter overlaps
# Creating a record Creating a [record](/docs/assets/brickworks/core-concepts#record) means adding the data to the [schema](/docs/assets/brickworks/core-concepts#schema). Practically, it means that you fill out [schema fields](/docs/assets/brickworks/schema-field-types). A group of such schema [records](/docs/assets/brickworks/core-concepts#record) forms a data collection and after saving, you can find them in Data Modeling Hub icon **Data Modeling Hub > Data collections** for a particular schema. This article explains how to create a record in the Synerise platform. The scope of the article includes instructions on: 1. [Creating a record](#creating-records). 1. Selecting a schema to which the record will be added. 2. Filling out the configuration form based on the selected schema. 2. [Saving](#saving-as-a-draft) or [publishing the record](#publishing-options). 2. [Previewing record results](#previewing-records). ## Important notes --- Before creating a record, see [Record usage guidelines](/docs/assets/brickworks/quick-start#record-usage-guidelines). ## Creating records --- In this part of the process, you will add a record to the schema output as explained in the [Creating a schema](/docs/assets/brickworks/quick-start/creating-a-schema) article. ### Procedure 1. Go to Data Modeling Hub icon **Data Modeling Hub > Data collections**. 2. In the header, from **Select schema** dropdown list, select the **Products** schema created according to the instructions in the [Creating a schema](/docs/assets/brickworks/quick-start/creating-a-schema). 3. In the upper-right corner, click **New record**. **Result**: A configuration form opens.
A record made on the basis of schema described in the Creating a schema article
A view of a record made on the basis of the schema described in the Creating a schema article - simple schema variant
1. In **Slug**, enter a URL-friendly, human-readable string, used to uniquely identify a record. Slug is used as a record identifier when generating objects based on the record. A slug can only contain letters (uppercase or lowercase), digits, underscores, or hyphens; however, it cannot begin with an underscore and must contain at least one character. 2. Fill out the schema fields: 1. In **Product name**, provide the name of the product based on which similar recommendations will be returned. 2. In **Product ID**, provide the product identifier of the product. 3. In **Product details**: 1. Select the catalog from which you want to pull item details. 2. In **Primary key**, enter an item identifier in one of the following ways: - A static value. This will be used every time. - A [Jinjava insert](/docs/assets/brickworks/brickworks-jinjava-inserts#retrieving-context): `{{ context.itemIdInCatalog }}` This requires the value to be sent while generating content from the record. - A [Jinjava insert](/docs/assets/brickworks/brickworks-jinjava-inserts#retrieving-values-from-fields): `{{ record.productId }}` This pulls the ID from the **Product ID** field. For inserts, the record is identified by its API name. 4. In **Products**: 1. Select the recommendation which will be used to generate recommendations. 2. In **Item context**, provide the ID of the item which will be the recommendation context in one of the following ways: - A static value. This will be used every time. - A [Jinjava insert](/docs/assets/brickworks/brickworks-jinjava-inserts#retrieving-context): `{{ context.recommendationContextItemId }}` This requires the value to be sent while generating content from the record. - A [Jinjava insert](/docs/assets/brickworks/brickworks-jinjava-inserts#retrieving-values-from-fields): `{{ record.productId }}` This pulls the ID from the **Product ID** field. For inserts, the record is identified by its API name. ## Saving as a draft --- *This option is only available for records in managed schemas*. If you want to save your progress, you can save it as a draft. Draft records remain private and will not be visible publicly. Additionally, attempting to generate an object based on the record’s slug while it is a draft will result in an error. To save a record as a draft, in the upper right corner, click **Save as draft**. The record will be saved in Data Modeling Hub icon **Data Modeling Hub > Data collections** for the **Products** schema. ## Previewing records --- You can preview the record by providing context data (if required). The preview works for all types of schemas (Singleton schemas are treated like records). If your records include dynamic values, they will not be rendered until you select the context needed to obtain them.
Record preview configuration before selecting any contexts
Record preview configuration before selecting any contexts
1. Go to Data Modeling Hub icon **Data Modeling Hub > Data collections**. 2. In the header, from **Select schema** dropdown list, select the **Products** schema. 3. Find the record which you want to preview. 4. Enter the record configuration. 5. Click **Preview**. 6. In the view that opens, add context for the preview: To generate the preview, you only need to fill in the contexts that are required by the record. For example, if the record doesn't include any references to profile attributes, you can ignore the profile context. 1. On the **Profile context** tab, select the profile whose data will be used to generate the preview. 2. On the **Additional context** tab, enter data for `{{ context.* }}` inserts. For example, if you used the `{{ context.itemIdInCatalog }}` when creating the record, in **Key (Name of the property)** enter `itemIdInCatalog` and in **Type & Default value**, provide the value.
Providing a value for the {{ context.itemIdInCatalog }} insert
Providing a value for the {{ context.itemIdInCatalog }} insert
3. On the **Specific fields context** tab, provide additional data for fields that need it. This is only used for recommendation and relation fields. In this example, you can select the **products** field (identified by API name instead of display name) and provide more information to the recommendation engine. You can find the explanation of these parameters in the [API reference](https://hub.synerise.com/api-reference/ai-recommendations#tag/Recommendations/operation/GetRecommendationsByCampaignV2).
Providing extra details to a Recommendation field
Providing extra details to a Recommendation field
4. On the **Transforming response** tab, you can preview the results of a transformation. The feature isn't used in this example. To learn more, see ["Response transformers"](/docs/assets/brickworks/response-transformers). ## Publishing options ### Scheduling publication --- This option lets you delay publishing the record and/or schedule publication within specific time windows (for example, daily between 1 and 4 P.M. over a two-week period). 1. Click the **Settings** tab. 2. On the **Schedule** section, click **Define**. 3. Select one of the following tabs: - **Run immediately** - to publish the record immediately without the end date. - **Scheduled** - to publish the record at the defined date with the expiration date. In the configuration, in **Start date** and **End date**, specify the beginning and end of the period during which the record will be published. 2. From the **Timezone** dropdown list, select the timezone according to which the schedule calendar will apply. 4. If you want to set the time windows in which the record will be in the published status, enable the **Set time windows** option. 5. Use **Daily**, **Weekly**, and **Monthly** tabs to define the frequency of publishing the record. 6. After selecting a tab, define the time window by choosing the start time on the left and the end time on the right. Click the clock icon to select the time. The record status outside the defined time window has the scheduled status. 7. Confirm by clicking **Apply**. **Result**: The publication of the record is scheduled. ### Publishing immediately --- This option lets you immediately publish the record. Optionally, you can publish the record within specific time windows (for example, daily between 1 and 4 P.M. over a two-week period). 1. Click the **Run immediately** tab. 4. If you want to set the time windows in which the record will be in the published status, enable the **Set time windows** option. 5. Use **Daily**, **Weekly**, and **Monthly** tabs to define the frequency of publishing the record. 6. After selecting a tab, define the time window by choosing the start time on the left and the end time on the right. Click the clock icon to select the time. The record status outside the defined time window has the scheduled status. 7. Confirm by clicking **Apply**. ## Next steps --- As the next step, proceed to [generating an object](/docs/assets/brickworks/generating-objects) with record results in a distribution channel of your choice. # Tags Tags let you mark objects in the Synerise platform and you can use them for filtering. Tags can't be deleted.
For tagging profiles, use [profile tags](/docs/crm/customer-tag).
### Use of tags - [Tagging campaigns](/docs/campaign/tagging-campaigns) You can use tags from the predefined **campaigns** folder for tagging [specific campaign types](/docs/campaign/tagging-campaigns#campaigns-available-for-tagging) - [Tagging promotions](/docs/ai-hub/promotions/promotion-tags) You can use tags from the predefined **promotions** folder for: - [filtering promotions](/docs/ai-hub/promotions/managing-promotions#filtering-promotions) on the promotion list - filtering promotions in API responses - [creating promotion filters](/docs/ai-hub/promotions/managing-promotions#saving-filters). - [Tagging workflows](/docs/automation/tagging-workflows) You can use tags from the predefined **automations** folder for tagging workflows. - [Managing communication limits based on tags](/docs/settings/configuration/campaign-limits) ## Adding tags 1. Go to Data Modeling Hub icon **Data Modeling Hub > Tags > Add tag**. **Result**:
A blank tag configuration form
A blank tag configuration form
1. In the **Name** field, enter the tag name. You can use up to 20 characters. 2. From the **Directory** dropdown list, select the folder to which the tag will be added.
To assign a tag to campaigns or use it for [managing communication limits](/docs/settings/configuration/campaign-limits), you must add it to the **campaigns** folder.
3. In the **Description** field, you can provide the purpose of the tag. 2. By using the color picker under the **Description** field, you can change the tag's background color. 3. By clicking **Advanced options** and uploading a tag icon in the **Tag icon** section, you can add the icon to the tag. 4. In the **Priority** field (available after clicking **Advanced options**), you can also assign priority to the tag. Values from 1-100 is accepted (1 being the highest). This feature is used for [filtering promotions based on tags](/docs/ai-hub/promotions/promotion-tags). 5. Save the tag by clicking **Create**. ## Editing tags --- Once you have added tags, you can edit them in the system at any time.
Be cautious when changing tag names, especially if these tags are used in your integrations.
1. Go to Data Modeling Hub icon **Data Modeling Hub > Tags**. 1. Search for a tag you want to edit using the search box marked above the tag list. 2. Next to the tag author, click Three dot icon 3. From the dropdown list, select **Edit**. **Result**: A pop-up appears. 3. Make changes to the tag settings; field descriptions are available in the ["Adding tags" section](#adding-tags). 4. Confirm changes by clicking **Save**. ## Adding tag folders --- Tag folders help you group and organize tags within your workspace. When you create a workspace, predefined tag folders are available by default. These predefined tag folders are also accessible in already existing workspaces, ensuring consistency across your projects. Predefined tag folders include: - **automation** - for [tags assigned to workflows](/docs/automation/tagging-workflows) - **campaigns** - for [tags assigned to communication](/docs/campaign/tagging-campaigns) - **promotions** - for tags [assigned to promotions](/docs/ai-hub/promotions/promotion-tags) To add a new tag folder, follow these steps: 1. Go to Data Modeling Hub icon **Data Modeling Hub > Tags**. 2. On the left panel, click **Add folder**. **Result**: Below the **Add folder** button a text field appears. 3. Provide the name of the folder. 4. Confirm the name by clicking **Enter**. **Result**: The folder is created. To change its settings, for example set the folder type, see ["Edit folder settings"](#editing-folder-settings). ## Editing folder settings 1. In the list of tag folders, hover over the folder you want to edit. **Result**: The folder management icons appear. 3. To open the folder settings, click the Gear icon icon. 4. From the **Type** dropdown list, assign a type to the folder. 5. If you want to edit free-form parameters of the folder: 1. Expand **Advanced options**. 2. Add or remove parameters. 6. Save the settings by clicking **Save**.
If you have assigned tags with a different value to the folder, they will be recalculated according to the value of the folder (as the folder is the parent).
## Removing tag folders 1. In the list of tag folders, hover over the folder you want to edit. **Result**: The folder management icons appear. 3. Click the Red X icon icon. 5. Confirm by clicking **OK**. # Creating catalogs You can create catalogs and upload there a CSV file with data that can be used to further actions in the application. You can also upload JSON and XML files to catalogs through API or by importing. - [Uploading JSON through API](https://hub.synerise.com/api-reference/data-management#operation/addItemsBatch) - [Requirements for importing JSON and XML files](/docs/assets/catalogs/creating-catalogs#requirements) - [Importing product feed to a catalog](/use-cases/import-product-feed-to-catalog)
We strongly discourage you from storing personal data in catalogs. Instead, store this information only in **Behavioral Data Hub**.
## Requirements --- - Permissions that allow access to Catalogs section and adding new catalogs. - **CSV files only**: - Values in one column must be unique because the column itself serves as the key. Otherwise, the values may be overwritten. - Avoid spaces and special characters in the column names and the name of the file. - A file can contain up to 200 000 records. ## Creating a catalog ---
Creating catalogs procedure
A list of catalogs
1. Go to Data Modeling Hub icon **Data Modeling Hub > Catalogs > New Catalog**. **Result**: A pop-up opens. 2. Enter the name of the catalog. You can use the following characters: `a-z`; `A-Z`; `0-9`, `-`
Spaces (` `) are allowed, but not recommended. Catalogs with spaces in their names can't be referenced with [inserts](/developers/inserts/insert-usage#catalogs).
3. Confirm creating the catalog by clicking **Apply**. **Result**: A catalog appears on the list. Its position on the list is defined by alphabetic order (the list is arranged from Z-A). ## Importing data into the catalog --- To learn how to import data to a catalog, see [this article](/docs/assets/imports/importing-data-to-catalogs). Records imported into a catalog will be available on the **Records list** tab.
The preview of a catalog
The preview of a catalog after import of records
## Enriching events with data from catalog --- You can use the data in catalog parameters (columns) to enrich event information. This takes place when the value of a selected event parameter matches the value of the primary key selected in the catalogs's event enrichment settings. You can find more information about enriching event with catalog data and its limits in the ["Enriching events with data from catalogs"](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) section of the ["Event parameters and enrichment"](/docs/assets/events/adding-event-parameters) document. 1. Go to the **Settings** tab. 2. On the **Event enrichment** section, click **Show**. **Result**:
The Event enrichment section
The Event enrichment section
3. In the **Primary key name** field, enter the name of the column whose values need to match the value of the event parameter you will select later. 4. In the **Primary key description** field, enter the description for the primary key which makes it easy for you and other workspace users to identify the key. 5. To select the first event for enrichment, in the **Enriched events** section, click **Enrich first event**. If it's not your first event, click **Enrich an event** button. **Result**: A pop-up appears. 6. From the **Event name** dropdown list, select the event you want to enrich. 7. Follow the instructions from the ["Procedure" section the in Event parameters and enrichment article](/docs/assets/events/adding-event-parameters#procedure), step 5. ## Indexing catalogs --- Indexing a catalog lets you use catalog columns as attributes while creating filter conditions for [promotions](/docs/ai-hub/promotions/managing-promotions#filtering-promotions) and previewing AI recommendations (if the catalog was used for [AI Engine Configuration](/docs/settings/configuration/ai-engine-configuration)). You can select up to 5 columns. ### For new catalogs 1. Go to the **Settings** tab. 2. On the **Indexing attributes** section, click **Show**. **Result**:
The Indexing attributes section
The Indexing attributes section
3. Enable the **Index this catalog** option. 4. Click **Select attributes**. **Result**: A pop-up appears. 5. To select the attributes for indexing, next to the parameter name, select the checkbox. You can select up to 5 attributes. 6. Confirm your choice by clicking **Apply** on the pop-up.
The selection of attributes can only be changed by re-enabling the indexing.
7. Confirm the settings by clicking **Apply** on the **Indexing attributes** section. ### For old catalogs Catalogs created before the 27th of May, 2025 are considered old. All columns in the catalog are indexed automatically by default. To change indexing settings (for example, change scope of indexed columns), you must [remove the index from a catalog](#removing-indexing) and re-enable indexing by following the procedure [for new catalogs](#for-new-catalogs).
Information that a catalog uses old indexing
Information that a catalog uses old indexing
## Check dependencies You can check where the indexed columns are used in promotion filters and recommendations. It's a useful thing to do before making changes to the scope of indexing settings or removing it from the catalog.
Section with catalog columns used in filters across the Synerise platform
Section with catalog columns used in filters across the Synerise platform
## Removing indexing 1. Go to the **Settings** tab. 2. On the **Indexing attributes** section, click **Show**. 3. At the bottom of the section, click **Remove the index for this catalog**. **Result**: A pop-up appears. 4. On the pop-up, review related filters and promotions. 5. You can remove releated filters by enabling **Remove related filters**. 6. Confirm index removal by clicking **Remove the index from this catalog**. # Dictionary / Core concepts Working with Brickworks, you will come across the concepts listed in this article. Get familiar with the terms to make sure you understand what you will work with. ## Schema A blueprint that defines the structure and organization of data [records](/docs/assets/brickworks/quick-start/creating-a-record). It specifies the [fields](/docs/assets/brickworks/schema-field-types), their data types, validations, and relationships among fields. Schemas serve as templates for creating and managing [records](/docs/assets/brickworks/quick-start/creating-a-record). You can customize schemas for each use case: add or remove fields, create references to other objects, define validation (such as required, unique, min/max), and even connect to [external](/docs/assets/brickworks/creating-external-source) or [Synerise-powered objects](/docs/assets/brickworks/schema-field-types#synerise-objects) ([expressions](/docs/crm/expressions), [metrics](/docs/analytics/metrics), [aggregates](/docs/crm/aggregates), [vouchers](/docs/assets/code-pools), [recommendations](/docs/ai-hub/recommendations-v2), [AI Search](/docs/ai-hub/ai-search), [catalogs](/docs/assets/catalogs))
See [limits](/docs/assets/brickworks/limits), including the number of schemas allowed per workspace.
The final configuration of the schema
The final configuration of the schema
### Schema types - **Simple schema** - A lightweight type of schema that does not support versioning or publishing workflows. It offers flexibility and can be used with asynchronous APIs, making it suitable for less complex or dynamic use cases. - **Managed schema** - A schema type that supports versioning records and publishing workflows, allowing you to manage different versions of a record over time. It is suitable for content requiring controlled updates and formal publishing processes. - **Singleton schema** - A schema that doesn't store any records, but content can be generated from default field values and Jinjava. For details, see the ["Schema types" section](/docs/assets/brickworks/quick-start#schema-types). ### Schema identifiers When [generating an object from a record](/docs/assets/brickworks/generating-objects), you can use one of these schema identifiers: - **API name** - A unique identifier of a schema. You must provide it when creating the schema and it can't be changed later. It's shorter and more human-readable than the ID created automatically. In API requests, this identifier is called `appName`. - **ID** (UUID) - Generated automatically when the schema is created. Can't be changed. You can find it in the address bar when you open the schema. ## Record - **Record** - A single data entry within the schema (filling out schema fields with data). - **Record version** - An iteration of a record at a particular point in time, capturing changes made to the record while preserving its historical states.
An example record - which is a filled out configuration form based on previously prepared schema
An example record
### Record identifiers When [generating an object from a record](/docs/assets/brickworks/generating-objects), you can use one of these record identifiers: - **Slug** - An optional identifier. Must be unique within a schema. You can change it when updating a record. You can see it in the record editor, as the first field. - **ID** (UUID) - Generated automatically when the record is created. Can't be changed. You can find it in the address bar when you open the record.
IDs in the address bar in the record editor
IDs in the address bar in the record editor
## Field Refers to a single [field](/docs/assets/brickworks/schema-field-types) in a [record](/docs/assets/brickworks/quick-start/creating-a-record)/[schema](/docs/assets/brickworks/quick-start/creating-a-schema). ### Static and dynamic fields - Static fields have a static value saved in a record, for example, a string field type with a static string value, or numeric field with an integer value. When the record is retrieved, they are returned exactly as they are saved in the record. - Dynamic fields are calculated at the time of the generation request—for example, Jinjava templates are processed, personalized recommendations are calculated, or data from external sources is fetched in real-time. Ensure that you provide values matching the expected field types, for example, enter plain strings for string fields unless dynamic values are explicitly allowed. Fields that accept dynamic values are marked on the list fields under the **Dynamic value** category. ## External data External data refers to a field type category that lets you pull information from external sources or systems outside of Synerise, such as third-party APIs or enterprise systems, which can be integrated into Brickworks schemas for enriched content and functionality. On the user interface, you can come across [**External source**](/docs/assets/brickworks/creating-external-source) which is a single instance of a request to a service such as a CRM, ERP, PIM, or any API to enrich or synchronize values in a record. ## Validation Brickworks ensures all stored data matches your schema requirements through strict validation: - If a field is missing, has the wrong type, or an unexpected key appears, the system returns a clear validation error - No unexpected or undeclared fields are ever stored - Every record for a given object type follows the same structure—no hidden or "rogue" fields ## Real-time federated content [Schemas](/docs/assets/brickworks/quick-start/creating-a-schema) can connect to external APIs and systems for real-time data enrichment: - [External Source fields](/docs/assets/brickworks/schema-field-types#external-data) fetch live data from any external API or system - Synerise objects integrate with Synerise's behavioral intelligence platform - Data is fetched and validated in real-time during record generation ## Other terms - **Context** - Context defines how the record is interpreted and customizes the values displayed within the object. For example, you can specify a profile in the record preview to view the results generated for that profile. - **Data collection** - A collection of records created from a particular schema. - **Display name** - This field appears when creating a schema in the Synerise portal. It's a human-readable, friendly name assigned to a schema, field, or resource that appears in the user interface. It provides an understandable label for users interacting with the system. - **Field context** - Specific metadata or parameters tied to a particular field within a record, defining how that is interpreted. - **Jinjava code** - A templating language used within Brickworks and Synerise to customize and dynamically generate content by embedding logic and variables into templates. It refers to a field type which accepts Jinjava. - **Object** - To display record results in a distribution channel (for example, in a mobile application), you must call an API method which [generates an object](/docs/assets/brickworks/generating-objects) with that record. So, the object is a container for the record results. - **Relations** - Defined connections or links between fields or records within schemas, specifying how data items relate to each other. [Relations](/docs/assets/brickworks/schema-field-types#relations) enable complex data models such as references between objects. - **One to one** - A type of relation where a single record in one schema is linked to exactly one record in another schema, establishing a direct and exclusive association. - **One to many** - A type of relation where a single record in one schema can be associated with multiple records in another schema, supporting hierarchical or grouped data structures. # Creating documents A document lets you inject an object with a specific content into a mobile application dedicated for the specific audiences.
To see the summary of the changes implemented to the Documents feature, see [this article](/docs/assets/documents/whats-new).
#### Assigning groups - In terms of organizing documents, you create groups (categories) and assign documents to them, so you can later manage documents in a convenient way. - If you are using documents in [a screen view campaign](/docs/campaign/screen-views), you can select them one by one from the list of documents or you can select a document group to include all documents assigned to a selected group. - When you add new documents to the group and this group is selected in an active screen view campaign, these new documents will appear automatically within this campaign. #### Assigning priority - A priority defines the order of displaying documents in a mobile application. Use numbers from 1 to 99 to define priority, where 1 is the highest. - What if there are two documents for the same audiences that have the same priority? Which one will be first? If a profile matches the conditions of both documents, then the date of creation will take precedence here - the profile will be displayed the document with the latest date of creation. #### Nesting documents in other documents - You can use other documents in the content of a document. - Due to optimization, documents whose audience is a segmentation or segmentations can't be nested inside documents whose audience is also segmentation or segmentations. #### Editing documents You can edit a document only when it has the following statuses: **Paused** and **Draft** ## Requirements --- A complete set of requirements is available at [this link](/docs/assets/documents/introduction-to-documents#requirements). ## Procedure --- ### Define the recipients 1. Go to Data Modeling Hub icon **Data Modeling Hub > Documents > Add document**. 2. In the **Audience** section, click **Define**. 3. Select one of the options: - **Everyone** - the document will be visible to all application users. - **Segment** - select an existing segmentation of application users who will see the contents of the document in the application. - **New audience** - create a segmentation of application users who will see the contents of the document in the application. 4. Confirm the settings in the **Audience** section by clicking **Apply**.
If the audience of the document is more than one segmentation and one of the segmentation returns `0` results, then the whole audience is `0`. In such circumstances, such a document will not be visible when active.
### Define the contents of the document 5. In the **Configuration** section, click **Define**. 1. In the **Slug** field, enter a unique identifier for the document (for example, `autumn-collection`). When you refer to this particular document in another document, you must use the value of the slug, like in the example below.
Click here to see example

The example presents contents of a document that refers to two other documents with the following slugs: `welcome`, and `autumn-collection`.

{ "sections": [ "{% document welcome %}", "{% document autumn-collection %}" ], "type": "sections-list" }
2. In the **Priority** field, define the order in which the document will be displayed. You can use numbers from 1 to 99, where 1 is the highest (this document will be returned first) and 99 is the lowest. 3. From the **Group** dropdown list, select the name of the group to which the document will be assigned. If there is no group to which you can assign a document, at the bottom of the dropdown list, click **Add group**.
You can select documents for a [screen view campaign](/docs/campaign/screen-views) by selecting groups.
4. From the **Type** dropdown list, select the type of the document. You can define the purpose of the value of this field (for example, you can use this value here to indicate the way of processing of the content). This field is mandatory. To define a new type, at the bottom of the dropdown list, click **Add type**. 5. In the **Body** section, define the content of the document. Below you can find an example that contains an AI recommendation created in Synerise, a context item (required for some recommendation types) and the name that will display above the frame with the recommendations:
{
      "name": "Best offers for You",
      "itemId": "7892348432",
      "recommendations": "{% recommendations_json3 campaignId=XRHP6iVS20SG %} {% endrecommendations_json3 %}",
      "exampleCustomParameter": "{{ foo }}"
    }
A blank configuration form of a document
A blank configuration form of a document
### Preview body 7. Optionally, you can preview the body of the document for a specific customer. 1. Click **Preview body**.
A form for defining the profile for whom the preview will be generated and additional parameters from the request body
A form for defining a profile for whom the preview will be generated and additional parameters from the request body
2. On the pop-up, click **Choose profile**. 3. From the dropdown list, select a profile for whom you want to generate the preview of the document body. 3. In the **Additional context parameters** section, provide values for non-profile variables. Variables are automatically detected and the **Key** column is filled out (as presented in Figure 2, `foo` was detected in the request body as non-profile variable). You must provide all keys of additional context parameters, otherwise the preview won't be generated. 4. Confirm by clicking **Apply**. ### Schedule document display 7. Confirm the settings in the **Configuration** section by clicking **Apply**. 8. In the **Schedule** section, click **Define**. 1. To display the document immediately after the activation, click the **Run immediately** section. 2. To schedule the display of the document at a future date, click **Scheduled**. 3. For both options, you can set time windows (the **Set time windows** option) during which the content of the document will be visible in the mobile application. 9. Confirm the settings in the **Schedule** section. 10. To save the document for activation according to the schedule, in the upper right corner, click **Activate**. ## Examples of use --- ### Embedding content through the API Define a piece of application that shows a defined type of content (in this example, it is a promotion) retrieved through the API. As an effect, the users of the application are provided with a specific promotion with a defined background color. **slug: promo-api**
{
  "content-type": "promotions",
  "background-color": "#123123",
  "title": "Promotions",
  "action": { 
          "data-schema": "promotions", 
          "uri": "https://api.snrapi.com/schema-service/proxy/promotions?type=GENERAL&sort=requireRedeemedPoints,asc"
  }
}
### Embedding content through the SDK Instead of using API endpoints, you can pass information about the SDK method you want to use and define the parameters of the method. Example below shows a call to the `Client.getPromotions()` method: **slug: promo-sdk**
{
  "content-type": "promotions",
  "background-color": "#123123",
  "title": "Promotions",
  "action": { 
        "method": "Client.getPromotions",
        "type": "GENERAL",
        "sort": "requireRedeemedPoints,asc"
  }
}
### Inserting content You can also insert the details of a specific promotion and select the fields that will be sent back to your application. **slug: daily-promo**
{
  "content-type": "promotion",
  "background-color": "#123321",
  "title": "Offer of the day",
  "promotion": "{% promotion fields=uuid,name,discountType,discountValue,code,params,tags,type,price,images,description,expireAt %} 3a3750b0-c00b-4c57-9c5f-d55652b417a0 {% endpromotion %}"
}
You are able to define the fields to be displayed on the interface only in the case of a "promotion" content type.
### Using tags to retrieve content The following example shows the retrieval of promotions from the Synerise API by means of tags. 1. Create tags in **Data Modeling Hub > Tags**. 2. Create a document with (a `tagNames` argument in the uri): **slug: club**
{
  "content-type": "promotions",
  "background-color": "#123123",
  "description": "Club offers",
  "title": "Special offers only for club members",
  "action": { 
          "data-schema": "promotions", 
          "uri": "https://{SYNERISE_API_BASE_PATH}/v4/promotions/promotion/get-for-client?type=GENERAL&tagNames=club"
  }  
}
You can create various content and come up with your own use cases.
### Final effect The final effect of what has been done so far is a single slug: `main`. The application users are provided with the content of each document referred to in the article when the document slug: `main` is retrieved. **slug: main**
{
    "sections": [
        {
            "content": {
                "color": "#ffffff",
                "description": "Hello to our interactive documents demo",
                "text": "bold"
            },
            "schema": "intro",
            "slug": "welcome",
            "uuid": "33f6fcd0-96e0-43f8-be40-0da733112c5f"
        },
        {
            "content": {
                "action": {
                    "data-schema": "promotions",
                    "uri": "https://api.snrapi.com/schema-service/proxy/promotions?tagNames=autumn-collection"
                },
                "section-background-color": "#123123",
                "section-title": "Autumn Collection",
                "section-type": "promotions"
            },
            "schema": "promotions",
            "slug": "autumn-collection",
            "uuid": "5b722719-66af-4c8f-a9ca-9e026d8157b2"
        },
        {
            "content": {
                "action": {
                    "method": "ContentWidget",
                    "slug": "recommendations"
                },
                "background-color": "#ffffff",
                "section-type": "content-widget",
                "title": "Best offers for you"
            },
            "schema": "content-widget",
            "slug": "content-widget",
            "uuid": "360dbd79-1972-40f0-bd48-db28c7b8c3a2"
        },
        {
            "content": {
                "action": {
                    "data-schema": "promotions",
                    "uri": "https://{SYNERISE_API_BASE_PATH}/v4/promotions/promotion/get-for-client?type=GENERAL&tagNames=club"
                },
                "background-color": "#123123",
                "content-type": "promotions",
                "description": "Club offers",
                "title": "Special offers only for club members"
            },
            "schema": "promotions",
            "slug": "club",
            "uuid": "98f92187-603b-4c61-a45c-73cfe555fb06"
        },
        {
            "content": {
                "background-color": "#123321",
                "content-type": "promotion",
                "promotion": {
                    "code": "apple-promo",
                    "description": "Apple products 10% cheaper !!!",
                    "discountType": "PERCENT",
                    "discountValue": -10,
                    "expireAt": "2029-12-26T23:59:59.000Z",
                    "images": [
                        {
                            "type": "image",
                            "url": "https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188695830-el-mbppro.png"
                        },
                        {
                            "type": "image",
                            "url": "https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188692254-el-iphx.png"
                        },
                        {
                            "type": "image",
                            "url": "https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png"
                        }
                    ],
                    "name": "Apple products 10% cheaper",
                    "params": null,
                    "price": 0,
                    "tags": null,
                    "type": "MEMBERS_ONLY",
                    "uuid": "3a3750b0-c00b-4c57-9c5f-d55652b417a0"
                },
                "title": "Offer of the day"
            },
            "schema": "promotion",
            "slug": "daily-promo",
            "uuid": "2a45411a-f615-4aec-a303-8a772974621f"
        },
        {
            "content": {
                "action": {
                    "data-schema": "promotions",
                    "uri": "https://api.snrapi.com/schema-service/proxy/promotions?type=GENERAL&sort=requireRedeemedPoints,asc"
                },
                "background-color": "#123123",
                "content-type": "promotions",
                "title": "Promotions"
            },
            "schema": "promotions",
            "slug": "promo-api",
            "uuid": "11357ed3-94a2-4844-a8ce-c1ae119f25ab"
        },
        {
            "content": {
                "action": {
                    "method": "Client.getPromotions",
                    "sort": "requireRedeemedPoints,asc",
                    "type": "GENERAL"
                },
                "background-color": "#123123",
                "content-type": "promotions",
                "title": "Promotions"
            },
            "schema": "promotions",
            "slug": "promo-sdk",
            "uuid": "2836dab5-249b-4884-9bc5-c375960048eb"
        }
    ],
    "type": "sections-list"
}
# Creating schemas Schemas are flexible templates that allow you to store any kind of data. For example, they can be used to provide data layouts for custom nodes in Automation Hub. ## Creating a schema 1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. Click **New data object**. 3. In the **Schema name** field, enter a meaningful name for the schema. 4. If you want to add a graphical layout to your schema, drag it from the **Layout** section on the right and drop it onto the schema panel.
- Layouts are **not** required. - You can mix different graphical layouts in a single schema. You can also nest layouts in layouts. - When adding elements to a table, you can add many elements in a single cell. Make sure you drag and drop elements to the correct row.
5. Add an input type by dragging it from the **Basic components** panel on the right into a selected place within the schema. 6. To edit an element (layout or input type): 1. Click the element. 2. Click Pencil icon. 3. In the panel that opens, edit the element's properties. Each element type has different properties. Follow the instructions on-screen to modify them. See [input type properties](#input-type-properties) and [layout properties](#layout-properties). 1. Confirm the changes by clicking **Apply**. 7. To see a preview of the schema, click Eye icon above the schema panel. To close the preview, click the icon again. 8. Continue adding elements until your schema is complete. 9. If an element is highlighted red, edit it by adding a unique `Field ID`. You can set any ID. It should only contain upper/lowercase letters, digits, and underscores (`_`). 1. To delete an element, click the element and click Trash bin icon. 2. To duplicate an element, click the element and click Duplicated element icon. 3. To move an element, click and hold Crossed arrows icon and drag the element. 4. When the schema is complete, click **Save**. ## Input type properties Below is a reference for component properties, divided by tabs. ### Design tab | Property name | Available in | Description | | --- | --- | --- | | Field ID | All | This field is only available for modification when another element with the same ID exists in the schema. You must change the value in one of the fields to be unique. | | Label | All | Field label displayed in the form UI. You can hide the label by selecting the **Hide label** checkbox. | | Title | Button | The text on the button | | Theme | Button | The graphical theme of the button | | Size | Button | The size of the button | | Placeholder | Text input, Number | Placeholder text displayed until the user fills in a value | | Description | All | The description appears under the field. | | Tooltip | All | Tooltip text is displayed when the user hovers over the information icon (the icon is a default element of the UI). | | Tab index | All | Tab index defines the order of field display when the user uses the **TAB** key to navigate the form. | | Initial focus | All | If this is selected, the field becomes the initially focused element when the form is opened. | ### Data tab | Property name | Available in | Description | | --- | --- | --- | | Decimal places | Number | The number of digits to display after the decimal separator | | Default value | Switch | Defines if the toggle is on or off by default when the form is displayed | | Default value | Radio | Defines which option is selected by default when the form is displayed | | Data source values | Radio, Checkbox, Select | Add new options by clicking **Add value**.
Each option has a user visible **Label** and a **Value** that defines the `` HTML attribute of the option. | Type of relation; Relation to; Displayed field | Relation | See [Schema relations](/docs/assets/schema-builder/schema-relations). | ### Validation tab | Property name | Available in | Description | | --- | --- | --- | | Required | Text input, Number, Checkbox, Relation | When this is selected, the field must be filled in before the form can be submitted. | | Unique | Text input, Number, Select | When this is selected, the form cannot be sent if it contains the same data that was sent before. | | Minimum length | Text input | The minimum number of characters in the entered value | | Maximum length | Text input | The maximum number of characters in the entered value | | Minimum value | Number | The minimum value | | Maximum value | Number | The maximum value | | Regex | Text input, Number | A regular expression that the entered value must match | | Error message | Text input, Number, Checkbox, Select, Relation | The message to display if a validation error occurs | ### Layout tab These properties affect the graphical layout of the form in the Synerise UI. | Property name | Available in | Description | | --- | --- | --- | | Margin Top | All | The top margin of the element | | Margin Right | All | The right margin of the element | | Margin Bottom | All | The bottom margin of the element | | Margin Left | All | The left margin of the element | ## Layout properties These properties define the properties of column and table layouts that can be used within the schema to organize data fields. ### Design tab | Property name | Available in | Description | | --- | --- | --- | | Custom CSS Class | Column Component, Table Component | CSS class of the container | | Columns properties | Column Component | Add more columns by clicking **Add column**. You can define the width (as a percentage) of each column. | | Column gap | Column Component | Defines the gap (in px) between columns. | | Number of rows | Table Component | The number of rows | | Number of columns | Table Component | The number of columns | | Striped | Table Component | Defines if the table is striped (every second row has a colored background for better readability). | | Bordered | Table Component | Defines if the table has borders. | | Hover | Table Component | Defines if rows are highlighted when hovered. | | Condensed | Table Component | Condenses the size of the table. | ### Layout tab These properties affect the graphical layout of the form in the Synerise UI. | Property name | Available in | Description | | --- | --- | --- | | Margin Top | All | The top margin of the element | | Margin Right | All | The right margin of the element | | Margin Bottom | All | The bottom margin of the element | | Margin Left | All | The left margin of the element | # Event authentication settings By default, the use of JS SDK and event aggregation takes place without authentication (except for `form.submit` events). You can configure authentication requirements so that some (or even all) events can only be sent by customers who confirmed their identity.
We highly recommend using this option, especially for events which involve personal data and/or events of high importance.
The customer's identity is verified by your own backend, which informs Synerise that the user is authenticated. For technical details of the authentication, see the [developer documentation](/developers/web/jwt-auth). Users can create lists of events sent by JS SDK which require the JSON Web Token (JWT) authentication. Users can create three-level authentication of events in the form of lists that contain: - Events accepted for anonymous customers which don't require JWT authentication - Events that modify customer data which don't require JWT authentication - Events that modify data and require JWT authentication ## Add a certificate --- Before you can authenticate events with JWT, you must add a certificate and implement your own logic for [generating JWT tokens signed with that certificate](/developers/web/jwt-auth). 2. Go to Data Modeling Hub icon **Data Modeling Hub > Events**. 3. On the **JS SDK event settings** tab, in the **Certificate** section, click **Define**. 4. If a certificate is already added, perform one of the following actions - Keep using the existing certificate, no further actions are required. - Overwrite the existing certificate by continuing to step **4**.
Overwriting a certificate requires providing the new certificate in your backend implementation! JWT tokens signed with the old certificate are rejected!
1. Open the terminal. 1. Generate public and private RSA keys by using these commands: 1. `openssl genpkey -out private.pem -algorithm RSA -pkeyopt rsa_keygen_bits:2048` 2. `openssl pkcs8 -topk8 -inform pem -in private.pem -outform DER -nocrypt -out private.der` 3. `openssl rsa -pubout < private.pem > public.pem` 5. Perform one of the following actions: - To enter the certificate as text, in the **Certificate code** field paste the certificate **with the header and footer**. The header and footer are: `-----BEGIN PUBLIC KEY-----`; `-----END PUBLIC KEY-----`
The pasted certificate cannot contain line breaks or spaces.
To open the certificate in the terminal, you can usually use `cat public.pem` in the root directory.
- To upload the certificate as a file, click **Upload Certificate > Upload certificate code** and select a file from your computer. 6. Click **Apply**. ## Event configuration --- 1. Go to Data Modeling Hub icon **Data Modeling Hub > Events > JS SDK event settings**.
Event settings
Event settings
### Events for anonymous customers without JWT authentication 1. To define events which are accepted for anonymous users and don't require JWT authentication, in the **Events without JWT allowed for anonymous customers** section, click **Define**. 2. Use a search box to find an event. 3. Click the event you want to add to the list. 4. If you want to add more, search them and click them to add to the list. 5. Confirm your choice by clicking **Add**. **Result**: The event appears on the **Event list**. 6. To save the list of events, click **Apply**. **Result**: The selected events will be visible on the activity list on the profile of anonymous customers and they will create new profiles. If the list is empty, it means that all events sent through JS SDK are accepted for anonymous customers without JWT authentication. ### Events which change customer data and don't require authentication
Using non-authenticated events for changing customer data is enabled for backwards compatibility. You should not add events to this list unless absolutely necessary and allowed by your security policies.
1. To define events that modify customer data and don't require a JWT, in the **Events without JWT allowed for updating customer's information** section, click **Define**. The standard configuration of this section includes the following events: `form.submit`, `client.login` 2. Use the search box to find an event. 3. Click the event you want to add to the list. 4. If you want to add more, search them and click them to add to the list. 5. Confirm your choice by clicking **Add**. **Result**: The event appears on the **Event list**. 6. To save the list of events, click **Apply**. **Result**: The events added on the list will be accepted without JWT authentication. If this list is empty, all events sent through JS SDK are accepted without JWT authentication (only if the section below is empty as well). ### Events which change customer's data and require authentication 1. To define events that modify customer data and require JWT authentication, in the **Events with JWT allowed for updating customer's information** section, click **Define**. Example of such an event: `form.submit` (this event is added to this list by default) 2. Use search box to find an event. 3. Click the event you want to add to the list. 4. If you want to add more, search them and click them to add to the list. 5. Confirm your choice by clicking **Add**. **Result**: The event appears on the **Event list**. 6. To save the list of events, click **Apply**. **Result**: The events on the list will require JWT authentication. If this list is empty, all events sent through JS SDK won't require JWT authentication. # Files File explorer is a place where you can upload files into Synerise. The process is simplified by drag-and-drop for easy uploads and convenient organization of important files. The uploader accepts the following file extensions, with specific size limits assigned to each extension: | Type | Extensions | File limit | |----------------------------|-------------------------------------------------|--------------------------| | Graphical | ` .jtif,.bmp,.tiff,.webp,.png,.gif,.jpg,.jpeg ` | 3MB | | Multimedia | ` .gif,.mpg,.mpeg,.mp3,.webm,.mov,.mp4 ` | 10MB | | Text/Data/Document | ` .xml,.pdf,.css,.csv,.json ` | 3MB | | Other | `.font,.ttf,.otf` | 3MB | ## Adding new files --- To add files to Synerise: 1. Go to Data Modeling Hub icon **Data Modeling Hub > File explorer**. 2. To upload a file you can: - Drag and drop the file on the left pane to a dedicated section (**Drag & Drop**). - On the upper right side, click **Upload** and select the file from your device. **Result**: A file is added to the list. ## Retrieving file URL --- A file URL is needed to provide a specific location or address for a file stored in Synerise. By using file URLs, you can easily link to or embed files in dynamic content, messages you send to your customers, or on a landing page. 1. Go to Data Modeling Hub icon **Data Modeling Hub > File explorer**. 2. On the list, find the image whose URL you want to retrieve. 3. Hover the mouse cursor over the item on the list with your image. **Result**: A **Copy URL** button appears. 4. Click the **Copy URL** button. ## Retrieving HTML img tag ---
Available only for graphical file formats.
Using the HTML "img" tag lets you display the image on a web page. 1. Go to Data Modeling Hub icon **Data Modeling Hub > File explorer**. 2. On the list, find the image. 3. Click the image on the list. **Result**: Image details appear on the right side of the screen. 4. From the **HTML Code** field, copy the HTML snippet. ## Adding files to favorites --- Marking specific files or documents as favorites lets you quickly access and reference your most important or frequently used files without navigating through the entire list of files. It's a convenient way to prioritize and easily locate important items within a collection of files. 1. Go to Data Modeling Hub icon **Data Modeling Hub > File explorer**. 2. On the list, find the file which you want to add to the favorites. 3. Next to the modification date of the file, click Three-dot icon. 4. From the dropdown list, click **Star**. **Result**: The file is added to the **Starred** folder. ## Deleting files --- If you want to get rid of the files you no longer need and thus facilitate navigating through the list of the files, perform the steps described in the instruction below. 1. Go to Data Modeling Hub icon **Data Modeling Hub > File explorer**. 2. On the list, find the file which you want to delete. 3. Next to the modification date of the file, click Three-dot icon. 4. From the dropdown list, click **Delete**. **Result**: The file is removed from the file explorer. # Field types A [schema](/docs/assets/brickworks/quick-start/creating-a-schema) may include a number of different types of data fields: - Simple types - static, atomic values and expect data entries that strictly conform to their specified types. Can be set as searchable unique. - Complex types - structured or grouped data, allowing for more complex and flexible data representations beyond simple atomic values. - Dynamic types - Jinjava inserts and data pulled from external sources. - Relations - data retrieved from records in other schemas. - Synerise objects - leverage existing data within Synerise by adding Synerise objects as fields. These objects enable advanced personalization and dynamic content. To learn more, see [Synerise objects](/docs/assets/brickworks/synerise-objects). - Assets - files from the [Files Explorer](/docs/assets/files-explorer). ## Common field properties These properties exist in multiple field types: - **Display name** (required): A human-readable name for the field, shown in the record editor. - **API name** (required): A system name for the field. - In the `{{ record.APIname }}` insert, this name is the `APIname` - When retrieving/creating/updating a record with the API, this name is the identifier of the field. - When generating an object from a record, this is the name of the key that stores the field's value. - **Description**: A human-readable description of the field's purpose, shown in the record editor. - **Block record-level overwriting**: Disables changing any values in this field in individual records. You must provide a default value, which will be applied to all records in the schema. - **Return null when object is missing**: If the requested object (such as an expression result or external source) doesn't exist, the field returns `null` instead of causing an error in content generation. - **Conditional visibility**: Enforces adding a value to a field when another field meets a condition. See [explanation below](#conditional-visibility). - **Use as record title**: If the record doesn't have a set name, the value of the field is used as the name. - **Required field**: A record can only be saved if a value for this field is provided. - **Default value**: The provided value will be used for object generation in records where a value is not set. This is only used when a value isn't defined in a record. It is **not a fallback**. For example, if an expression referenced in a record returns null or an error, the system **doesn't** use the default value. Default values are optional. - **Unique values only**: No other record in the schema may have the same value for this field. You can use this to store your own unique record identifiers. The number of fields with this setting is [limited](/docs/assets/brickworks/limits). - **Enable search & filtering**: The value can be used when searching and filtering records. The number of fields with this setting is [limited](/docs/assets/brickworks/limits). ### Conditional visibility You can enforce entering a value into a field when another field meets a condition. If the condition isn't met, the field with this setting isn't visible in the schema editor/viewer. The field that appears when the condition is met must have a default value (because it's required). **Example**:
Conditional display example: the Account number field is only available (and must be filled) when the Payment Type field (enumeration) is not cash
the Account number field is only available (and must be filled) when the Payment Type field (enumeration) is not "cash"
**Operators**: The available operators depend on the type of the field that is checked: | String | Number | Boolean | Enumeration | | --- | --- | --- | --- | |
  • Equals
  • Contains
  • Is empty
  • Is not empty
|
  • Equals
  • Does not equal
  • Greater than
  • Less than
  • Is empty
  • Is not empty
|
  • Is true
  • Is false
|
  • Equals
  • Does not equal
| ## Field type summary ### Simple types | Field name | Stored values | Primitive data type | Can be searchable1 | Can be unique2 | Accepts Jinjava | Nullable | | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | --- | | [String](#string) | Static strings | Green checkmark | Green checkmark | Green checkmark | Red checkmark |Green checkmark | | [Number](#number) | Integers or floating point numbers | Green checkmark | Green checkmark | Green checkmark | Red checkmark |Green checkmark | | [Date & Time](#date--time) | A date or date and time | Red checkmark | Red checkmark | Red checkmark | Red checkmark |Green checkmark | | [Boolean](#boolean) | `true`/`false` values | Green checkmark | Green checkmark | Green checkmark | Red checkmark |Green checkmark | 1,2The number of fields with this setting is [limited](/docs/assets/brickworks/limits). ### Complex types | Field name | Stored values | Primitive data type | Can be searchable1 | Can be unique2 | Accepts Jinjava | Nullable | | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | --- | | [Enumeration](#enumeration) | A list of allowed values, displayed as a dropdown list | Green checkmark | Red checkmark | Green checkmark | Red checkmark |Green checkmark | | [JSON code](#json-code) | Raw JSON content | Red checkmark | Red checkmark | Red checkmark | Red checkmark |Green checkmark | | [Array](#array) | Lists of values | Green checkmark | Green checkmark | Green checkmark | Red checkmark |Green checkmark | | [Key-Value](#key-value) | A key/value (JSON) map | Red checkmark | Red checkmark | Red checkmark | Red checkmark |Red checkmark | 1,2The number of fields with this setting is [limited](/docs/assets/brickworks/limits). ### Dynamic types | Field name | Stored values | Primitive data type | Can be searchable1 | Can be unique2 | Accepts Jinjava | Nullable | | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | --- | | [Jinjava code](#jinjava-code) | A string which contains Jinjava inserts. | Red checkmark | Red checkmark | Red checkmark | Green checkmark |Green checkmark | | [External Data](#external-data) | Pulls data from an external source when generating an object from a record | Red checkmark | Red checkmark | Red checkmark | Green checkmark |Green checkmark | 1,2The number of fields with this setting is [limited](/docs/assets/brickworks/limits). ### Relations | Field name | Stored values | Primitive data type | Can be searchable1 | Can be unique2 | Accepts Jinjava | Nullable | | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | --- | | [One to one](#one-to-one) | Reference to one record from another schema | Red checkmark | Red checkmark | Red checkmark | Red checkmark |Green checkmark | | [One to many](#one-to-many) | References to multiple records from another schema | Red checkmark | Red checkmark | Red checkmark | Red checkmark |Green checkmark | | [One to many filtered](#one-to-many-filtered) | References multiple fields from a schema if they meet a filter | | Red checkmark | Red checkmark | Red checkmark | Red checkmark |Green checkmark | 1,2The number of fields with this setting is [limited](/docs/assets/brickworks/limits). ### Synerise objects See [Synerise objects](/docs/assets/brickworks/synerise-objects) to learn to use: profile attributes, expressions, metrics, aggregates, vouchers, AI recommendations, AI Search, AI Search listing, and catalogs. ### Assets | Field name | Stored values | Primitive data type | Can be searchable1 | Can be unique2 | Accepts Jinjava | Nullable | | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | --- | | [File](#file) | Reference to a file (other than image) from [**Data Modeling Hub > Files**](/docs/assets/files-explorer) | Red checkmark | Red checkmark | Red checkmark | Red checkmark |Green checkmark | | [Image](#image) | Reference to an image from [**Data Modeling Hub > Files**](/docs/assets/files-explorer) | Red checkmark | Red checkmark | Red checkmark | Red checkmark |Green checkmark | 1,2The number of fields with this setting is [limited](/docs/assets/brickworks/limits). ## Array This field lets you add a list of multiple values within a single field. You can make the array untyped (default behavior) or configure it to accept only strings or only numbers. #### Field configuration in a schema 1. If you want to select the data type of an array, select it from the **Array type** dropdown. This setting can't be changed per record. #### Object generation example Arrays don't require extra parameters in the object generation request. The generated content is the value of the array:
[
    "string1",
    "string2"
]
## Boolean This field type accepts `true` or `false` as the value. In the record editor, it's shown as a checkbox. #### Object generation example Booleans don't require extra parameters in the object generation request. The generated content is the value of the field:
true
## Date & Time This field accepts a date or date and time, according to ISO 8601. In the record editor, you can select the value with a date picker:
Date picker and a date/date-time value editor
Date picker and a date/date-time record editor
#### Object generation example Dates and times don't require extra parameters in the object generation request. The generated content is the value of the field.
"exampleDateAndTime": "2025-12-09T17:19:13+01:00",
"exampleDate": "2025-12-09"
## Enumeration This field type lets you add a fixed set of allowed values. In the record configuration list, it will appear as a dropdown. You can add human-readable labels to show in the dropdown. When a record is created or updated, the value of this field must match one of the allowed values.
Enumeration in the schema editor
Enumeration in the schema editor
Enumeration in the record editor
Enumeration in the record editor
#### Field configuration in a schema 1. In the **Options** section: 1. Click **Add item**. 3. On the left side, enter the human-readable name shown in the record editor. 4. On the right side, enter the value that will be returned when an object is generated. This value is returned when you generate content from a record. This field doesn't support diacritic characters. #### Object generation example Enumerations don't require extra parameters in the object generation request. The generated content is the value of the field:
"exampleName2"
## External Data This field lets you add a dropdown with [external sources](/docs/assets/brickworks/creating-external-source) to a schema. When you generate an object from a record, a request is made to the external source and the data from the response is added to the generated content. The external source selected in the schema applies to all records and can't be changed per record. #### Field configuration in a schema 1. From the **Select an external source** dropdown list, select an external source. 2. Choose a setting for the **Return error details when the source responds with an error** option: - Disabled (default): when the external resource returns an error during object generation, it causes an HTTP 400 response from the Brickworks API. - Enabled: when the external source returns an error during object generation, the Brickworks API returns an HTTP 200 response with the error details as the value of the field. See [Object generation example: error handling](#object-generation-example-error-handling). Connection errors, such as timeouts, result in an error response from the Brickworks API regardless of this setting. When this setting is enabled, it takes precedence over **Return null when object is missing**. #### Object generation example External sources don't require extra parameters in the object generation request. The generated content is the response body from the external source.
{
    "key1": "value1",
    "key2": "value2"
}
#### Object generation example: error handling If **Return error details when the source responds with an error** and **Return null when object is missing** are both disabled, an HTTP 4xx response from an external source causes an HTTP 400 response from the Brickworks API:
{
    "source": {
        "pointer": ".exampleExternalDataField",
        "value": null
    },
    "timestamp": "2026-08-18 12:35:46.452234318Z",
    "help": null,
    "errorCode": "BKW-032",
    "httpStatus": 400,
    "details": {
        "request.method": "GET",
        "response.status": 403,
        "response.body": "{\"status\":403,\"error\":\"Forbidden\",\"message\":\"\",\"timestamp\":\"2026-08-18 12:35:46Z\"}",
        "request.url": "https://api.example.com/object/7958640443",
        "request.body": ""
    },
    "message": "External data source error",
    "traceId": null
}
When **Return error details when the source responds with an error** is enabled, the Brickworks API returns an HTTP 200 response and the error details become the value of the external data field. The `response.body` parameter contains the content of the response from the external source and differs depending on the source.
The `request.body` object contains the request body that was sent from Synerise to the external source. If your [external source configuration](/docs/assets/brickworks/creating-external-source#procedure) sends sensitive data (such as personal information or authentication parameters) in the request body, that data is added to `request.body`. You can use [Response transformers](/docs/assets/brickworks/response-transformers) to remove sensitive data from the response.
{
    "__slug": "123456",
    ... // record metadata
    "exampleExternalDataField": {
        "request.method": "GET",
        "response.status": 403,
        "response.body": {
            "status": 403,
            "error": "Forbidden",
            "message": "",
            "timestamp": "2026-08-18 12:35:46Z"
        },
        "request.url": "https://api.example.com/object/7958640443",
        "request.body": {}
    }
}
## File This field lets you add a dropdown with a selection of files available in [**Data Modeling Hub > Files**](/docs/assets/files-explorer), except for image files. To add a dropdown with image selection, see [Image](#image).
File selector in the record editor
File selector in the record editor
#### Object generation example Files don't require extra parameters in the object generation request. The generated content is an object with a link to the file.
{
        "origin": "https://upload.snrcdn.net/3d2bbac6f7eacc33da9c9f4299c3154c49965926/default/origin/1a87f667856cfoobarba514d6282be4e.pdf",
        "large": null,
        "thumb": null
    }
## Image This field lets you add a dropdown with a selection of images available in [**Data Modeling Hub > Files**](/docs/assets/files-explorer).
Image selector in the record editor
Image selector in the record editor
#### Object generation example Images don't require extra parameters in the object generation request. The generated content is an object with links to the image.
{
        "origin": "https://upload.snrcdn.net/3d2bbac6f7eacc33da9c9f4299c3154c49965926/default/origin/1a87f667856cfoobarba514d6282be4e.png",
        "large": "https://upload.snrcdn.net/3d2bbac6f7eacc33da9c9f4299c3154c49965926/default/medium/1a87f667856cfoobarba514d6282be4e.png",
        "thumb": "https://upload.snrcdn.net/3d2bbac6f7eacc33da9c9f4299c3154c49965926/default/thumb/1a87f667856cfoobarba514d6282be4e.png"
    }
## Jinjava code This field allows you to input and store [Jinjava template code](/developers/inserts) within the schema. Using this field, you can define reusable templates or dynamic text that will be rendered based on the context data at runtime.
When referencing profile attributes with Jinjava, you should check if they exist. See the below image for an example.
For more details, see [Insert usage](/developers/inserts/insert-usage#good-practice-check-if-value-exists-before-using-it).
Jinjava in the record editor
Jinjava in the record editor
Additionally, in this field, you can use [inserts for retrieving values from other fields and providing context](/docs/assets/brickworks/brickworks-jinjava-inserts). #### Field configuration in a schema 1. In **Jinjava code**, enter the default code. 2. If you want to enforce casting the output of Jinjava code to a specific value type: 1. Enable the **Cast to** option. 3. From the **Choose type** dropdown list, select the data type to which the Jinjava code output will be cast to. 4. If you want to return `null` when casting fails, enable **Strict casting**. If strict casting is disabled, the raw value (string) is returned instead of an error. #### Object generation example In the following example, content is generated from the record shown in the screen above: - The name of the customer is pulled from the profile for whom the content was generated (see [Generating objects](/docs/assets/brickworks/generating-objects)). - The day of week is added in the `context` object of the generation request.
"context": {
    "dayOfWeek": "Monday"
}
"Hello, Tom!\nIt's Monday.",
## JSON code This field allows you to input and store raw JSON data. The field includes validation to ensure the JSON is well-formed, enabling accurate storage and retrieval of structured data exactly as provided.
Raw JSON in the record editor
Raw JSON in the record editor
#### Field configuration in a schema Only [common properties](#common-field-properties). #### Object generation example JSON fields don't require extra parameters in the object generation request. The generated content is the value of the field:
{
    "key1": "value1",
    "key2": {
        "key3": "value3"
    }
}
## Key-Value This field lets you create a key/value map. You can set a default list of keys and values, and configure the field to allow adding new keys in each record. The values **do not** support Synerise Jinjava inserts. #### Field configuration in a schema All configuration is optional, but if you don't add any default keys and leave the **Allow custom keys in records** option disabled (default), the field will always be empty in records. 1. In **Configuration > Define structure**, add default keys and their values. For each key, select the data type that will be enforced for the value. The allowed data types are: - String - Integer - Float - Boolean - Array (any) - Array (string) - Array (number) - Object (a key/value map) 2. If you want to allow adding new keys per record, enable the **Allow custom keys in records** option. Keys cannot be added to nested objects (keys with the **Object** value type). #### Object generation example The following example of generating content from a record contains 3 keys in a Key-Value field: - `exampleString` (string) - `exampleObject` (object) - `exampleFloat` (a float inside `exampleObject`) ```json { "exampleString": "foo", "exampleObject": { "exampleFloat": 3.14 } } ``` ## Number This field type lets you store numbers. You can choose to accept only integers or integers and floating-point numbers.
Two variants of the number field in the record editor
Two variants of the number field in the record editor
#### Field configuration in a schema 1. Select one of the following options: - **Integer** - To allow a whole number that can be positive, negative, or zero, but does not include any fractional or decimal part. - **Float** - To let users type real numbers, including decimal values. 4. To set limits on values for the field: 1. Select the **Limit value** checkbox. This limit isn't enforced when previewing a record. It only applies when trying to save or update the record. 2. Provide the minimum and maximum values the field can accept. #### Object generation example Numbers don't require extra parameters in the object generation request. The generated content is the value of the field:
"exampleInteger": 15,
"exampleFloat": 3.14
## One to one This is a relation field type that provides a dropdown populated with records from a selected schema. It allows a schema record to reference a single record from another schema. When a record is selected from the related schema, values from all fields of that referenced record are accessible.
Selecting a record in a one-to-one reference
Selecting a record in a one-to-one reference
#### Field configuration in a schema 1. From the **Select schema** dropdown list, select a schema which stores the records that can be referenced. This can't be changed per record. #### Object generation example If the referenced records contain: - fields which use the `context.keyName` inserts, you can provide the context as described in the [Jinjava code](#jinjava-code) fields. - AI recommendation fields, you can provide the context as described in the [AI recommendation](/docs/assets/brickworks/synerise-objects#ai-recommendation) field. The generated content is the processed content of the referenced record. In the following example, the referenced record has two fields: `someNumber` and `someString`
{
    "someNumber": 35.7,
    "someString": "defaultvalue"
}
## One to many This is a relation field type that provides a dropdown populated with records from a selected schema. It allows a schema record to reference up to 10 records from another schema. When a record is selected from the related schema, values from all fields of that referenced record are accessible.
Selecting a record in a one-to-many reference
Selecting a record in a one-to-many reference
#### Field configuration in a schema 1. From the **Select schema** dropdown list, select a schema which stores the records that can be referenced. This can't be changed per record. 2. In **Limit**, set the maximum number of records that a record can link. This can't be changed per record. #### Object generation example If the referenced records contain: - fields which use the `context.keyName` inserts, you can provide the context as described in the [Jinjava code](#jinjava-code) fields. - AI recommendation fields, you can provide the context as described in the [AI recommendation](/docs/assets/brickworks/synerise-objects#ai-recommendation) field. The generated content is the processed content of the referenced records. In the following example, two single-field records are fetched.
[
    {
        "someString": "value1"
    },
    {
        "someString": "value2"
    }
]
## One to many filtered This relation field type provides a dropdown populated with schemas. You can select a schema and define filter conditions to return only the records that meet those conditions.
Filters can be applied only if the selected schema contains fields marked as **Unique values only** and/or has the **Enable search & filtering option** enabled. Otherwise, the filter will be inactive in the interface.
Selecting records in a one-to-many filtered reference
Selecting a record in a one-to-many filtered reference
#### Field configuration in a schema 1. From the **Select schema** dropdown list, select a schema which stores the records that can be referenced. This can't be changed per record. 2. To define filters, click **Define filter**. 1. From the **Select field** dropdown list, select the field from the schema you selected in the step before. 2. From the **Select operator** dropdown list, select the condition type to apply when filtering data. 3. Provide a value. 4. To add more conditions, click **Add condition**. 5. To change the dependency between the conditions (AND/OR), click **Or**. 6. Confirm by clicking **Apply**. 3. From the **Sorting by** dropdown list, select the attribute by which the filter results will be ordered. 4. In the **Direction** section, choose whether the results will be sorted in ascending or descending order. #### Object generation example
{
  "identifierValue": "6b7fed6d-da01-42f1-b98c-b2b31aed9ac3",
  "context": {},
  "values": {
    "relations": {
      "query": "jacket==\"black\"",
      "sortBy": "createdAt",
      "sortDirection": "asc"
    }
  }
}
{
    "__slug": "Schema with one to many filtered",
    "__recordVersion": 1,
    "__publishedAt": "2026-02-26T15:39:45.572337Z",
    "__updatedAt": "2026-02-26T15:39:45.564786Z",
    "__createdAt": "2026-02-26T15:39:45.564786Z",
    "relations": [
        {
            "shirt": "blue",
            "hoodie": "green",
            "jacket": "black",
            "trousers": "yellow"
        },
        {
            "shirt": "brown",
            "hoodie": "brown",
            "jacket": "black",
            "trousers": "brown"
        }
    ],
    "__schemaId": "a7e1ebc8-0e62-4f7c-b0db-3a1824efb1ac",
    "__id": "25104d4d-5d2b-4293-9758-c07d726c32a3",
    "__schemaVersion": 1
}
## String This field type lets you add a text field.
To add a string with Jinjava inserts, use the [Jinjava code field](#jinjava-code).
#### Field configuration in a schema 1. To set length limits for the field value, select the **Character limits** checkbox and specify the minimum and maximum number of characters allowed. 6. To enable regex validation for the field value, select **Validation pattern** and enter the expression. #### Object generation example Strings don't require extra parameters in the object generation request. The generated content is the value of the field:
"Lorem ipsum"
# Documents Documents are objects that allow users to build mobile applications or create single elements to display in the applications. Due to the coherent scheme nomenclature and encoding the content in JSON, the application is able to parse the encoded data and take actions specified in the content. Documents can recycle data from other documents or retrieve data from various services. There are no restrictions for any component to use documents, provided a component is able to retrieve data through the API and pass it further to present the data in an appropriate format on the interface. ## Contents # Synerise objects Synerise object fields are powerful tools which let you access data from other Synerise modules. ## Common field properties These properties exist in multiple field types: - **Display name** (required): A human-readable name for the field, shown in the record editor. - **API name** (required): A system name for the field. - In the `{{ record.APIname }}` insert, this name is the `APIname` - When retrieving/creating/updating a record with the API, this name is the identifier of the field. - When generating an object from a record, this is the name of the key that stores the field's value. - **Description**: A human-readable description of the field's purpose, shown in the record editor. - **Block record-level overwriting**: Disables changing any values in this field in individual records. You must provide a default value, which will be applied to all records in the schema. - **Return null when object is missing**: If the requested object (such as an expression result or external source) doesn't exist, the field returns `null` instead of causing an error in content generation. - **Conditional visibility**: Enforces adding a value to a field when another field meets a condition. See [explanation below](#conditional-visibility). - **Use as record title**: If the record doesn't have a set name, the value of the field is used as the name. - **Required field**: A record can only be saved if a value for this field is provided. - **Default value**: The provided value will be used for object generation in records where a value is not set. This is only used when a value isn't defined in a record. It is **not a fallback**. For example, if an expression referenced in a record returns null or an error, the system **doesn't** use the default value. Default values are optional. - **Unique values only**: No other record in the schema may have the same value for this field. You can use this to store your own unique record identifiers. The number of fields with this setting is [limited](/docs/assets/brickworks/limits). - **Enable search & filtering**: The value can be used when searching and filtering records. The number of fields with this setting is [limited](/docs/assets/brickworks/limits). ### Conditional visibility You can enforce entering a value into a field when another field meets a condition. If the condition isn't met, the field with this setting isn't visible in the schema editor/viewer. The field that appears when the condition is met must have a default value (because it's required). **Example**:
Conditional display example: the Account number field is only available (and must be filled) when the Payment Type field (enumeration) is not cash
the Account number field is only available (and must be filled) when the Payment Type field (enumeration) is not "cash"
**Operators**: The available operators depend on the type of the field that is checked: | String | Number | Boolean | Enumeration | | --- | --- | --- | --- | |
  • Equals
  • Contains
  • Is empty
  • Is not empty
|
  • Equals
  • Does not equal
  • Greater than
  • Less than
  • Is empty
  • Is not empty
|
  • Is true
  • Is false
|
  • Equals
  • Does not equal
| ## Synerise object field summary When creating schemas and defining records, you can leverage existing data within Synerise by adding Synerise objects as fields. These objects enable advanced personalization and dynamic content, such as: - personalizing messages using expression or aggregate results - implementing social proof through metric insights - delivering AI-driven item recommendations - distributing discount codes - displaying detailed information stored in catalogs | Field name | Stored values | Primitive data type | Can be searchable1 | Can be unique2 | Accepts Jinjava | Nullable | | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | --- | | [Profile attribute](#profile-attribute) | Inserts the value of an attribute from the context profile | Red checkmark | Red checkmark | Red checkmark | Red checkmark | Green checkmark | | [Expression](#expression) | This field type lets you add a dropdown with a list of [expressions](/docs/crm/expressions). This way you can display an expression result in a record. | Red checkmark | Red checkmark | Red checkmark | Red checkmark | Green checkmark | | [Metric](#metric) | This field type lets you add a dropdown with a list of [metrics](/docs/analytics/metrics/ ). This way, you can display a metric result in a record. | Red checkmark | Red checkmark | Red checkmark | Red checkmark | Green checkmark | | [Aggregate](#aggregate) | This field type lets you add a dropdown with a list of [aggregates](/docs/crm/aggregates). This way you can display an aggregate result in a record. | Red checkmark | Red checkmark | Red checkmark | Red checkmark | Green checkmark | | [Voucher](#voucher) | This field type lets you add a dropdown with a list of [voucher pools](/docs/assets/code-pools) and select a code from the pool. | Red checkmark | Red checkmark | Red checkmark | Green checkmark | Green checkmark | | [AI Recommendations](#ai-recommendation) | This field type lets you add a dropdown with list of [AI recommendations](/docs/ai-hub/recommendations-v2). This way you can display the recommendation results in a record. | Red checkmark | Red checkmark | Red checkmark | Green checkmark | Green checkmark | | [AI Search](#ai-search) | Shows the result of a search query | Red checkmark | Red checkmark | Red checkmark | Red checkmark | Green checkmark | | [AI Search listing](#ai-search-listing) | Shows the result of a listing from a search index | Red checkmark | Red checkmark | Red checkmark | Red checkmark | Green checkmark | | [Catalog](#catalog) | This field type lets you select a [Synerise catalog](/docs/assets/catalogs) as a context for data displayed in a record, for example, if you want to display information about a product. | Red checkmark | Red checkmark | Red checkmark | Red checkmark | Green checkmark | 1,2The number of fields with this setting is [limited](/docs/assets/brickworks/limits). ## Synerise object field reference ### Profile attribute This field lets you insert the value of an attribute from the profile for which content is generated from a record. #### Field configuration in a schema In **Default value**, you can select the default attribute to be inserted. ### Expression This field type lets you select an [expression](/docs/crm/expressions). The result of the expression is calculated in the context of a profile when generating an object from a record.
Expressions without a result are generated as `null` when generating content from the record.
#### Field configuration in a schema 1. In **Default value**, you can select the default expression. 2. If you want to return the full scope of information about the expression, select the **Include details in results** checkbox. #### Object generation example Expressions don't require extra parameters in the object generation request. In the following example, an expression calculates the age of the customer.
{
    "name": "Demo calculate age",
    "clientId": 11804828266,
    "result": 26,
    "expressionId": "b2c5cc0b-2830-435f-82a6-a2f0ebadd6d9",
    "variables": [],
    "title": "Demo calculate age "
}
26
### Metric This field type lets you select a [metric](/docs/analytics/metrics). The result of the metric is calculated in the context of a profile when generating an object from a record. #### Field configuration in a schema 1. In **Default value**, you can select the default metric to calculate. 2. If you want to return the full scope of information about the metric, select the **Include details in results** checkbox. #### Object generation example Metrics don't require extra parameters in the object generation request.
{
    "result": 10770077,
    "numberMetrics": [],
    "clientMetrics": [],
    "eventMetrics": []
}
10770077
### Aggregate This field type lets you select an [aggregate](/docs/crm/aggregates). The result of the aggregate is calculated in the context of a profile when generating an object from a record.
- For "TOP_MULTI" aggregates with the "Return null when object is missing" setting, the Brickworks result is an empty array (`[]`). - In other aggregate types, when the aggregate results in no value, the Brickworks result is `null`.
#### Field configuration in a schema 1. In **Default value**, you can select the default aggregate. 2. If you want to return the full scope of information about the aggregate, select the **Include details in results** checkbox. #### Object generation example Aggregates don't require extra parameters in the object generation request. In the following example, the aggregate returns an item ID.
{
    "dateFilter": {
        "type": "RELATIVE",
        "duration": {
            "type": "DAYS",
            "value": 30
        },
        "offset": {
            "type": "DAYS",
            "value": 0
        },
        "timeZone": "Europe/Warsaw"
    },
    "clientId": 11804828266,
    "result": "WINDBREAKER ZEPHYR",
    "variables": [],
    "analyticVersion": null,
    "title": "Last seen item from jacket category",
    "aggregateUuid": "8c950378-82fd-320d-abec-b90cec5208d5",
    "aggregateId": "8c950378-82fd-320d-abec-b90cec5208d5"
}
"WINDBREAKER ZEPHYR"
### Voucher This field type lets you return a code from a [voucher pool](/docs/assets/code-pools). #### Field configuration in a schema 1. In **Default value**, you can select a default pool to get codes from. 2. If you want to assign a voucher and always return the same voucher in subsequent requests for this profile, select the **Assign to user** checkbox. This setting can be changed per record. #### Object generation example The voucher code is returned in the `barcode` key. Vouchers don't require extra parameters in the object generation request.
{
    "barcode": "23123321321"
},
### AI recommendation This field type lets you include [AI recommendations](/docs/ai-hub/recommendations-v2). For each record, you can select a recommendation and display its results while generating an object with the record result. If a selected recommendation model requires an item context, you must provide it. The system checks for the context item in the following order: 1. ID provided in the object generation request. 2. ID from the record. 3. Default ID from the schema. In the ["Recommendation model summary" section](/docs/ai-hub/recommendations-v2/recommendation-types#recommendation-model-summary), you can find a table in which you can check which recommendation models require an item context. #### Field configuration in a schema 1. From the **Item context format** dropdown list, select how the context item ID is inserted: - **String** to provide a static string. - **Jinjava** to provide an insert from which the ID will be extracted. The value can be changed per record or when generating an object from the record, but the type (static string or Jinjava) is enforced by the schema. See the [Recommendation model summary](/docs/ai-hub/recommendations-v2/recommendation-types#recommendation-model-summary) to learn when a context item ID is required. 2. In **Default value**, you can set the default: - Recommendation campaign - Context item ID #### Object generation example
When generating an object from a record, you can provide an item context. This overrides the default from the schema and the values saved in the record. This data is provided in the `fieldContext.FIELDNAME` object. You can also add any additional request properties described in the ["Get recommendations by campaign" endpoint in the API reference](https://hub.synerise.com/api-reference/ai-recommendations#tag/Recommendations/operation/GetRecommendationsByCampaignV2). In the following example, `additionalFilters` is such a field.
"fieldContext": {
    "exampleRecommendation": {
        "itemId": "dd9f0a0e6ca8f385776c14de9dd277",
        "additionalFilters": "brand == exampleBrand"
    }
}
The result is a recommendation frame, same as in the recommendations API. To learn more about the properties, see the "[Get recommendations by campaign" endpoint in the API reference](https://hub.synerise.com/api-reference/ai-recommendations#tag/Recommendations/operation/GetRecommendationsByCampaignV2).
{
    "data": [
        {
            "name": "Infurniture - Jazmin Wine Glass",
            "price": 59,
            "brand": {
                "id": "86",
                "label": "Infurniture"
            },
            "product_subtype": {
                "id": "113",
                "label": "Wine Glass"
            },
            "itemId": "dd9f0a0e6ca8f385776c14de9dd277",
            "category": "Root Catalog > Default Category > Home > Glasses",
            "productUrl": "https://demoshop.synerise.com/infurniture-jazmin-wine-glass.html?snrai_campaign=yYjFMYPeofN5&snrai_id=9bbaee0d-b2d1-4a0f-9af2-1f2d49ae28d4",
            "image": "https://demoshop.synerise.com/media/catalog/product/d/d/dd9f0a0e6ca8f385776c14de9dd277.png"
        },
        {
            "name": "Lahome - Arcangel Chef's Knife",
            "price": 139,
            "brand": {
                "id": "87",
                "label": "Lahome"
            },
            "product_subtype": {
                "id": "123",
                "label": "Chef's Knife"
            },
            "itemId": "a84fe2f02fc18986600f956bb22864",
            "category": "Root Catalog > Default Category > Home > Knives",
            "productUrl": "https://demoshop.synerise.com/lahome-arcangel-chef-s-knife.html?snrai_campaign=yYjFMYPeofN5&snrai_id=9bbaee0d-b2d1-4a0f-9af2-1f2d49ae28d4",
            "image": "https://demoshop.synerise.com/media/catalog/product/a/8/a84fe2f02fc18986600f956bb22864.png"
        },
        {
            "name": "Homeset - Montell Bread Knife",
            "price": 389,
            "brand": {
                "id": "85",
                "label": "Homeset"
            },
            "product_subtype": {
                "id": "124",
                "label": "Bread Knife"
            },
            "itemId": "3640594393744b17d72aa3996c25f7",
            "category": "Root Catalog > Default Category > Home > Knives",
            "productUrl": "https://demoshop.synerise.com/homeset-montell-bread-knife.html?snrai_campaign=yYjFMYPeofN5&snrai_id=9bbaee0d-b2d1-4a0f-9af2-1f2d49ae28d4",
            "image": "https://demoshop.synerise.com/media/catalog/product/3/6/3640594393744b17d72aa3996c25f7.png"
        }
    ],
    "extras": {
        "campaignId": "yYjFMYPeofN5",
        "contextItems": null,
        "correlationId": "9bbaee0d-b2d1-4a0f-9af2-1f2d49ae28d4",
        "slots": [
            {
                "id": 0,
                "itemIds": [
                    "dd9f0a0e6ca8f385776c14de9dd277",
                    "a84fe2f02fc18986600f956bb22864",
                    "3640594393744b17d72aa3996c25f7"
                ],
                "name": "Unnamed slot",
                "rows": null
            }
        ]
    }
}
### AI Search This field lets you show the results of an [AI search](/docs/ai-hub/ai-search/introduction-to-ai-search#types-of-search-requests) query. #### Field configuration in a schema 1. From the **Query format** dropdown list, select how the query can be entered: - **String** to provide a static string. - **Jinjava** to provide an insert from which the query will be extracted. The value can be changed per record or when generating an object from the record, but the type (static string or Jinjava) is enforced by the schema. 2. In **Default value**, you can select the default: - Search index - Query text #### Object generation example The result in a generated object is a response from the [/search/v2/indices/{indexId}/query](https://hub.synerise.com/api-reference/ai-search#tag/Search/operation/SearchFullTextGet) endpoint. ```json { "data": [ { "itemId": "example1" } ], "extras": { "facetsOrdering": [], "appliedRules": [], "suggestions": [], "searchId": "fb4f34dec80bcf2be335b6bd0602e7b9", "correlationId": "fb4f34dec80bcf2be335b6bd0602e7b9" } } ``` ### AI Search listing This field lets you show the results of an [AI search listing](/docs/ai-hub/ai-search/introduction-to-ai-search#types-of-search-requests) query. #### Field configuration in a schema In **Default value**, you can select the default search index. #### Object generation example The result in a generated object is a response from the [/search/v2/indices/{indexId}/list](https://hub.synerise.com/api-reference/ai-search#tag/Listing/operation/ListingGet) endpoint. ```json { "data": [ { "itemId": "example1" }, { "itemId": "example2" }, { "itemId": "example3" } ], "extras": { "facetsOrdering": [], "appliedRules": [], "searchId": "fb4f34dec80bcf2be335b6bd0602e7b9", "correlationId": "fb4f34dec80bcf2be335b6bd0602e7b9" } } ``` ### Catalog This field type lets you select a [Synerise catalog](/docs/assets/catalogs) and an item from that catalog. The item's data (without the item key) is included in the response when an object is generated from a record. #### Field configuration in a schema 1. From the **Primary key format** dropdown list, define how you will provide the context: - **String** to provide a default static ID of the product which will serve as the context. - **Jinjava** to provide a default insert from which the ID will be extracted. The values can be changed per record, but the type (static string or Jinjava) is enforced by the schema. 2. In **Default value**, you can set the default: - Catalog ID - Primary key value (unique identifier of an item in the catalog) #### Object generation example
If the catalog item ID is inserted with the [`{{ context.keyName }}` insert](/docs/assets/brickworks/brickworks-jinjava-inserts), provide the value for the key:
"context": {
    "keyName": "sku1234"
}
In the following example, the catalog item has two properties. The primary key isn't returned.
{
    "name": "WINDBREAKER ZEPHYR",
    "color": "blue"
}
# Event list When you set up a new Workspace, some event definitions are immediately created. They are used by features such as tracking, analytics, automation, SDKs, and so on. This article is a list of events generated by various elements of Synerise. The events and their parameters can be used in Decision Hub or viewed in event details on a profile's card. ## Predictions | Event name | Description | Default retention | | --- | --- | --- | | [snr.prediction.score](/docs/assets/events/event-reference/predictions#snrpredictionscore) | A prediction was completed for a profile. Check the parameters to see the prediction score. | 30 days | | [snr.propensity.score](/docs/assets/events/event-reference/predictions#snrpropensityscore) | A propensity prediction was completed for a profile. Check the parameters to see the prediction score. | 30 days | | [snr.bestfit.score](/docs/assets/events/event-reference/predictions#snrbestfitscore) | A best fit prediction was completed for a profile. Check the parameters to see the prediction result. | 30 days | | [snr.lookalike.score](/docs/assets/events/event-reference/predictions#snrlookalikescore) | A lookalike prediction was completed for a profile. Check the parameters to see the prediction score. | 30 days | | [snr.ate.prediction](/docs/assets/events/event-reference/predictions#snrateprediction) | A time optimizer prediction was made for a profile. Check the parameters to see the result. | 30 days | ## Search | Event name | Description | Default retention | | --- | --- | --- | | [item.search](/docs/assets/events/event-reference/search#itemsearch) | AI Search returned response to a search request. | 30 days | | [item.search.classification](/docs/assets/events/event-reference/search#itemsearchclassification) | AI search returned response to a search request using [predictive filtering](/docs/ai-hub/ai-search/predictive-filtering). | 30 days | | [item.search.click](/docs/assets/events/event-reference/search#itemsearchclick) | An item was clicked in an AI search result. | 30 days | | [suggestion.search](/docs/assets/events/event-reference/search#suggestionsearch) | A request to a suggestion index has been sent. | 30 days | | [suggestion.search.click](/docs/assets/events/event-reference/search#suggestionsearchclick) | An item from a suggestion was clicked in an AI search result. | 30 days | | [variant.assign](/docs/assets/events/event-reference/search#variantassign) | A variant of A/B test has been assigned to a customer. | 30 days | ## Customer AI Assistant | Event name | Description | Default retention | | --- | --- | --- | | [assistant.click](/docs/assets/events/event-reference/customer-ai-assistant#assistantclick) | An item shown in the assistant response was clicked. | 30 days | | [assistant.conversationStart](/docs/assets/events/event-reference/customer-ai-assistant#assistantconversationstart) | A profile started a conversation with the assistant. | 30 days | | [assistant.responseGenerated](/docs/assets/events/event-reference/customer-ai-assistant#assistantresponsegenerated) | The assistant produced a response to a profile's message. | 30 days | ## Profiles | Event name | Description | Default retention | | --- | --- | --- | | [client.add](/docs/assets/events/event-reference/profiles#clientadd) | A profile was added to the database. | 30 days | | [client.identify](/docs/assets/events/event-reference/profiles#clientidentify) | A profile was updated with information that changed its status to “recognized”. By default, this happens when an email address is provided. | 30 days | | [client.register](/docs/assets/events/event-reference/profiles#clientregister) | A profile was registered successfully. This event is only generated for Registration-as-a-Service. | 30 days | | [client.updateData](/docs/assets/events/event-reference/profiles#clientupdatedata) | Legacy event, replaced by `profile.updated`. | 30 days | | [profile.updated](/docs/assets/events/event-reference/profiles#profileupdated) | A profile was updated. | 90 days | | [client.addTag](/docs/assets/events/event-reference/profiles#clientaddtag) | A tag was assigned to a profile. | 30 days | | [client.removeTag](/docs/assets/events/event-reference/profiles#clientremovetag) | A tag was removed from a profile. | 30 days | | [client.merge](/docs/assets/events/event-reference/profiles#clientmerge) | Two or more profiles were merged into one. | 30 days | | [profile.MembershipAttributeUpdated](/docs/assets/events/event-reference/profiles#profilemembershipattributeupdated) | A [membership attribute](/docs/settings/workspace/multibrand-workspaces/sharing-segmentation-results#generated-events-and-attributes) has been created or updated. | 30 days | ## Transactions, cart, favorites | Event name | Description | Default retention | | --- | --- | --- | | [transaction.charge](/docs/assets/events/event-reference/items#transactioncharge) | A transaction was completed. This event is the summary of the transaction. Additionally, product.buy events are generated automatically for each item in the transaction. | infinite | | [product.buy](/docs/assets/events/event-reference/items#productbuy) | This event is generated for each item in a transaction. If multiple copies of the item were bought, they are summarized in a single product.buy event. | infinite | | [transaction.cancel](/docs/assets/events/event-reference/items#transactioncancel) | A transaction was cancelled and funds need to be returned. | 30 days | | [product.addToCart](/docs/assets/events/event-reference/items#productaddtocart) | A customer added an item to their cart. | infinite | | [product.removeFromCart](/docs/assets/events/event-reference/items#productremovefromcart) | A customer removed an item from their cart. | infinite | | [cart.status](/docs/assets/events/event-reference/items#cartstatus) | A summary of the cart’s current contents, generated every time after an item is added or removed. | 30 days | | [product.addToFavorite](/docs/assets/events/event-reference/items#productaddtofavorite) | A user added an item to favorites. | 30 days | | [product.removeFromFavorite](/docs/assets/events/event-reference/items#productremovefromfavorite) | A user removed an item from favorites. | 30 days | | [product.addReview](/docs/assets/events/event-reference/items#productaddreview) | A logged-in customer submitted a product review. Generated as a result of integrating Synerise with VTEX IO and Sylius. | 30 days | ## Loyalty | Event name | Description | Default retention | | --- | --- | --- | | [points.loyalty](/docs/assets/events/event-reference/loyalty#pointsloyalty) | A profile’s loyalty point number increased. | 30 days | | [client.removePoints](/docs/assets/events/event-reference/loyalty#clientremovepoints) | A profile’s loyalty points were decreased. | 30 days | | [points.sent](/docs/assets/events/event-reference/loyalty#pointssent) | Loyalty points were sent to a different profile. | 30 days | | [points.received](/docs/assets/events/event-reference/loyalty#pointsreceived) | Loyalty points were received from a different profile. | 30 days | | [client.activatePromotion](/docs/assets/events/event-reference/loyalty#clientactivatepromotion) | A promotion was activated. | 30 days | | [client.deactivatePromotion](/docs/assets/events/event-reference/loyalty#clientdeactivatepromotion) | A promotion was deactivated. | 30 days | | [client.promotionExpire](/docs/assets/events/event-reference/loyalty#clientpromotionexpire) | A promotion expired for a profile. | 30 days | | [client.promotionRequest](/docs/assets/events/event-reference/loyalty#clientpromotionrequest) | A promotion request was made by a point of sales. | 30 days | | [client.promotionActivationLimitReached](/docs/assets/events/event-reference/loyalty#clientpromotionactivationlimitreached)| A promotion wasn't activated because its global limit is exhausted. | 30 days | | [handbill.assign](/docs/assets/events/event-reference/loyalty#handbillassign) | Promotions from a personalized promotion were assigned to a profile. | 30 days | | [voucherCode.assigned](/docs/assets/events/event-reference/loyalty#vouchercodeassigned) | A voucher was assigned to a profile. | 30 days | | [voucherCode.redeemed](/docs/assets/events/event-reference/loyalty#vouchercoderedeemed) | A voucher was redeemed. | 30 days | ## Automation | Event name | Description | Default retention | | --- | --- | --- | | [attachment.expired](/docs/assets/events/event-reference/automation#attachmentexpired) | An attachment has expired and cannot be used in the Send Email node as a dynamic attachment. | 30 days | | [attachment.failed](/docs/assets/events/event-reference/automation#attachmentfailed) | An upload of an attachment failed and the file cannot be used in the Send Email node as a dynamic attachment. | 30 days | | [attachment.upload](/docs/assets/events/event-reference/automation#attachmentupload) | A base64 encoded file has been uploaded successfully and it is ready to be used as a dynamic attachment in the Send Email node. | 30 days | | [automation.abTestVariantAssigned](/docs/assets/events/event-reference/automation#automationabtestvariantassigned) |A profile reached the [ABx Test node](/docs/automation/conditions/abx-split-node) and the A/B/X test variant has been assigned to them. | 30 days | | [automation.clientStartPath](/docs/assets/events/event-reference/automation#automationclientstartpath) | A profile entered a workflow path. | 2 days | | [automation.clientPathStep](/docs/assets/events/event-reference/automation#automationclientpathstep) | A profile completed a step (node) in a workflow path. | 2days | | [automation.clientEndPath](/docs/assets/events/event-reference/automation#automationclientendpath) | A profile completed a journey by reaching the End node in one of a workflow’s paths. | 2 days | | [automation.clientPathAborted](/docs/assets/events/event-reference/automation#automationclientpathaborted) | The Profile’s transition through the workflow was interrupted for reasons other than the workflow’s completion.| 30 days | | [automation.clientPathError](/docs/assets/events/event-reference/automation#automationclientpatherror) | The Profile’s transition through the workflow was interrupted due to a Jinjava syntax error, for example. | 30 days | |[automation.flowLimiterCount](/docs/assets/events/event-reference/automation#automationflowlimitercount)| A profile transitioned through the Flow Limiter node. | 30 days | ## Integration | Event name | Description | Default retention | | --- | --- | --- | | [amazonApiGateway.sendRequest](/docs/assets/events/event-reference/integration#amazonapigatewaysendrequest) | A response from Amazon API Gateway has been received. | 30 days | | [bigQuery.uploadData](/docs/assets/events/event-reference/integration#bigqueryuploaddata) | A response from Google Big Query has been received. | 30 days | | [eagleEye.couponCreated](/docs/assets/events/event-reference/integration#eagleeyecouponcreated) | A response from Eagle Eye was received. | 30 days | | [facebook.sendCustomEvent](/docs/assets/events/event-reference/integration#facebooksendcustomevent) | A response to sending custom events to Facebook was received. | 30 days | | [facebook.removeFromAudience](/docs/assets/events/event-reference/integration#facebookremovefromaudience) | A response to removing customers from Facebook Custom Audience was received. | 30 days | | [facebook.sendAudience](/docs/assets/events/event-reference/integration#facebooksendaudience) | A response to sending customers to Facebook Custom Audience was received. | 30 days | | [facebook.sendOfflineTransaction](/docs/assets/events/event-reference/integration#facebooksendofflinetransaction) | A response to sending offline transactions to Facebook was received. | 30 days | | [facebook.sendOnlineTransaction](/docs/assets/events/event-reference/integration#facebooksendonlinetransaction) | A response to sending online transactions to Facebook was received. | 30 days | | [googleAds.sendOfflineConversion](/docs/assets/events/event-reference/integration#googleadssendofflineconversion) | A response from Google Ads was received. | 30 days | | [googleSheets.uploadData](/docs/assets/events/event-reference/integration#googlesheetsuploaddata) | A response from Google Sheets was received. | 30 days | | [MSteams.sendChannelMessage](/docs/assets/events/event-reference/integration#msteamssendchannelmessage) | A response from Microsoft Teams was received. | 30 days | | [pubSub.publishMessage](/docs/assets/events/event-reference/integration#pubsubpublishmessage) | A response from Google Cloud Pub/Sub was received. | 30 days | | [pubSub.publishRawMessages](/docs/assets/events/event-reference/integration#pubsubpublishrawmessages) | A response from Google Cloud Pub/Sub was received. | 30 days | | [salesforce.getLead](/docs/assets/events/event-reference/integration#salesforcegetlead) | A response for a request to retrieve a lead information from Salesforce CRM was received. | 30 days | | [salesforce.leadCreated](/docs/assets/events/event-reference/integration#salesforceleadcreated) | A response for creating a lead in Salesforce CRM was received. | 30 days | | [salesforce.leadUpdated](/docs/assets/events/event-reference/integration#salesforceleadupdated) | A response for updating lead information in Salesforce CRM was received. | 30 days | | [slack.sendChannelMessage](/docs/assets/events/event-reference/integration#slacksendchannelmessage) | A response from Slack was received. | 30 days | | [trustmate.createInvitation](/docs/assets/events/event-reference/integration#trustmatecreateinvitation) | A response to creating an invitation has been received from Trustmate. | 30 days | | [trustmate.getSurveyLinks](/docs/assets/events/event-reference/integration#trustmategetsurveylinks) | A response to getting survey links has been received from Trustmate. | 30 days | [weatherapi.getWeatherInfo](/docs/assets/events/event-reference/integration#weatherapigetweatherinfo) | A response from Weather API was received. | 30 days | | [webhook.response](/docs/assets/events/event-reference/integration#webhookresponse-and-custom-webhook-response-names) (and custom webhook response names) | An outgoing webhook from an Automation returned a response. | 30 days | | [webhook.timeout](/docs/assets/events/event-reference/integration#webhooktimeout) | An Outgoing Integration node timed out. | 30 days | [whatsapp.sendTemplateMessage](/docs/assets/events/event-reference/integration#whatsappsendtemplatemessage) | A response from Weather API was received. | 30 days | ## Landing page | Event name | Description | Default retention | | --- | --- | --- | |[landingpage.visit](/docs/assets/events/event-reference/landing-page#landingpagevisit) | A visit to the landing page. |30 days| |[landingpage.renderFail](/docs/assets/events/event-reference/landing-page#landingpagerenderfail) | A landing page couldn't be generated. |30 days| ## Email | Event name | Description | Default retention | | --- | --- | --- | | [marketingAgreement.turnOn](/docs/assets/events/event-reference/email#marketingagreementturnon) | A marketing agreement was enabled in a profile. | 30 days | | [marketingAgreement.turnOff](/docs/assets/events/event-reference/email#marketingagreementturnoff) | A marketing agreement was disabled in a profile. | 30 days | | [newsletter.unsubscribe](/docs/assets/events/event-reference/email#newsletterunsubscribe) | The synerise unsubscribe link (generated with the {{ synerise-resign-link }} insert) was used to unsubscribe from a newsletter. | 30 days | | [message.send](/docs/assets/events/event-reference/email#messagesend) | An email was sent to a profile. | 90 days | | [newsletter.capping](/docs/assets/events/event-reference/email#newslettercapping) | An email was not sent due to message limits set for this type of communication. | 30 days | | [newsletter.controlGroup](/docs/assets/events/event-reference/email#newslettercontrolgroup) | An email was not sent because the recipient belongs to the control group. | 30 days | | [message.skipped](/docs/assets/events/event-reference/email#messageskipped) | An email was not sent because Silence Hours were active. | 30 days | | [newsletter.open](/docs/assets/events/event-reference/email#newsletteropen) | An email was opened by a recipient. | 90 days | | [newsletter.click](/docs/assets/events/event-reference/email#newsletterclick) | A recipient clicked a link in an email. | 90 days | | [message.notSent](/docs/assets/events/event-reference/email#messagenotsent) | An email was not sent. | 30 days | | [newsletter.dropped](/docs/assets/events/event-reference/email#newsletterdropped) | The recipient's email address is on the denylist. | 30 days | | [newsletter.hardbounce](/docs/assets/events/event-reference/email#newsletterhardbounce) | An email was not delivered because the email address is invalid or the recipient blocked receiving emails. | 90 days | | [newsletter.softbounce](/docs/assets/events/event-reference/email#newslettersoftbounce) | An email was not delivered due to an overloaded inbox, server error, or email size. | 90 days | | [newsletter.spambounce](/docs/assets/events/event-reference/email#newsletterspambounce) | The recipient's email server recognized the message as potential spam. The email is rejected and **not saved**, even in the spam folder. | 90 days |
The `newsletter.hardbounce`, `newsletter.softbounce`, `newsletter.spambounce`, and `newsletter.dropped` events are generated depending on the selected provider.
## Web push | Event name | Description | Default retention | | --- | --- | --- | | [webpush.subscribe](/docs/assets/events/event-reference/webpush#webpushsubscribe) | Web push permission was enabled in a profile.| 30 days | | [webpush.unsubscribe](/docs/assets/events/event-reference/webpush#webpushunsubscribe) | Web push permission was disabled in a profile. | 90 days | | [webpush.subscribeBlock](/docs/assets/events/event-reference/webpush#webpushsubscribeblock) | A profile rejected a web push subscription in the agreement form. | 30 days | | [webpush.subscribeDiscard](/docs/assets/events/event-reference/webpush#webpushsubscribediscard) | A web push subscription form was closed or no interaction with it occurred. | 90 days | | [webpush.permissionAgree](/docs/assets/events/event-reference/webpush#webpushpermissionagree) | A profile allowed web push notifications in the browser's native mechanism. | 90 days | | [webpush.permissionBlock](/docs/assets/events/event-reference/webpush#webpushpermissionblock) | A profile denied web push notifications in the browser's native mechanism. | 30 days | | [webpush.permissionDiscard](/docs/assets/events/event-reference/webpush#webpushpermissiondiscard) | A web push subscription form (browser-native) was closed or no interaction with it occurred. | 30 days | | [webpush.send](/docs/assets/events/event-reference/webpush#webpushsend) | A web push notification was sent. | 90 days | | [webpush.capping](/docs/assets/events/event-reference/webpush#webpushcapping) | A web push notification was not sent due to message limits set for this type of communication. | 30 days | | [webpush.notSent](/docs/assets/events/event-reference/webpush#webpushnotsent) | A web push notification was not sent. The parameters explain the reason. | 30 days | | [webpush.controlGroup](/docs/assets/events/event-reference/webpush#webpushcontrolgroup) | A web push notification was not displayed because the recipient belongs to the control group. | 30 days | | [webpush.skipped](/docs/assets/events/event-reference/webpush#webpushskipped) | A web push notification was not sent because Silence Hours were active. | 30 days | | [webpush.show](/docs/assets/events/event-reference/webpush#webpushshow) | A web push notification was viewed. | 90 days | | [webpush.click](/docs/assets/events/event-reference/webpush#webpushclick) | A web push notification was clicked. | 90 days | | [webpush.mismatchSenderId](/docs/assets/events/event-reference/webpush#webpushmismatchsenderid) | A web push message was not sent, because the Firebase project to which the profile was registered changed. | 30 days | | [webpush.invalidRegistrationId](/docs/assets/events/event-reference/webpush#webpushinvalidregistrationid) | A web push message was not sent due to an incorrectly assigned registrationId in Firebase. | 30 days | | [webpush.notRegistered](/docs/assets/events/event-reference/webpush#webpushnotregistered) | A web push notification was not sent due to an invalid Firebase token. | 30 days | | [webpush.tokenDelete](/docs/assets/events/event-reference/webpush#webpushtokendelete) | A Firebase token for web push notifications was deleted. | 30 days | | [webpush.tokenUpdate](/docs/assets/events/event-reference/webpush#webpushtokenupdate) | A Firebase token for web push notifications was updated. | 30 days | ## Dynamic Content | Event name | Description | Default retention | | --- | --- | --- | | [dynamicContent.show](/docs/assets/events/event-reference/dynamic-content#dynamiccontentshow) | Dynamic content on a web page was displayed to a visitor. | 90 days | | [dynamicContent.controlGroup](/docs/assets/events/event-reference/dynamic-content#dynamiccontentcontrolgroup) | The message wasn’t displayed because the recipient belongs to the control group. | 30 days | | [dynamicContent.click](/docs/assets/events/event-reference/dynamic-content#dynamiccontentclick) | Dynamic content on a web page was clicked by a visitor. | 90 days | | [variant.assign](/docs/assets/events/event-reference/dynamic-content#variantassign) | A variant of A/B test has been assigned to a customer. | 30 days | ## SMS | Event name | Description | Default retention | | --- | --- | --- | | [sms.send](/docs/assets/events/event-reference/sms#smssend) | An SMS was sent to a profile. | 30 days | | [sms.notSent](/docs/assets/events/event-reference/sms#smsnotsent) | An SMS was not sent. | 30 days | | [sms.capping](/docs/assets/events/event-reference/sms#smscapping) | An SMS was not sent due to message limits for this type of communication in the workspace settings (not related to capping for a particular automation). | 30 days | | [sms.click](/docs/assets/events/event-reference/sms#smsclick) | A link in an SMS was clicked. | 30 days | | [sms.controlGroup](/docs/assets/events/event-reference/sms#smscontrolgroup) | An SMS was was not sent because the recipient belongs to the control group. | 30 days | | [sms.skipped](/docs/assets/events/event-reference/sms#smsskipped) | An SMS was not sent because Silence Hours were active. | 30 days | ## Mobile campaigns | Event name | Description | Default retention | | --- | --- | --- | | [mobileCampaign.view](/docs/assets/events/event-reference/mobile-communication#mobilecampaignview) | A mobile campaign banner or walkthrough was viewed. | 30 days | | [mobileCampaign.clicked](/docs/assets/events/event-reference/mobile-communication#mobilecampaignclicked) | A mobile campaign banner or walkthrough was clicked. | 30 days | | [mobileCampaign.closed](/docs/assets/events/event-reference/mobile-communication#mobilecampaignclosed) | A mobile campaign banner or walkthrough was closed. | 30 days | | [mobileCampaign.finished](/docs/assets/events/event-reference/mobile-communication#mobilecampaignfinished) | A walkthrough was completed. | 30 days | | [screen.content](/docs/assets/events/event-reference/mobile-communication#screencontent) | A screen view campaign was displayed | 30 days | | [product.like](/docs/assets/events/event-reference/mobile-communication#productlike) | A mobile app user clicked the "like" button in the content widget | 30 days | | [product.dislike](/docs/assets/events/event-reference/mobile-communication#productdislike) | A mobile app user clicked the "dislike" button in the content widget | 30 days | ## Mobile push | Event name | Description | Default retention | | --- | --- | --- | | [push.send](/docs/assets/events/event-reference/mobile-push#pushsend) | A mobile push notification was sent to a profile. | 30 days | | [push.capping](/docs/assets/events/event-reference/mobile-push#pushcapping) | A mobile push was not sent due to message limits set for this type of communication. | 30 days | | [push.view](/docs/assets/events/event-reference/mobile-push#pushview) | A mobile push notification was shown in the system notification drawer. | 30 days | | [push.notView](/docs/assets/events/event-reference/mobile-push#pushnotview) | **Android 7.0+ only**: A mobile notification was sent, but the device did not display it | 30 days | | [push.click](/docs/assets/events/event-reference/mobile-push#pushclick) | A mobile push notification was tapped. | 30 days | | [push.button.click](/docs/assets/events/event-reference/mobile-push#pushbuttonclick-deprecated) |**DEPRECATED** A button in a simple push was tapped. | 30 days | | [push.openInApp](/docs/assets/events/event-reference/mobile-push#pushopeninapp) | A mobile push notification was viewed in the app. | 30 days | | [push.dismiss](/docs/assets/events/event-reference/mobile-push#pushdismiss) | A mobile push notification was dismissed. | 30 days | | [push.notSent](/docs/assets/events/event-reference/mobile-push#pushnotsent) | A push notification was not sent.| 30 days | | [push.imageTimeout](/docs/assets/events/event-reference/mobile-push#pushimagetimeout) | An image in a mobile push notification could not be loaded. | 30 days | | [push.controlGroup](/docs/assets/events/event-reference/mobile-push#pushcontrolgroup) | A mobile push notification was not sent because the recipient belongs to the control group. | 30 days | | [push.skipped](/docs/assets/events/event-reference/mobile-push#pushskipped) | A mobile push was not sent because Silence Hours were active. | 30 days | | [push.mismatchSenderId](/docs/assets/events/event-reference/mobile-push#pushmismatchsenderid) | A mobile push message was not sent, because the Firebase project to which the profile was registered changed. | 30 days | | [push.invalidRegistrationId](/docs/assets/events/event-reference/mobile-push#pushinvalidregistrationid) | A mobile push message was not sent due to an incorrectly assigned registrationId in Firebase. | 30 days | | [push.notRegistered](/docs/assets/events/event-reference/mobile-push#pushnotregistered) | A push notification was not sent due to an invalid Firebase token. | 30 days | | [push.tokenDelete](/docs/assets/events/event-reference/mobile-push#pushtokendelete) | A Firebase token for mobile push notifications was deleted. | 30 days | | [push.tokenUpdate](/docs/assets/events/event-reference/mobile-push#pushtokenupdate) | A Firebase token for mobile push notifications was updated. | 30 days | ## In-app Mobile Campaigns | Event name | Description | Default retention | | --- | --- | --- | | [inApp.show](/docs/assets/events/event-reference/inapp#inappshow) | An in-app message was shown. | 30 days | | [inApp.capping](/docs/assets/events/event-reference/inapp#inappcapping) | An in-app message was not displayed due to capping. | 30 days | | [inApp.click](/docs/assets/events/event-reference/inapp#inappclick) | The content of an in-app message was tapped. | 30 days | | [inApp.controlGroup](/docs/assets/events/event-reference/inapp#inappcontrolgroup) | An in-app message was not displayed because the recipient belongs to the control group. | 30 days | | [inApp.discard](/docs/assets/events/event-reference/inapp#inappdiscard) | An in-app message was closed. | 30 days | | [inApp.hide](/docs/assets/events/event-reference/inapp#inapphide) | An in-app message was hidden. | 30 days| | [inApp.customHook](/docs/assets/events/event-reference/inapp#inappcustomhook) | A custom action (implemented by your app developers and included in the in-app definition) from an in-app message was triggered. | 30 days | | [inApp.renderFail](/docs/assets/events/event-reference/inapp#inapprenderfail) | An in-app message was not displayed due to an error. This may be caused, for example, by an error in the Jinjava syntax or a connection problem. | 30 days | ## Recommendations | Event name | Description | Default retention | | --- | --- | --- | | [recommendation.generated](/docs/assets/events/event-reference/recommendations#recommendationgenerated) | A recommendation set was generated for a profile. | 30 days | | [recommendation.view](/docs/assets/events/event-reference/recommendations#recommendationview) | A recommendation frame was displayed to a viewer. The parameters may include a list of the items in the frame, depending on your implementation. | 30 days | | [recommendation.click](/docs/assets/events/event-reference/recommendations#recommendationclick) | A recommended item was clicked. | 30 days | | [recommendation.seen](/docs/assets/events/event-reference/recommendations#recommendationseen) | Event from content widget. Sent by mobile SDKs separately for each item in a displayed recommendation. | 30 days | | [variant.assign](/docs/assets/events/event-reference/recommendations#variantassign) | A variant of A/B test has been assigned to a customer. | 30 days | ## Website and app interactions | Event name | Description | Default retention | | --- | --- | --- | | [session.start](/docs/assets/events/event-reference/web-and-app#sessionstart) | A visitor entered the website or a user opened the mobile application and a session was opened. The session ends when 30 minutes pass since the last activity. | 30 days | | [session.end](/docs/assets/events/event-reference/web-and-app#sessionend) | 30 minutes passed since the last activity and the session was closed. | 30 days | | [client.applicationStarted](/docs/assets/events/event-reference/web-and-app#clientapplicationstarted) | A user opened the mobile application. | 30 days | | [client.applicationCrashed](/docs/assets/events/event-reference/web-and-app#clientapplicationcrashed) | Report about a mobile application crash, with additional data for troubleshooting. | 30 days | | [click.errorReceiver](/docs/assets/events/event-reference/web-and-app#clickerrorreceiver) | The SDK couldn't start an intent because of an `ActivityNotFoundException`. | 30 days | | [client.login](/docs/assets/events/event-reference/web-and-app#clientlogin) | A user logged in to the website or mobile application. This event is only generated for OAuth and Registration-as-a-Service authentication. | 30 days | | [client.anonymousLogin](/docs/assets/events/event-reference/web-and-app#clientanonymouslogin) | An anonymous profile generated a new authentication token. | 30 days | | [client.simpleAuthLogin](/docs/assets/events/event-reference/web-and-app#clientsimpleauthlogin)| A user logged in with [Simple Profile Authentication](/developers/mobile-sdk/user-identification-and-authorization/simple-authentication) | 30 days | | [client.tryToLogInToInactiveAccount](/docs/assets/events/event-reference/web-and-app#clienttrytologintoinactiveaccount) | A profile tried to log in to an inactive account. | 30 days | | [client.logout](/docs/assets/events/event-reference/web-and-app#clientlogout) | A user logged out from the website or mobile application. By default, this event is generated only when you use Synerise Registration-as-a-Service. | 30 days | | [page.visit](/docs/assets/events/event-reference/web-and-app#pagevisit) | A user visited a website. | 30 days | | [product.view](/docs/assets/events/event-reference/web-and-app#productview) | A mobile application user viewed an item. This is equivalent to a page.visit event generated for an item’s web page. | 30 days | | [screen.view](/docs/assets/events/event-reference/web-and-app#screenview) | The mobile application rendered and display a new view. | 90 days | | [screen.click](/docs/assets/events/event-reference/web-and-app#screenclick) | This event is sent every time somebody clicks a clickable object from a view. | 30 days | | [form.submit](/docs/assets/events/event-reference/web-and-app#formsubmit) | A website visitor has submitted a data form, for example a newsletter subscription. | 30 days | | [client.hitTimer](/docs/assets/events/event-reference/web-and-app#clienthittimer) | Timer events can be used to measure time between activities. They are implemented by your developers according to business needs. This event tells when a timer was used, there is no start/stop mechanism. | 30 days | | [client.shared](/docs/assets/events/event-reference/web-and-app#clientshared) | A “share” button was used to share content, for example to social media. | 30 days | ## Brickworks | Event name | Description | Default retention | | --- | --- | --- | | [brickworks.generated](/docs/assets/events/event-reference/brickworks#brickworksgenerated) | Brickworks content was generated for a profile. | 30 days | | [brickworks.generated.error](/docs/assets/events/event-reference/brickworks#brickworksgeneratederror) | Brickworks generation failed due to an error. | 30 days | # Importing custom events You can import custom events to Synerise. Remember that you can import one type of events at a time. Some events as a result of being imported to the application may create new profiles. To see if an event creates a profile, check its [configuration](/docs/assets/events/event-settings). ### Benefits After importing custom events to Synerise, you can perform the following actions: - [Analyze behavior of your profiles](/docs/analytics). - Create filters and [audiences](/docs/analytics/segmentations) on the basis of imported events. - [Create workflows](/docs/automation). - Create [predictions](/docs/ai-hub/predictions). ## Requirements --- - You need user permissions that grants you access to Simple Imports or/and Automation - Prepare a file that contains one the following profile identifiers (the list contains recommended column names, if you use different names you will be able to map/transform data during the process): - `email` - `clientId` - `uuid` - `customId`
If you choose an email as an identifier, pay attention to the correct format of emails. Otherwise, your import will fail.
- Spaces and special characters in the column headers are not allowed. - `.CSV` files must be UTF-8 encoded - Maximum file size: 200 MB. ### Tips for preparing a CSV file - Recommended file metacharacters: - A character that splits columns (delimiter): `,` - A character that is used to contain the text (quotation mark): `"` - A character (escape character) that changes the default interpretation of a sign or string followed by the escape character: `\` - For more details about parameters and their accepted formats, click [here](https://hub.synerise.com/api-reference/profile-management#operation/CustomEvent). ## Procedure --- ### Selecting the file for import In this part of the process, you will upload a file from your device. 1. Go to Data Modeling Hub icon **Data Modeling Hub > Imports > New import**. 2. As the data type for import, select **Custom events**. 3. As the import method, select one of the following options: - Import a local file - To import a single `.csv` file to Synerise. - Import in Automation - To import a .`csv`, `.json`, `.jsonl`, and `.xml` files and execute periodical imports.
1. Upload the `.csv` file by using the **+ Upload file or drop one here** field. 2. Optionally, you can customize the file metacharacters by clicking the arrow down icon. 1. From the **Delimiter** dropdown, select the character that marks the end of a column. 2. From the **Quotation mark** dropdown list, select the characters that contain the text or data type. 3. From the **Escape character** dropdown lists, select the character which changes the default interpretation of a character or a string followed by the escape character. 3. To proceed to the next step, click the **Next** button. ### Mapping the columns with parameters in Synerise In this part of the process, you will select the event which you want to import. Thanks to that, during the mapping process the system will prompt the parameters for mapping based on the event type. You can exclude parameters from the import. During the mapping process, you can't add new columns to the imported file. ### Launching import After steps described above you'll be redirected to the mapping summary. If it's correct, to launch the import, click **Run import**. On the user interface, you will be presented with two columns - the left column displays the names of the columns from the imported file, the other contains dropdown lists with the parameters available in Synerise. The dropdown lists indicate the **required** parameters for a an import. 1. Next to the file column name, from the dropdown list, select the corresponding parameter in Synerise. Perform this step for all columns in your file. 2. To exclude a parameter from import, next to the column name, click this icon: An arrow icon **Result**: The icon changes to Don't import icon 3. To proceed to the summary of the import, click **Next**. **Result**: The summary of the import is displayed. 4. After checking the import summary, to start the import, click **Run import**.
1. Select the method of delivering the file: - Local File - This option allows you to upload a file from your device. - SFTP protocol - This option allows you to upload a file from a server using the SFTP protocol. - HTTPS protocol - This option allows you to upload a file from a server using the HTTPS protocol. - Amazon S3 - This option allows you to upload a file from Amazon S3 bucket. - Azure - This option allows you to upload a file from Azure Blob Storage. - Google Cloud Storage - This option allows you to upload a file from Google Cloud Storage. 2. Click **Go to import template**. 3. Define the settings of the [Scheduled Run node](/docs/automation/triggers/scheduled-run). 4. Depending on the method of delivering the file, configure the settings of [Local File](/docs/automation/integration/http-integrations/http-get-file) or the [Get File](/docs/automation/integration/http-integrations/http-get-file) node that uses HTTP protocol or the [Get File](/docs/automation/integration/sftp-integrations/sftp-get-file) node that uses SFTP protocol. 5. If the data requires modification, configure the settings of the [Data Transformation node](/docs/automation/operation/data-transformation-node). If you have prepared the transformation rules for the data structure of the imported file, select it from the dropdown list. If not, create it from scratch. You can remove this node if your data doesn't require transformation. 6. The rest of the nodes in the default template don't require any further configuration. 7. If your workflow is ready, click **Save & Run**.
# Schema records Once you create a schema, you can use it to record data in the database.
Schema records can also be added or deleted by automations and your own applications using the Synerise API.
## Adding records You can manually add a single record. 1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. In the list of schemas, click the schema. 3. In the upper-right corner, click **Add record**. 4. In the view that opens, fill in the data required by the schema. 5. Click **Apply**. 6. To add more records, repeat the procedure. ## Viewing record details 1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. In the list of schemas, click a schema. 3. In the list of records, click a record. **Result:** A pop-up with the record's details opens. ## Deleting records Deleting records is irreversible. 1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. In the list of schemas, click a schema. 3. In the list of records, locate the record to delete and click Three dot icon. 4. In the menu that opens, click **Delete**. **Result:** The record is permanently deleted. # Removing documents When you no longer need a document, remove it from the application. When deleting a document, you will get a warning if it's used in a screen view campaign. If you delete such a document, it will no longer be displayed in the campaign.
The removal is permanent.
1. Go to Data Modeling Hub icon **Data Modeling Hub > Documents**. 2. On the list of documents, find the one you want to delete. 3. Click the Three-dot icon icon and from the dropdown select **Delete**. 4. Confirm your choice by clicking **OK** on the pop-up. # Previewing catalogs You can check the contents of the catalogs. 1. Go to Data Modeling Hub icon **Data Modeling Hub > Catalogs**. 2. On the list, find the catalog you want to check the contents of. 3. Click the Three-dot icon icon and from the dropdown list, select **Preview**. # Record lifecycle ## Record versioning Record versioning is available only for records created from [managed schemas](/docs/assets/brickworks/quick-start#schema-types). - Only records in the published state are visible and accessible via API. Records in draft, scheduled, or unpublished states cannot be retrieved through public API endpoints. - Only records in the published state are versioned. - Only one version can be published or scheduled at any time, preventing content conflicts. - Draft versions operate in complete isolation from live content systems. - Multiple unpublished versions can coexist for comprehensive historical tracking. - Unpublished versions cannot be directly reactivated - you must return it to the draft version first. ## Record states The table below lists all possible states a record can have. It also explains the conditions under which a record transitions into each specific state, based on the type of schema used to create the record. | State | Description | Schema types | |-------------|------------------------------------------------------------------------------------------------------------------------------------| --- | | Draft | A version under preparation, invisible via API and downstream systems. Ideal for collaboration, editing, or staging content before it goes live. | [Managed](/docs/assets/brickworks/quick-start#schema-types) | | Scheduled | A version set to go live at a defined future date and time. Enables precise coordination of launches, promotions, or time-sensitive changes. | Managed | Published | The live, production-ready version, available for distribution and consumption across all integrated systems and accessible through API. | [Simple and managed](/docs/assets/brickworks/quick-start#schema-types) | | Unpublished | A record removed from public availability after being published. Content still exists but is not accessible through public APIs. | Managed | ## State transitions | Transition | Description | |------------------------|-----------------------------------------------------------------------------------------------------------------------------| | Draft > Scheduled | Move a draft to scheduled state by setting a future publication date and time, allowing for coordinated launches. | | Draft > Published | Publish a draft immediately without scheduling, making it available via API right away. | | Scheduled > Published | Scheduled records automatically become published at the designated time or can be manually published earlier. | | Published > Unpublished | Remove a live record from public access while preserving its content. | | Unpublished > Draft | Return an unpublished record to draft for editing and revision before republishing. This is the only way to modify unpublished records. | ## Record scheduling Brickworks provides organizations with precise control over content timing and availability through a powerful, built-in scheduling system that automates the entire content lifecycle. Rather than depending on manual deployments or scrambling with last-minute updates, teams can strategically plan, prepare, and orchestrate content activation to seamlessly align with business objectives, marketing campaigns, seasonal events, or compliance deadlines. This scheduling capability transforms content management from reactive to proactive, enabling teams to work ahead of deadlines while ensuring content appears exactly when needed—whether that's a product launch at midnight, a promotional campaign during peak hours, or regulatory content that must be active within specific timeframes. ## Publishing options When saving a record from draft state, users have flexible publishing options to control exactly when content goes live: - Publish Immediately - The record transitions directly to published state and becomes available via API instantly. This option is ideal for urgent content updates, critical fixes, or when you need immediate content availability without delay. - Schedule for Future Publication - Set a specific date and time for automatic publication. The record enters the scheduled state and will automatically transition to published at the designated moment. Perfect for coordinating product launches, marketing campaigns, or time-sensitive announcements across multiple channels. - Time Window Publishing (Optional) - Define both a start date/time and an end date/time to create a limited-availability content window. The record will automatically transition from Scheduled → Published at the start time, then automatically move from Published → Unpublished when the window expires. This ensures content is only live during the specified period, making it ideal for limited-time offers, seasonal content, event-specific information, or compliance-sensitive materials that must be removed after a certain date. - Automatic State Management All scheduled transitions happen automatically without manual intervention, ensuring your content lifecycle operates precisely according to your business requirements and timing constraints. ## Versioning and editorial workflow Record scheduling integrates with Brickworks' versioning system to provide a smooth editorial experience that never disrupts live content. When modifying a currently Published record: - A new draft version is automatically created, preserving your live content. - The current published version remains active and accessible via API until you decide to replace it. - Upon completing your edits, you have full control over the transition: -Replace immediately - Override the live version instantly with your changes. - Schedule replacement - Set a future date/time for the new version to go live automatically. - Continue refining - Keep working on the draft without affecting the published content. - Every published version is preserved in a comprehensive log that captures the complete content history—including version, timestamps, user actions, and change details. More about versioning can be found in [Record Versioning](#record-versioning). ## Real-life use cases for scheduling - Retail Operations: Launch flash sales, seasonal promotions, or price changes at precise times (like midnight Black Friday deals) without requiring overnight staff or manual intervention. - Marketing Campaigns: Schedule entire campaign content weeks in advance and automatically retire promotional materials when campaigns expire, ensuring consistent messaging across all touchpoints. - Legal & Compliance: Deploy time-critical documents such as updated terms of service, privacy policies, or regulatory disclosures to become effective exactly when legally required. - Product Development: Coordinate content releases with feature launches, app updates, or system deployments by preparing changes well in advance and scheduling them to align perfectly with technical rollouts. ### Strategic business value Record scheduling transforms content operations by delivering: - **Operational excellence** – Eliminate manual publishing processes and reduce coordination overhead between teams, allowing content operations to run smoothly without constant supervision. - **Risk reduction** – Prevent costly mistakes from premature content releases or missed deadlines for time-sensitive materials, ensuring content accuracy and compliance. - **Strategic coordination** – Enable cross-departmental alignment and multi-channel content synchronization without requiring engineering resources or technical intervention for routine content operations. # Snippets A snippet in Synerise is a reusable piece of code that can be added to any content created in Synerise, such as in-app messages, landing pages, the request body of Outgoing Integrations, documents, and more.
Product Update - Snippets, reusable content elements
A snippet can represent a content fragment that is frequently used, like a sentence, an email footer, but can also be used to create an entire message template. It can be added in two ways: - As a **dynamic reference** to the snippet definition. In this case, the content is updated whenever the definition changes. This approach lets you propagate changes into multiple templates, documents, and so on without editing all of them separately. A simple example is storing your company address in a snippet and creating a reference to that snippet when you want to show the address in a template. If the address changes, you only need to edit the snippet and the change will apply to all the templates with a reference to it. - As a static fragment of content pasted into the code editor. You can [create your own snippets](#creating-custom-snippets) and use a library of pre-defined snippets. To add a snippet to the content you're creating, use the [snippet widget](#using-snippet-widget). ## Using snippet widget The snippet widget lets you access the collection of predefined and custom snippets available across the Synerise platform, providing quick access to a variety of useful code sections. You can find the snippet widget in features which lets you create any type of content: message templates, landing page, documents, message subject, body requests in Automation Hub. Snippet widget lets you perform the following actions: - Add a snippet to your content - Create a new snippet - Manage snippets - Preview snippet contents 1. To open a snippet widget, press **⌘**/**CTRL** + **/** or go to Data Modeling Hub icon **Data Modeling Hub > Snippets > Snippet widget**. **Result**: At the bottom of the page, the snippet manager appears.
Snippet manager
Snippet manager
3. To change the view mode of the snippet widget: - In wide mode, click Settings icon to change to compact mode. - In compact mode, click Settings icon to change to wide mode. 2. From the list, you can: - **Add a snippet** - By selecting this option, you will be redirected to the [snippet editor](#creating-custom-snippets). - **Manage snippets** - By selecting this option, you will be redirected to the list of snippets. - Select a predefined or custom snippet [to add to the content](#inserting-snippets) you're editing. - Open **Snippet playground** - By selecting this option, a [snippet playground](#snippet-playground) opens, you can create a draft snippet which the Playground holds until you save it as a snippet. This draft follows you across different Synerise platform modules, offering convenient, persistent content while you work throughout the platform. ### Inserting snippets If you want to add a snippet to the content you're editing: 1. In the code editor view, open the snippet widget by clicking **Snippets**. 1. Select a category of snippets:
You can use the search field at the top of the widget to search for snippets by name.
- Custom snippets To access your custom snippets, scroll to the end of the list. - Predefined snippets defined by Synerise: - Profile data: add profile attributes, recommendations, promotions, aggregate results, and expression results. - Decision Hub: insert the results of metrics. - Data Modeling: add values of vouchers, catalog items, or files. - Other: add [Jinjava inserts](/developers/inserts) and links. New predefined snippets are added to the platform periodically. 2. After opening a category, select a snippet from one of the types: - **Configurable** snippets require selecting some additional options. For example, a configurable recommendation insert allows you to modify the filters. - **Ready to use snippets** let you refer to a Synerise object without any additional configuration. For example, in the "Expressions" category, the "Ready to use" list is a list all expressions in your workspace. Selecting this snippet will let you show the result of the expression in the content. **Result**: The snippet details open.
Details of a ready-to-use snippet
Details of a ready-tu-use snippet
3. If you selected a configurable snippet, follow the instructions in the snippet details to configure it. 4. Select how you want to use the snippet:
Copying snippets options
Options of using the snippet
- To paste the contents of the snippet into the editor, click **Use snippet**. This content won't change when the snippet definition changes. - To copy the content of the snippet into the clipboard, click **Copy code**. This content won't change when the snippet definition changes. - To create a dynamic reference to the snippet definition, click the arrow to the right of **Copy code** and click **Copy snippet reference**. This copies the snippet reference to your clipboard. You need to paste it into the editor. A snippet reference creates a piece of content that will be updated whenever you update the definition of the snippet. In the editor, it looks like this: ``` {% snippet %} SNIPPET_ID {% endsnippet %} ``` This is useful for content that changes often and is used in multiple communications. By using a reference, you only need to update the central definition and the change applies to all references. If the referenced snippet uses [variables for editing simplification](#snippet-editing-simplification), a reference always uses the default variable values and doesn't allow changing them. Snippet references are not available for some snippet types. For example, ready-to-use expression references - because the snippet is only a reference to an expression, changing the expression propagates to all content which refers to it. ## Creating custom snippets --- You can create custom snippets using the snippet editor. This editor lets you write the snippet code in which you can, for example, reference Synerise objects or other snippets. Additionally, you can [create configuration forms to simplify their editing](#snippet-editing-simplification) for your co-workers. This enables you to configure the snippet when adding it to the template from the snippet widget. 1. Go to **Data Modeling Hub > Snippets > Create snippet**.
Snippet editor
Snippet editor
2. To select the language for syntax highlighting, click **HTML** and from the dropdown list, select: - **Text** - **JSON** - **HTML** - **CSS** - **Javascript** - **SQL** 3. In the **Code** section, enter the contents of the snippet. You can: - create code from scratch, - by using the **Snippets** option, you can add existing snippets and configure them with the [snippet widget](#using-snippet-widget). In the screen below, an expression snippet is being added to the snippet. In such case, from the **Select expression** dropdown list, you must select which expression result you want to retrieve. This option also lets you add your custom snippets as well.
Adding predefined snippet
Adding predefined snippet which retrieves result of an expression result
- [create a form for editing snippets](#snippet-editing-simplification), - [preview the final result from the perspective of a customer](#previewing-snippets). 4. After you complete a snippet, in the upper right corner, click **Save**. **Result**: A pop-up appears.  
Save snippet pop-up
Saving a snippet
1. In the **Snippet name**, enter a name of the snippet which will be visible on the snippet list. 2. In the **Description** field, write the purpose of a snippet to make it understandable for your co-workers. 3. From the **Folder** list: - select a category in which the snippet will be saved. - to create a new category, at the bottom of the list, click **Create**. 1. In the **Folder name** field, enter the name of the category. 2. Confirm by clicking **Apply**. 4. Click **Apply**. **Result**: The snippet is available in [snippet widget](#using-snippet-widget). ## Previewing snippets You can check the final form of a snippet from the perspective of any customer you have in your database. 1. In the code editor, on the left, click **Preview contexts**. **Result**: A pop-up opens. 2. From the **Customer Context** dropdown list: - select the customer from the list - use the searchbox to find a customer by typing their email address or ID **Result**: A preview modifies to the context of a selected customer. ## Snippet editing simplification To make it easier for non-coders to customize a snippet, you can create a form with specific options just for the snippet. This way, users can define the settings of the snippets (such as selecting recommendations to be displayed) by filling out the form displayed in the widget before using it in the content. When you simplify the editing process for the template, you can tweak its style by using a simple form with different fields for each part of the template. This form can be found in the Config section. Simplifying the template involves swapping out values in the code (like HTML, CSS, and JavaScript) with special placeholders called variables. For example, you can change alignment, fonts, colors, or HTML elements like titles, descriptions, or buttons. You can also insert variables in place of Jinjava elements, such as campaign IDs, voucher pool IDs, or catalog names. These variables will be visible in the form within the Config tab when you are editing the template.
When a snippet with variables added as described below is inserted as a reference, all fields in the output use the default value. The value can't be changed. See [example](#example).
### Example This is how simplified snippets work in practice: 1. A snippet with two variables is created: Variables in the snippet editor 2. A user opens the snippet in the widget when creating something in a code editor (for example, an email template): The snippet opened in the widget 3. In the configuration form, the user changes the values from default to their own: The snippet after a user changes the values 4. The result depends on how the user adds the snippet to the content they're creating: - If the user clicks **Use snippet**/**Copy code**, the contents of the snippets are added to the editor/copied to the clipboard with the variable values entered in the configuration form: The snippet added into the code editor with the user's values - If the user clicks **Copy snippet reference**, a reference to the snippet is copied to the clipboard. When the content is generated, the default values are always used, regardless of what the user entered in the configuration form: The snippet reference and a preview of its results (left pane) ### List of variables | Variable name | Description | Example output | |------------------------|------------------------------------------------------------------------------------------------------------------------------------------|----------------| | **Synerise insert select** | Allows you to add a dropdown list with aggregates, expressions, metrics, voucher pools, recommendations, files, catalogs, or attributes. |
A field in the Config tab requiring a selection of a Synerise object
Example: selecting a Synerise object from the list
| | **String** | Allows you to add a field that requires a string value. |
A field in the Config tab requiring a string value
Example: Filling out a field
| | **Select** | Allows you to add a dropdown list with configurable values. |
A field in the Config tab requiring a selection from a dropdown
Example: selecting an option from a dropdown list
| | **Switch** | Allows you to add a field which is enabled/disabled by a toggle. |
A field in the Config tab requiring a selection of a Synerise object
Example: enabling an option
| | **Color** | Allows you to add a color selector. You can either select a color or enter its code manually. |
A field in the Config tab requiring a selection of a color
Example: selecting a color
| | **Number** | Allows you to add a field that requires a number. You can either select a number from a dropdown or enter it manually. |
A field in the Config tab requiring a number value
Example: defining a number
| ### Creating a simplified snippet 1. To create a user-friendly configuration form of the snippet, in the **Code** tab, on the right side of the screen, click **Add variable**. **Result**: A sidebar appears.
Adding a variable
Adding a variable
4. In the **Identifier** field, enter the ID of the variable. This will be the title of the field unless you define the **Label** field. The first character of the ID can't be a number. 5. From the **Type** dropdown list, select the type of variable. Description of available variables is in [List of variables](#list-of-variables).
Allows you to add a field that requires a string value. 1. In the **Label (Optional)** field, enter the name of the field. If this field is empty, the name of the field will be taken from the **Identifier** field. 2. In the **Description (Optional)** field, enter a short explanation of the field's purpose. 3. In the **Default Value** field, enter the default value. This value is also used when the snippet is used a reference. In that case, the value can't be changed.
Allows you to add a dropdown list with configurable values. 1. In the **Label (Optional)** field, enter the name of the field. If this field is empty, the name of the field will be taken from the **Identifier** field. 2. In the **Description (Optional)** field, enter a short explanation what this field is for. 3. In the **Display Name** field, enter the name that will be visible in a dropdown. 4. In the **Value** field, enter a value. 5. In the **Default Value** field, enter the default value. This value is also used when the snippet is used a reference. In that case, the value can't be changed.
A select variable
A select variable during configuration
Allows you to add a dropdown list with aggregates, expressions, metrics, voucher pools, recommendations, files, catalogs, and attributes. 1. In the **Label (Optional)** field, enter the name of the field. If this field is empty, the name of the field will be taken from the **Identifier** field. 2. In the **Description (Optional)** field, enter a short explanation what this field is for. 3. From the **Insert Type** dropdown list, select the type of resource: - **Aggregates, AI recommendations, Expressions, Metrics, Voucher pools**: creates a dropdown list of available resources of the selected type. When the user selects a resource in the form, its ID is inserted into the code of the template. This ID can be used in [Jinjava](/developers/inserts/insert-usage) to display the value of the selected resource. - **Catalogs**: creates a dropdown list of catalogs. When the user selects a catalog in the form, its name is inserted into the code of the template. This name can be used in [Jinjava](/developers/inserts/insert-usage#catalogs) to retrieve a value from the catalog. - **Files**: creates a dropdown list of [files](/docs/assets/files-explorer). When user selects a file, its URL is inserted into the code. - **Profile attributes**: creates a dropdown list of profile attributes. When a user selects an attribute, its name is inserted into the code of the template. This name can be used in [Jinjava](/developers/inserts/insert-usage#customer-attributes) to retrieve the attribute value. 3. In the **Default Value (Optional)** field, enter the default value. This value is also used when the snippet is used a reference. In that case, the value can't be changed. **Result**: A dropdown with the insert is added to the form in the **Config** tab. From the dropdown list, you can select an item of the chosen type (for example, aggregates). As a result, the value of variable will be ID of the selected item.
Synerise insert select in the configuration form
Synerise insert select in the configuration form
Allows you to add a field which is enabled/disabled by a toggle. 1. In the **Label (Optional)** field, enter the name of the field. If this field is empty, the name of the field will be taken from the **Identifier** field. 2. In the **Description (Optional)** field, enter a short explanation what this field is for. 3. In the **Default Value** field, select the default value (true/false). This value is also used when the snippet is used a reference. In that case, the value can't be changed.
Allows you to add a color selector. You can either select a color or enter its code manually. 1. In the **Label (Optional)** field, enter the name of the field. If this field is empty, the name of the field will be taken from the **Identifier** field. 2. In the **Description (Optional)** field, enter a short explanation what this field is for. 3. In the **Default Value** field, enter the default value. This value is also used when the snippet is used a reference. In that case, the value can't be changed.
Allows you to add a field that requires a number. You can either select a number from a dropdown or enter it manually. 1. In the **Label (Optional)** field, enter the name of the field. If this field is empty, the name of the field will be taken from the **Identifier** field. 2. In the **Description (Optional)** field, enter a short explanation what this field is for. 3. In the **Default Value** field, enter the default value. This value is also used when the snippet is used a reference. In that case, the value can't be changed.
6. If you want to add the variable to a group that can be more easily displayed together in the form: 1. Click **Variable Group**. 2. Select or create a group: - To select a group, click its name. - To create a group: 1. Click **Add new group**. 2. Enter a group name. 3. Enter a group ID. 4. Click **Apply**. **Result**: On the **Config** tab, the groups can be collapsed and expanded. 5. In the upper right corner, click **Add**. **Result**: In the template code, a variable appears (it starts with `####`). It also becomes available on the **Config** tab. 6. Optionally, to modify the order of variables appearing in the configuration form, add the `order` parameter to the variable formula (for example, `#### type: "string", id: "string", label: "Text", order: 1 !####`). ## Snippet playground ---
Product Update - Snippet Playground
The Snippet Playground lets you create and preview snippets directly within the snippet widget, without navigating to Snippets. You can draft any content, preview it for selected users, and save it as a snippet—all with full editor features. Acting as a scratchpad, the Playground holds your draft content until you intentionally clear it. This draft follows you across different Synerise platform hubs, offering convenient, persistent content while you work throughout the platform. You can close the snippet playground, and the draft is restored when you re-open it. It's saved in the local storage of your browser. Predefined snippets can be opened and automatically loaded into the Playground for editing. We’ve also added an edit mode for custom snippets, allowing in-widget snippet modifications. The Playground works only in wide mode; if you're in compact mode, a button will switch the interface to wide mode to open it for easy editing and previewing. ### Accessing snippet playground 1. Press **⌘**/**CTRL** + **/** or go to Data Modeling Hub icon **Data Modeling Hub > Snippets > Snippet widget**. 2. On the left pane, click **Snippet playground**. **Result**:
Blank snippet playground
Blank snippet playground
### Inserting predefined and custom snippets into playground 1. On the left pane, select a predefined snippet or your custom snippet.
A predefined snippet for extracting expression output is selected
A predefined snippet for extracting expression output is selected
4. If you selected a custom snippet and want to edit it before adding it to the playground, click **Edit** (to edit in the same window) or click the downward arrow icon and then **Code editor** (to edit in a new window). Saving such a snippet **affects content where this snippet is dynamically added** with the `{% snippet %}` insert. 3. At the bottom of the widget, click **Insert into playground**. **Result**: The snippet is inserted at the end of the current playground content. ### Previewing snippet results 1. After adding a snippet to the playground, on the middle pane, click **Preview contexts**. 3. From the dropdown list, select the profile for whom you want to see the snippet preview. **Result**:
Preview of a snippet that contains a reference to an expression
Preview of a snippet that contains a reference to an expression
# Importing data to catalogs By importing data to a catalog, you can: - create an item feed in Synerise, - [create a metadata catalog](/docs/ai-hub/item-feed/metadata-catalog) in Synerise - [create a catalog with unique phone numbers](/use-cases/double-phone-number), - and much more.
Importing data to the catalog is an asynchronous process, which means your data is added to a queue and will become available after processing.
### Import modes When importing data into your catalog, you can choose how to handle existing and new records. You can use the following options: 1. **Create or overwrite records** **How it works:** - If an item does not exist in the catalog, it will be created as a new record. - If the item already exists, the entire record will be fully updated, replacing all existing parameters with the new data. **When to use it**: You want to discard some or all items in the catalog and replace them with their new versions, without keeping any of their old data. **Example:** | Before import | Imported data | Results after import | |----------------------------------------|---------------------------------|---------------------------------------------------| | Item A:
{ "Name": "Widget", "Price": 10, "Color": "Red" }
| Item A:
{ "Name": "Widget", "Price": 12 }
| Item A:
{ "Name": "Widget", "Price": 12 }
(Color removed) | | Item B does not exist | Item B:
{ "Name": "Gadget", "Price": 25 }
| Item B:
{ "Name": "Gadget", "Price": 25 }
| 2. **Create or partial update** **How it works:** - If an item does not exist, it will be created as a new record. - If the item already exists, only the parameters included in the import will be updated or added; existing parameters not mentioned remain unchanged. **When to use it:** You want to update specific parts of existing records without losing any other data, allowing incremental or additive changes. **Example**: | Before import | Imported data | Results after import | |----------------------------------------|---------------------------------|---------------------------------------------| | Item A:
{ "Name": "Widget", "Price": 10, "Color": "Red" }
| Item A:
{ "Price": 12 }
| Item A:
{ "Name": "Widget", "Price": 12, "Color": "Red" }
| | Item B does not exist | Item B:
{ "Name": "Gadget", "Price": 25 }
| Item B:
{ "Name": "Gadget", "Price": 25 }
| ### Summary | Option | Creates new records? | Updates existing records? | Update type | When to use | |----------------------------|---------------------|--------------------------|-------------------|----------------------------------| | Create or overwrite records | Yes | Yes | Full replacement | Completely refresh existing data | | Create or partial update | Yes | Yes | Partial / additive| Incrementally update or add parameters | ## Requirements --- - You need user permissions that grants you access to Simple Imports and/or Automation. - [Create a catalog](/docs/assets/catalogs/creating-catalogs). - Prepare a file with data: - To import a single file one time, prepare a `.csv` file. - To schedule import in Automation Hub, prepare a file in one of the following formats: `csv`, `.json`, `.jsonl`, or `.xml` ### Tips for preparing a CSV file - Recommended file metacharacters: - The character that separates columns (delimiter): `,` - The character that is used to contain text (quotation mark): `"` - The character (escape character) that changes the default interpretation of a character or string which follows escape character: `\` - Spaces and special characters in the column headers are not allowed. - `.csv` files must be UTF-8 encoded - The file cannot contain empty fields. If you want to leave empty fields, enter the `null` value. - Maximum file size: 200 MB. ## Procedure --- ### Selecting the file for import In this part of the process, you will upload a file from your device. 1. Go to Data Modeling Hub icon **Data Modeling Hub > Imports > New import**. 2. As the data type for import, select **Catalog's records**. 3. As the import method, select one of the following options: - Import a local file - To import a single `.csv` file to Synerise. - Import in Automation - To import a .`csv`, `.json`, `.jsonl`, and `.xml` files and execute periodical imports.
1. Upload the `.csv` file by using the **+ Upload file or drop one here** field. 2. Optionally, you can customize the file metacharacters by clicking the arrow down icon. 1. From the **Delimiter** dropdown, select the character that marks the end of a column. 2. From the **Quotation mark** dropdown list, select the characters that contain the text or data type. 3. From the **Escape character** dropdown lists, select the character which changes the default interpretation of a character or a string followed by the escape character. 3. To proceed to the next step, click the **Next** button. ### Selecting catalog In this part of the process, you will select the catalog to which the data will be imported, provide the name of the column which contains the unique identifiers of the items, and select the [import mode](#import-modes). If you opened the import creator from the view of a catalog, (**Data Modeling Hub > Catalogs**), that catalog will be selected automatically.
Selection of the catalog
Selection of the catalog
1. From the **Select catalog** dropdown list, select the catalog to which the data from the file will be imported. 2. In **Primary key**, enter the name of the column which contains the unique identifiers of the items. This field accepts [snippets](/docs/assets/snippets) and [inserts](/developers/inserts). 3. In the **Import modes** section, select how data will be updated in the catalog: - **Create or overwrite records** - if an item from the file exists in the catalog, the entire record in the catalog is overwritten with data from the file; - **Create or partial update** - if an item from the file exists in the catalog, the record is modified - new parameters are added, matching parameters are updated. If a parameter doesn't exist in the file, it's not modified in the catalog. You can learn more about import modes in [Import modes section](#import-modes). 4. Click **Next**. ### Launching import After selecting the column that contains a primary key you can launch the import by clicking **Run import**.
1. Select the method of delivering the file: - [Local File](/docs/automation/operation/local-file-node) - Uploads a file from your device. - [SFTP](/docs/automation/integration/sftp-integrations) - Uploads a file from a server using the SFTP protocol. - [HTTPS](/docs/automation/integration/http-integrations) - Uploads a file from a server using the HTTPS protocol. - [Amazon S3](/docs/automation/integration/amazon-s3-bucket/get-file-amazon-s3-bucket) - Uploads a file from Amazon S3 bucket. - [Azure](/docs/automation/integration/azure-blob-storage/get-file-azure-blob-storage) - Uploads a file from Azure Blob Storage. - [Google Cloud Storage](/docs/automation/integration/google-cloud-storage/get-file-from-gcs) - Uploads a file from Google Cloud Storage. 2. Click **Go to import template**. 3. Define the settings of the [Scheduled Run node](/docs/automation/triggers/scheduled-run). 4. Depending on the method of delivering the file, configure the settings of [Local File](/docs/automation/integration/http-integrations/http-get-file) or the Get File node available within the integrations listed in step 1. 5. If the data requires modification, configure the settings of the [Data Transformation node](/docs/automation/operation/data-transformation-node). If you have prepared the transformation rules for the data structure of the imported file, select it from the dropdown list. If not, create it from scratch. You can remove this node if your data doesn't require transformation. 6. Configure the settings of the **Import to catalog** node according to the instructions in the ["Node configuration" section](/docs/automation/actions/synerise-integrations/import-to-catalog#node-configuration). 7. If your workflow is ready, click **Save & Run**.
# Exporting data from catalogs You can export catalog records in the following ways: - Export to a downloadable CSV, JSON or JSON lines file This method allows you to export catalog records to a file you can download and use as you wish. There are two options here: - by [simple export](#simple-export) Ideal for one-off, quick file extraction when you need the data just once. - in the Automation Hub Allows for cyclical, automated uploads of catalog record files. Best if you need the process to run regularly without manual intervention. - [Export to external services](#export-through-the-automation-hub) - You can export catalog records directly to external services that Synerise supports natively (for example, Amazon S3, Google Cloud Storage) using the Send File action nodes or to any endpoint using ["Outgoing Integration" node](/docs/automation/actions/webhook-node). **Benefits**: - You get a draft [workflow](/docs/automation/creating-automation) which you adjust to your needs. - This method lets you modify the file with catalog records by using the [Data Transformation node](/docs/automation/operation/data-transformation-node) in the workflow. ## General prerequisites --- You must have the [permissions to export data](/docs/settings/identity-access-management/permissions/data-management-permissions#export-records-from-catalogs). ## Simple export --- This method lets you perform a single export to a downloadable file. 1. Go to Data Modeling Hub icon **Data Modeling > Catalogs**. 2. Select a catalog. 3. On the top bar, click **Export**. **Result**: A pop-up shows. 4. Select **Export single file**. 5. Click **Next**. 6. In the **Name** field, enter the name of the export. This will allow you to easily identify your export in the list of scheduled data export jobs. 7. Optionally, in the **File expiration** field, define how long the exported file will be available for download. - The minimum value is 30 minutes. - If you leave this field empty, a default expiration period of 7 days will apply. 8. Click **Next**. 9. Confirm by clicking **Run export**. ### Where to find the file? 9. To download the exported file, go to Data Modeling Hub icon **Data Modeling > Exports**. 10. On the left panel, select **Catalogs**. 11. Find the file on the list. 12. Click Three dot icon 13. Select **Download CSV, **Download JSON** or **Download JSON lines**. ## Export through the Automation Hub --- This export method lets you: - export a downloadable file - export a file to external services - Synerise offers easy integration with some services by the Send File node, for example, ["Send File" node](/docs/automation/integration/google-cloud-storage/send-file-to-gcp) to Google Cloud Platform. - If you can't find the service to which you want to export the file, use ["Outgoing Integration" node](/docs/automation/actions/webhook-node). ### Prerequisites for this method --- - Verify if you need to modify the file with records before the export. If so, prepare a [data transformation rule](/docs/automation/data-transformation-and-imports/creating-data-transformation) which you will later select in the [settings of the workflow](#configure-and-launch-workflow). - [Create a connection](/docs/settings/tool/connections#creating-connections) with the service to which you want to export the file with catalog records. If you can't find the service to which you want to export the file, you can use ["Outgoing Integration" node](/docs/automation/actions/webhook-node) in the workflow and you can create the connection directly in the node configuration. ### Configure and launch workflow --- 1. Go to Data Modeling Hub icon **Data Modeling > Catalogs**. 2. Select a catalog. 3. On the top bar, click **Export**. **Result**: A pop-up shows. 4. Select **Export in Automation**. **Result**: The **Where do you want to export file?** dropdown shows. 5. From the **Where do you want to export file?** dropdown select: - if you want to export a downloadable file, select **Save file**. - if you want to export to external services, from the dropdown list, select one of the services. - if no option fits your business case, select any option: you will modify the draft workflow to your needs in further steps. **Result**: You are redirected to a draft workflow.
If you were not redirected to the workflow, disable your browser’s pop-up blocker.
6. If you want to schedule the frequency and date and time when the workflow will trigger, edit the configuration of the ["Scheduled Run" node](/docs/automation/triggers/scheduled-run). 7. In the **Get Catalog Data** node, leave the settings at default (the catalog is already selected).
You can read the node documentation in ["Get Catalog Data" node](/docs/automation/actions/synerise-integrations/export-data-from-catalog).
8. In the **Data Transformation** node, select the transformation rule according to which the file with the records will be modified before export. If you don't need the node, you can remove it. 9. Configure the node with the export: - If you selected **Save File**, go to the node settings and enter the name of the file to which catalog records will be exported. - If you selected an external service, go to the node settings: 1. Select a connection. 2. Fill out the configuration form. To get instructions to filling out the configuration form, [find the service on the list](/docs/automation/integration) and proceed to the node instructions.
If the list doesn't include the service to which you want to export, you can replace the node with the ["Outgoing Integration" node](/docs/automation/actions/webhook-node) - you can set up the connection and the endpoint to which you will make a request in the node directly.
10. In the upper-right corner, click **Save & Run**. **Result**: The workflow will be active and the actions in the workflow will be triggered as defined in the **Scheduled Run** node. The logs of operations in the workflow are available: - for the data transformation: enter the configuration of the workflow (Automation Hub icon **Automation Hub > Workflows**), select the **Transformation logs** tab. - for the export, go to **Data Modeling > Exports**, on the left pane, select **Automation**. # Creating an external source Instead of copying and updating data from various places, external sources let you get up-to-date information directly from external systems—like ERP, CRM, inventory, pricing, e-commerce platforms, other CMSs, or any REST API—and pull live data in real time when content is generated. By creating an external source, you establish a connection with an external service by providing key details such as the endpoint URL, HTTP method (GET or POST), authentication method (API key, login/password, or SHA256-based), and other settings. During content generation—when an object with a record is generated or a record is previewed for the context of a specific profile in the editor—Synerise sends a request to the configured endpoint. In the configuration of the external source, you can also use Jinjava (for example, in the endpoint URL or request body) to dynamically pass profile information in the request. At the end of the external source configuration, a preview cURL command is provided, which you can copy and test in your terminal or API testing tool. This integration lets external data appear seamlessly as part of your content, just like data stored directly inside Brickworks. External sources eliminate multi-system integration complexity while ensuring your content remains accurate, complete, and contextually relevant—making it a live reflection of your entire business ecosystem. ## Benefits - Content always reflects the latest state of your business systems. Inventory counts, pricing, customer data, and metrics are fetched live when content is requested. - Your applications make one API call to Brickworks and receive complete, enriched content that combines your managed content with live external data. - No ETL jobs to monitor, no data synchronization to manage, no stale data concerns. External systems remain the single source of truth. - External sources can use context parameters and other record's simple fields to fetch precisely the right data for each request, enabling dynamic, personalized content experiences. ## Example use cases You can use external sources in the following cases: - E-commerce operations - You can combine static product information from a record with live data such as current inventory levels, pricing updates, customer ratings, and shipping costs pulled directly from your backend or e-commerce platform. You also add personalized product suggestions based on what each customer has recently viewed. This way, the product details you show are always accurate and tailored for each shopper in real time. - Customer experience platforms - You can merge personalized data created inside Synerise — like recent product views or preferences—with up-to-date information about the customer’s account or status pulled from your external CRM or other backend systems. For example, you could show each customer their current membership level or available offers alongside personalized clothing recommendations, all combined into one seamless experience. - Legacy CMS modernization - If you’re still using an older CMS for your website content, you can fetch static content (like text and images) from your legacy CMS, then enrich it by adding AI-driven Synerise product recommendations, personalized promotions, and personalized messages without needing to move your content elsewhere. ## Procedure 1. Go to Data Modeling Hub icon **Data Modeling Hub > External sources > New external source**. **Result**:
Selecting the external source type
Selecting the external source type
1. Select the method of authorization to the external source to which you will make a request. - **Synerise API key** - This method is particularly recommended for the users who use Synerise REST API. It lets you select a connection that includes an [API key](/docs/settings/tool/api) with the required permissions. This way, the requests to Synerise API are executed by this integration and a JWT is not required as it is generated while sending requests and attached to the request headers.
Click here to see the instructions
  1. Click Select connection.
  2. If the connection you want to use is in the list, select it and fill in the configuration.
  • If the connection list is empty or you don't see a connection, you must:
    1. At the top of the dropdown list, click Add connection.
    2. In the Connection name field, enter the name of your connection (it's visible only in Synerise).
    3. From the API key dropdown, select the API key.
    4. Click Create.
      The connection you created can be used later in Workflows and Brickworks external sources.
- **API Key** - This method lets you authenticate using an API secret by including it in a header of your choice or in a URL parameter — example outputs: - the authorization header: `Authorization: Bearer [secret]` - URL parameter: `client_id=[rendered secret]`. When you use this connection, the token will be automatically added to either the request header or the request URL with every request.
Click here to see the instructions
  1. Click Select connection.
  2. If the connection you want to use is in the list, select it and proceed to selecting the HTTP method.
    • If the connection list is empty or you don't see a connection, you must:
      1. At the top of the dropdown list, click Add connection.
      2. In the Connection name field, enter the name of your connection (it's visible only in Synerise).
      3. In the Secret field, enter an API Key.
      4. If you:
        • specify the value in the Headers section, the API key will be added as a header to the request. For example, `x-api-key: {{secret}}` where `{{secret}}` retrieves the value of the Secret field to anonymize the API key value.
        • provide the value in the URL Parameters section, the API key will be appended to the request’s URL as a parameter.
      5. Click Create.
        The connection you created can be used later in Workflows and Brickworks external sources.
- **Login & Password** - This method lets you use basic authentication to authenticate with the remote server.
Click here to see the instructions
  1. Click Select connection.
  2. In the connection list:
    • If the connection you want to use is in the list, select it and proceed to selecting the HTTP method.
    • If the connection list is empty or you don't see a connection, you must:
      1. At the top of the dropdown list, click Add connection.
      2. In the Connection name field, enter the name of your connection (it's visible only in Synerise).
      3. In the Login field, enter a login.
      4. In the Password field, enter the password.
      5. Click Create.
        The connection you created can be used later in Workflows and Brickworks external sources.
- **SHA256-based authentication** - *This method is recommended exclusively for connecting with Eagle Eye*. This method lets you authenticate using the SHA256 algorithm. When a target request is sent, the following headers are added to the request: - **X-EES-AUTH-CLIENT-ID** – the value is taken from the Client ID field. - **X-EES-AUTH-HASH** – the value is generated by concatenating the endpoint URI, request body, and client secret, and then hashing the result using SHA256.
Click here to see the instructions
  1. Click Select connection.
  2. In the connection list:
    • If the connection you want to use is in the list, select it and proceed to selecting the HTTP method.
    • If the connection list is empty or you don't see a connection, you must:
      1. In the Connection name field, enter the name of the connection.
        It's used to find the connection on the list.
      2. In Client ID, enter a unique identifier assigned to your application by the service provider.
      3. In Client secret, enter the client secret assigned to your application by the service provider.
      4. Confirm by clicking Create.
        The connection you created can be used later in Workflows and Brickworks external sources.
3. From the **Method** dropdown list, select the request method to specify how the request will be sent. 4. In **URL**, provide the endpoint address to which the request will be made. You can include query parameters directly in the URL, for example: `https://example.com/products?productId={{profile.id}}&lang={{profile.language}}`. Values of query parameters can use Jinjava, which allows you to dynamically pass profile data or record field values in the request. If the same parameter is defined both in the URL query string and in the Additional parameters section, the value from Additional parameters overrides the value from the URL. Because of this, parameters defined in the URL do not need to be repeated in Additional parameters unless you want to overwrite them. 5. In **TTL**, specify how long the cached response from the external request will be valid. After changing data, the old value can be visible through brickworks for a maximum time defined here. You can set maximum 1800s value. We recommend setting short TTL for fast-changing data and longer for stable information. 6. In the **Headers** section, by clicking **Add header**, you can define the request headers such as `content-type: application/json` in the key-value form: in the left field (**key**) provide a header name, in the right field, provide a value. These headers will be used in all schemas where you use this data source. 7. If you selected the **POST** method, you must provide the request body in the **Body** section.
The content of the request body may be returned during [object generation](/docs/assets/brickworks/generating-objects) when the [**Return error details when the source responds with an error** option](/docs/assets/brickworks/schema-field-types#object-generation-example-error-handling) is enabled in a schema. In such cases, you can remove sensitive data carried over from the request body by using [Response transformers](/docs/assets/brickworks/response-transformers).
- Optionally, by clicking Snippet icon, you can use a [snippet](/docs/assets/snippets) which will let you add dynamic values to the request body. - If you used snippets, enable processing of the Jinjava template by selecting the fields in a request that contain them in the **Treat the body selected parameters as Jinjava** section. - You can use the following options: - From the **Cast to** dropdown list, select the data type to cast the Jinjava result to - Use the **Strict** toggle to define what happens when casting is not successful: - when the option is disabled, sets Jinjava to a null value, - when the option is enabled, returns an error in generating an object from a record The indicated parameter will be rendered as Jinjava by the backend and you can define the value type returned.
Example body with dynamic values
Example body with dynamic values
8. In the **Additional parameters** section, by clicking **Add parameter**, you can add custom parameters to the events generated by the response from the external source. In the left field (**key**) provide a parameter name; in the right field, provide its value. - You can use this, for example, to create a common parameter for events from a particular external source. - The parameters will be added to [`brickworks.generated`](/docs/assets/events/event-reference/brickworks#brickworksgenerated) and/or [`brickworks.generated.error`](/docs/assets/events/event-reference/brickworks#brickworksgeneratederror) events. ## Testing the external source In the **Preview cURL** section, you can view the cURL request that will be sent to the endpoint when invoking the object with the record result or previewing a record that references an external source. You can copy this cURL command and run it in your terminal or use it with any API testing tool to see how the request works. ## Using external sources in a record See the [External Data section](/docs/assets/brickworks/schema-field-types#external-data). # Generating objects Record generation is the process that changes your fixed content templates into personalized, dynamic content. When you use the API or JinJava tags, it fills in all dynamic parts, gets data from other sources, and uses Synerise's objects to create content that fits the situation. While generating, dynamic fields can [use other basic fields (like text, numbers, true/false, or choices) from the same record](/docs/assets/brickworks/brickworks-jinjava-inserts#retrieving-values-from-fields), plus extra information you give in the request. If the generation is for a certain user profile, Brickworks will automatically save this as an [action](#events-generated) done by that user.
When an object is generated, profile data and external source responses are [cached](/docs/assets/brickworks/limits) and used in subsequent requests.
To learn how to modify the generated content with JavaScript before it's returned, see [Response transformers](/docs/assets/brickworks/response-transformers).
## Events generated Brickworks automatically generate events whenever records are generated in the context of a customer profile. This creates a comprehensive audit trail and feeds valuable data back into the Synerise platform for analytics, personalization optimization, and customer journey tracking. The following events are generated: - [brickworks.generated](/docs/assets/events/event-reference/brickworks#brickworksgenerated) - [brickworks.generated.error](/docs/assets/events/event-reference/brickworks#brickworksgeneratederror) ## Distribution channels You can distribute objects with record results in the following channels: - Website (inject content into website source, web push notifications) - Mobile (SMS, push notifications, in-app messages, mobile applications) - Display advertising (digital signage) - Email marketing ## Context When generating a record, you can pass additional data to influence what it renders. Two optional parameters are available for this — `context` and `fieldContext`: - **`context`** — a global JSON object. Any [Jinjava field](/docs/assets/brickworks/schema-field-types#jinjava-code) in the record can read its values at generation time. - **`fieldContext`** — a per-field JSON object. Each key is the **API name** of a schema field (the identifier assigned to the field when the schema was created), and the parameters nested under it are passed exclusively to that field. Both support nested objects and work identically in the API and in Jinjava tags:
{
  "context": {
    "catalog": {
      "itemId": "78363"
    },
    "itemId": "1"
  },
  "fieldContext": {
    "recoField": {
      "itemId": "e579487933852f3a83abd9e840175c"
    }
  }
  }
{% set context = {"catalog": {"itemId": "78363"}, "itemId": "1"} %}
  {% set fieldContext = {"recoField": {"itemId": "e579487933852f3a83abd9e840175c"}} %}

  {% brickworksgeneratevar schemaId=SCHEMA_ID recordId=RECORD_SLUG context=context fieldContext=fieldContext %}
  {{ brickworks_result|tojson }}
  {% endbrickworksgeneratevar %}
Brickworks uses them to: - populate [dynamic fields](/docs/assets/brickworks/schema-field-types#dynamic-types) with relevant data - customize [Synerise object](/docs/assets/brickworks/synerise-objects) behavior - fetch [external data](/docs/assets/brickworks/schema-field-types#external-data) with context-specific parameters This means the same record can render differently depending on the context you provide. ### `context` `context` is a [global JSON object](/docs/assets/brickworks/brickworks-jinjava-inserts#retrieving-context) available to every [Jinjava field](/docs/assets/brickworks/schema-field-types#jinjava-code) in the record. Use it to pass: - product identifiers for catalog lookups - user session data for personalization from external systems - external system identifiers **Referencing `context` in a Jinjava field** In any Jinjava field expression, you can read `context` values using dot notation. Nested objects are supported: - `{{ context.itemId }}` — reads a top-level value - `{{ context.catalog.itemId }}` — reads a nested value For example, if you pass the following in the request:
{
  "context": {
    "catalog": { "itemId": "sku-123" }
  }
}
A Jinjava field with the expression `{{ context.catalog.itemId }}` renders `sku-123`. You can also define context [while previewing records](/docs/assets/brickworks/quick-start/creating-a-record#previewing-records). ### `fieldContext` `fieldContext` passes parameters directly to individual fields during generation. Each top-level key is the **API name** of a schema field, and everything nested under it is scoped exclusively to that field — not shared with any other field in the record. Use it to: - override [Synerise object](/docs/assets/brickworks/synerise-objects) configuration per request - provide field-specific external data parameters - control the processing behavior for specific fields The accepted parameters depend on the field type. Supported for: **[One-to-many relation](/docs/assets/brickworks/schema-field-types#one-to-many)** — `page` and `limit` for pagination:
{
  "fieldContext": {
    "oneToManyRelation": {
      "page": 2,
      "limit": 5
    }
  }
}
**[AI recommendation](/docs/assets/brickworks/synerise-objects#ai-recommendation)** — any parameter accepted by the [recommendations API](https://hub.synerise.com/api-reference/ai-recommendations#tag/Recommendations/operation/GetRecommendationsByCampaignV2):
{
  "fieldContext": {
    "similarProducts": {
      "itemId": "c8a42eb1-2582-403e-8497-976f28b479ee",
      "additionalFilter": "brand == TEST"
    }
  }
}
where `similarProducts` is the API name of the recommendation field. #### Using Jinjava expressions with `fieldContext` Recommendation fields allow you to configure each parameter — for example, `itemId` — as a [Jinjava field](/docs/assets/brickworks/schema-field-types#jinjava-code). This means the parameter's value is not hardcoded: instead, it is evaluated from a Jinjava expression at generation time. A common pattern is to read the value from `context`. For example, setting the `itemId` parameter to the expression `{{ context.catalog.itemId }}` means that when the record is generated, Brickworks evaluates the expression and uses the result as `itemId` for the recommendation. When you additionally pass `fieldContext` for that parameter, the following priority applies: - **`fieldContext` provided** — the value from `fieldContext` is used directly. The Jinjava expression is not evaluated. - **`fieldContext` not provided** — the Jinjava expression is evaluated against `context`. This gives you a flexible pattern: use `context` as the default data source via Jinjava expressions in the schema, and override specific recommendation parameters per request using `fieldContext`. **Example**: the `recoField` field has its `itemId` parameter configured as a Jinjava field with expression `{{ context.catalog.itemId }}`.
{
  "context": {
    "catalog": { "itemId": "sku" }
  },
  "fieldContext": {
    "recoField": {
      "itemId": "e579487933852f3a83abd9e840175c"
    }
  }
}
`itemId` resolves to `e579487933852f3a83abd9e840175c` — taken from `fieldContext`.
{
  "context": {
    "catalog": { "itemId": "sku" }
  },
  "fieldContext": {}
}
`itemId` resolves to `sku` — evaluated from `{{ context.catalog.itemId }}`.
## Methods of displaying records ### API **Authentication**: When generating content from a record, you can authenticate as a: - workspace or Synerise user: in this case, you need to declare a profile for context. - profile: in this case, the profile is the context. **Example**: In the following example, content is generated for the following record:
Example record with a Jinjava code field
Example record with a Jinjava code field
To generate content, make the following request:
curl --location 'https://api.synerise.com/brickworks/v1/schemas/docsSchema/records/docsRecord/generate' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer eyJhbGciINVALIDDUm_1Vivk' \
  --data '{
    "context": {
        "dayOfWeek": "Monday"
    }
  }'
where: - `docsSchema` is the API name of the schema. - `docsRecord` is the slug of the record. In singleton schemas, use the API name (`appName`) or UUID of the schema in place of the record identifier. - `Bearer ...` is a profile JWT. This identifies the profile whose data is used for the `{% customer firstname %}` insert. It would also provide data for other elements with a profile context (for example, a recommendation), if the record included them. - `context.dayOfWeek` provides the value for the `{{ context.dayOfWeek }}` insert in the record. For more details on the request parameters, see the [API reference](https://hub.synerise.com/api-reference/brickworks#tag/Brickworks:-Content-generation). The response is:
{
    "__slug": "docsRecord",
    "__recordVersion": 1,
    "__publishedAt": "2025-12-11T16:58:55.101836Z",
    "__updatedAt": "2025-12-11T16:58:55.092stipZ",
    "__createdAt": "2025-12-05T12:49:04.870298Z",
    "exampleJinjava": "Hello Tom!\nIt's Monday.",
    "__schemaId": "c8e842bc-1580-4272-a98d-f3dc79542bb1",
    "__id": "e7635a46-d460-43b5-a878-6a2f9dd16295",
    "__schemaVersion": 1
}
where `exampleJinjava` is the API name of the field in the record, and the value is the processed content. The parameters which start with `__` are the metadata of the record. Their descriptions are available in the [API reference](https://hub.synerise.com/api-reference/brickworks#tag/Brickworks:-Content-generation). ### Mobile SDK You can use the `generateBrickworks` method. See the Mobile SDK reference: - [Android](/developers/mobile-sdk/method-reference/android/content#generate-brickworks) - [iOS](/developers/mobile-sdk/method-reference/ios/content#generate-brickworks) - [Flutter](/developers/mobile-sdk/method-reference/flutter/content#generate-brickworks) - [React Native](/developers/mobile-sdk/method-reference/react-native/content#generate-brickworks) ### In-app You can use Jinjava tags or the [`SRInApp.internalMethod("Content/generateBrickworks")` method](/docs/campaign/in-app-messages/creating-inapp-templates/creating-inapp-template#use-a-mobile-sdk-method) from the in-app JS SDK. ### Jinjava tags Use Brickworks content in templates across the Synerise platform with dedicated JinJava tags. JinJava tags work consistently across all Synerise modules that support JinJava rendering, creating a unified content experience throughout your platform: - **Experience Hub channels** – Email campaigns, SMS messaging, mobile push notifications, and web push notifications with dynamic, personalized content - **Automation Hub workflows** – Sophisticated automation sequences with content that adapts based on customer actions and behavioral triggers - **Screen views and Documents** – Interactive displays, personalized mobile applications content - **In-App Messaging**– Contextual experiences that respond to customer behavior in real-time #### Generate record This tag can't be used in Brickworks schemas or records. In Documents and Screen Views, if you want to display an entire object instead of just one property, you need to use `{{ brickworks_result|tojson }}` In singleton schemas, use the API name (`appName`) or UUID of the schema in place of the record identifier. The `brickworksgenerate` tag generates a an object from a record with all references resolved and Jinja templates rendered:
{% set myFieldContext = {"oneToManyRelation": {"page":2, "limit": 50}} %}
{% set myContext={
    "example1":"value1",
    "example2":"value2"
    } 
%}

{% brickworksgenerate schemaId=SCHEMA_ID/APP_ID recordId=RECORD_ID/SLUG context=myContext fieldContext=myFieldContext %}
where: - The values for the `context` and `fieldContext` arguments must be variables created with `set` (as shown above). - `myFieldContext` provides paging data for a relation field named `oneToManyRelation`. You can skip this argument if you don't need it. - `myContext` provides values for two inserts used in the record (regardless of field names): `{{ context.example1 }}` and `{{ context.example2 }}`. You can skip this argument if you don't need it. Alternatively, you can use `brickworksgeneratevar` to create a `{{ brickworks_result }}` variable for reuse in a template:
{% brickworksgeneratevar schemaId=SCHEMA_ID/APP_ID recordId=RECORD_ID/SLUG context=myContext fieldContext=myFieldContext %}
  {{ brickworks_result }}            {# prints out the entire record #}
  {{ brickworks_result.someString }} {# prints out the value of the someString field #}
{% endbrickworksgeneratevar %}
#### Fetch raw record This tag can't be used in Brickworks schemas or records. In Documents and Screen Views, if you want to display an entire object instead of just one property, you need to use `{{ brickworks_result|tojson }}` In singleton schemas, use the API name (`appName`) or UUID of the schema in place of the record identifier. - The following tag fetches a raw record as defined in the database:
{% brickworks schemaId=SCHEMA_ID/APP_ID recordId=OBJECT_ID/SLUG %}
- The following tag fetches a raw record as defined in the database, but saves the result to a variable for reuse in your template:
{% brickworksvar schemaId=SCHEMA_ID/APP_ID recordId=OBJECT_ID/SLUG %}
    {{ brickworks_result }}
  {% endbrickworksvar %}
#### Fetch raw records This tag lets you retrieve multiple records (raw content) from a schema and access the result as an iterable. This tag can't be used in Brickworks schemas or records. In Documents and Screen Views, if you want to display an entire object instead of just one property, you need to use `{{ brickworks_result|tojson }}`
{% brickworksrecordsvar schemaId=ID/APPID [optional parameters] %}

{# example logic: iterate through result and return record IDs #}
{% for record in brickworks_result %}
{{ record.id }} 
{% endfor %}
{# end example logic #}
{% endbrickworksrecordsvar %}
where: - `schemaId` is the App ID or UUID of a schema. - `optional parameters` can be used to sort and filter the retrieved records: - The parameters can be applied in two ways (see [examples](#filtering-examples)): - as arguments in the tag. In this case, `slugs`, `ids`, and `filters` must be declared with `set` first. - as a `filteringParams` object. If you insert the same parameter in both ways, `filteringParams` takes precedence. - You can use these parameters: - `sortBy`: a record attribute to sort by and the sorting direction. **This parameter can't be added to `filteringParams`** For a list of sorting attributes, see the [/v1/schemas/{schemaIdentifier}/records (Get records) endpoint](https://hub.synerise.com/api-reference/brickworks#tag/Brickworks:-Records/operation/getRecordsFromSchema). - `search`: a string to search for in the values of fields which are [configured as searchable in the schema](/docs/assets/brickworks/schema-field-types#common-field-properties). - `filters`: an RSQL string to filter the records. These following system parameter names must include the `__` prefix: `__id`, `__schemaId`, `__name`, `__slug`, `__status`, `__createdAt`, `__updatedAt`, `__publishedAt`, `__recordVersion` - `slugs`: a list of record slugs. Looks for exact matches. - `ids`: a list of record IDs. Looks for exact matches.
You can collect the filters in an object and provide that object as an argument in the tag. Example:
{% set parametersVar = {
    search: "string",
    filters: "status==PUBLISHED",
    slugs: ["string","string"],
    ids: ["uuid","uuid"]
} %}
{% brickworksrecordsvar
    schemaId=string
    filteringParams=parametersVar %}
{{ brickworks_result }}
{% endbrickworksrecordsvar %}
You can enter the filters as arguments of the tag. Some of them must first be declared as variables with `set`, as shown in the example:
{% set filtersVar = "status==PUBLISHED" %}
{% set slugsVar = ["string","string"] %}
{% set idsVar = ["uuid","uuid"] %}
{% brickworksrecordsvar 
    schemaId=string
    search=string
    sortBy=createdAt:asc
    filters=filtersVar
    slugs=slugsVar
    ids=idsVar
%}
{{ brickworks_result }}
{% endbrickworksrecordsvar %}
# Exporting records You can export schema records in the following ways: - Export to a downloadable JSON or JSON lines file This method allows you to export schema records to a file you can download and use as you wish. There are two options here: - by [simple export](#simple-export) Ideal for one-off, quick file extraction when you need the data just once. - in the Automation Hub Allows for cyclic upload of schema record files and export automatically. Best if you need the process to run regularly without manual intervention. - [Export to external services](#export-through-the-automation-hub) - You can export schema records directly to external services that Synerise supports natively (for example, Amazon S3, Google Cloud Storage) using the Send File action nodes or to any endpoint using ["Outgoing Integration" node](/docs/automation/actions/webhook-node). **Benefits**: - You get a draft [workflow](/docs/automation/creating-automation) which you adjust to your needs. - This method lets you modify the file with schema records by using the [Data Transformation node](/docs/automation/operation/data-transformation-node) in the workflow.
Check the list of available native integrations at [Integration](/docs/automation/integration).
## General prerequisites --- A user must be assigned with the following permissions to: - [import data](/docs/settings/identity-access-management/permissions/data-management-permissions#import-data) - [access Brickworks](/docs/settings/identity-access-management/permissions/data-management-permissions#work-with-brickworks) - [export data](/docs/settings/identity-access-management/permissions/settings-permissions#export-data) - [export data to downloadable files](/docs/settings/identity-access-management/permissions/data-management-permissions#export-data-to-downloadable-files) ## Simple export --- This method lets you perform a single export to a downloadable file. 1. Go to Data Modeling Hub icon **Data Modeling > Records**. 2. Select a schema. 3. On the top bar, click **Export**. **Result**: A pop-up shows. 4. Select **Export single file**. 5. Click **Next**. 6. In the **Name** field, enter the name of the export. This will allow you to easily identify your export in the list of scheduled data export jobs. 7. Optionally, in the **File expiration** field, define how long the exported file will be available for download. - The minimum value is 30 minutes. - If you leave this field empty, a default expiration period of 7 days will apply. 8. Click **Next**. 9. Confirm by clicking **Run export**. ### Where to find the file? 9. To download the exported file, go to Data Modeling Hub icon **Data Modeling > Exports**. 10. On the left panel, select **Brickworks**. 11. Find the file on the list. 12. Click Three dot icon 13. Select **Download JSON** or **Download JSON lines**. ## Export through the Automation Hub --- This export method lets you: - export a downloadable file - export a file to external services - The scope of services includes those which allows usage of the Send File node type, for example, ["Send File" node](/docs/automation/integration/google-cloud-storage/send-file-to-gcp) to Google Cloud Platform. - If you can't find the service to which you want to export the file, use ["Outgoing Integration" node](/docs/automation/actions/webhook-node). ### Prerequisites for this method --- - Verify if you need to modify the file with records before the export. If so, prepare a [data transformation rule](/docs/automation/data-transformation-and-imports/creating-data-transformation) which you will later select in the [settings of the workflow](#configure-and-launch-workflow). - [Create a connection](/docs/settings/tool/connections#creating-connections) with the service to which you want to export the file with schema records. If you can't find the service to which you want to export the file, you can use ["Outgoing Integration" node](/docs/automation/actions/webhook-node) in the workflow and you can create the connection directly in the node configuration. ### Configure and launch workflow --- 1. Go to Data Modeling Hub icon **Data Modeling > Records**. 2. Select a schema. 3. On the top bar, click **Export**. **Result**: A pop-up shows. 4. Select **Export in Automation**. **Result**: The **Where do you want to export file?** dropdown shows. 5. From the **Where do you want to export file?** dropdown select: - if you want to export a downloadable file, select **Save file**. - if you want to export to external services, from the dropdown list, select one of the services. - if no option fits your business case, select any option and you will modify the draft workflow to your needs in further steps. **Result**: You are redirected to a draft workflow.
If you were not redirected to the workflow, check if your browser’s pop-up blocker is disabled.
6. If you want to schedule the frequency and date and time when the workflow will trigger, edit the configuration of the ["Scheduled Run" node](/docs/automation/triggers/scheduled-run). 7. In the **Get Brickworks Schema Records** node, leave the settings at default (the schema is already selected).
You can read the node documentation at ["Get Brickworks Schema Records" node](/docs/automation/actions/synerise-integrations/get-brickworks-schema-records).
8. In the **Data Transformation** node, select the transformation rule according to which the file with the records will be modified before export. If you don't need the node, you can remove it. 9. Configure the node with export to an external service: 1. Select a connection 2. Fill out the configuration form. To get instructions to filling out the configuration form, [find the service on the list](/docs/automation/integration) and proceed to the node instructions.
If the list doesn't include the service to which you want to export, you can replace the node with the ["Outgoing Integration" node](/docs/automation/actions/webhook-node) - you can set up the connection and the endpoint to which you will make a request in the node directly.
10. In the upper-right corner, click **Save & Run**. **Result**: The workflow will be active, but the actions in the workflow will be triggered as defined in the **Scheduled Run** node. The logs of operations in the workflow are available: - for the data transformation: enter the configuration of the workflow (Automation Hub icon **Automation Hub > Workflows**), select the **Transformation logs** tab. - for the export, go to **Data Modeling > Exports**, on the left pane, select **Automation**. # Response transformers Response transformers let you change the output while [generating an object](/docs/assets/brickworks/generating-objects). You can use this to manipulate the results of object generation. For example: - Maintain compatibility between an updated schema and your mobile app by changing the content while it's generated - for example, if the name or data type of a field in the schema changes, you can use the transformer to keep generating content with the old name/data type without changing your mobile app. - Simplify responses from external sources to limit the amount of data returned when generating a record. - Modify the result of record generation depending on the result of another field in the record (for example, an analysis result). ## How it works The transformer is a JavaScript function applied to the generated object before returning it in the API/SDK response. You [define the content of the function](#building-the-transformation-script) - by default, it's empty. ## Creating response transformers You can create multiple transformers for a schema, but only one can be active. The others can be selected when previewing a record, so you can test transformers without changing the active one.
Transformers are [versioned](#transformer-versions); so you don't need to create different versions of the same transformer as new transformers.
1. On the **Response transformers** tab, click **Edit > Add transformer**. **Result**: The transformer editor opens.
The transformer editor
The transformer editor
2. Enter the transformer name. 3. Enter a description. The description is saved separately for each version of the transformer, so you can use it to differentiate between versions. 4. Enter the transformation script. For details, see ["Building the transformation script"](#building-the-transformation-script). 5. Click **Save** or **Save and close**. 6. If you want to start using the script: 1. On the **Response transformers** tab, select the transformer as the active one. 2. Save the schema. ### Building the transformation script The transformation script is a function which the backend runs after generating content, before returning the response to you. The function can access the content (key/value) map of a generated record by referencing the `generated` object. To access a field, use dot notation, for example `generated.exampleString` Take these requirements and mechanisms into account: - The script must end with a return statement which returns the transformed object. You can overwrite the properties of the `generated` object or create a new object from it, modify some values, and return a new object. - The transformer runs only for the top-level record (the one you requested). If the record references other records with their own response transformers, those nested transformers aren't processed. - After running the function, the generated object is not validated against the schema. The response transformer can change the data type of a field. - You can add error handling and logging in the function and see its results in the response when the function fails - the API returns an HTTP 400 message with a `details` object that shows the error message and logs. - The number of transformers and their versions is [limited](/docs/assets/brickworks/limits). - The transformation script can't make HTTP requests and other external calls; it can only transform data received from a processed record, so you can use an External Data field. ### Transformer example 1 Here's a simple transformer example: 1. A schema has one field: `exampleString` 2. The transformer is: ```js { generated.exampleString = "new value"; return generated; } ``` This code replaces the value of the `exampleString` field in the record with `"new value"` 3. When you make a content generation request, the response is:
{
       "__slug": "exampleRecord",
       "__recordVersion": 6,
       "__publishedAt": "2026-06-18T12:04:34.340257Z",
       "__matchedAudience": true,
       "__updatedAt": "2026-06-18T12:04:34.283001Z",
       "exampleString": "new value",
       "__createdAt": "2026-06-18T11:21:06.960940Z",
       "__schemaId": "2e38959d-b9d9-4699-9ace-9e5eeb96b251",
       "__id": "715f4d74-25c3-47ca-874b-861f9d0ab190",
       "__schemaVersion": 20
   }
### Transformer example 2 1. A schema is used to create a visual element by referencing records from another schema. This is the structure of the schema, with the `stories` field defined as a [reference to records from another schema](/docs/assets/brickworks/schema-field-types#one-to-many) (`"subtype": "one_to_many"`): **JSON structure**: ```json { "type": "object", "required": ["stories"], "properties": { "title": { "type": "string", "default": "Let's start jogging!" }, "stories": { "type": "array", "subtype": "one_to_many", "items": { "subtype": "one_to_one", "referenceId": "db6df665-..." }, "maxItems": 5 }, "buttonText": { "type": "string", "default": "Shop now!" }, "buttonColor": { "type": "string", "default": "#000" }, "buttonTextColor": { "type": "string", "default": "#fff" } } } ``` **Schema editor view**:
An example schema
An example schema
2. When generating an object, `stories` is generated as an array of objects. Each object in the array has an `image` object with a `url` property (string) that points to the image. This is how `stories` looks before applying the transformer: ```json "stories": [ { "name": "Example item 1", "image": { "url": "https://example.com/images/image1.png", "thumb": "https://example.com/thumbs/image1.png" } }, { "name": "Example item 2", "image": { "url": "https://example.com/images/image2.png", "thumb": "https://example.com/thumbs/image2.png" } } ] ``` 3. The following transformer replaces the `image` object in each story with just the object's URL string. This simplifies handling the output. ```js { const updatedStories = generated['stories'].map(story => { return { ...story, image: story.image.url }; }); return {...generated, stories: updatedStories}; } ``` 4. This is how `stories` looks after applying the transformer: ```json "stories": [ { "name": "Example item 1", "image": "https://example.com/images/image1.png" }, { "name": "Example item 2", "image": "https://example.com/images/image2.png" } ] ``` ## Activating response transformers for a schema Each schema has its own list of transformers. Only one transformer from the list can be active.
A list of transformers assigned to a schema. 'Example 3' is selected as the active transformer.
A list of transformers assigned to a schema. "Example 3" is selected as the active transformer.
1. [Create and save your schema](/docs/assets/brickworks/quick-start/creating-a-schema). 2. In the schema editor, go to the **Response transformers** tab. 3. Click **Edit**. 4. Activate a transformer: - If no transformers exist or you want to create a new one, proceed to ["Creating response transformers"](#creating-response-transformers). - If no transformer is active, click **Select** and select a transformer from the list. - If a transformer is active and you want to use a different one, click **Change** on the active transformer and select a different one. 5. Click **Apply**. 6. Save the schema by clicking **Save**. ## Previewing transformer results To preview and test transformers, use the **Transforming response** tab in a [record preview](/docs/assets/brickworks/quick-start/creating-a-record#previewing-records). The preview lets you test different versions of the schema (drafts) and inactive transformers without affecting the published schema version and active transformer. ## Managing response transformers On the **Response transformers** tab, in the list of transformers, hover over a transformer and: - to delete the transformer, click the cross icon, then confirm. - to duplicate the transformer, click the copy icon. - to edit a transformer, click the pencil icon and edit the transformer in the same way as when [creating one](#creating-response-transformers).
When you edit and save an active transformer, the change takes effect without saving the schema.
### Transformer versions A transformer version is created whenever you save the transformer in the editor. When you exceed the [version limit](/docs/assets/brickworks/limits), the oldest version is removed. To access and manage versions: 1. On the **Response transformers** tab, in the list of transformers, hover over a transformer and click the pencil icon. 2. In the editor that opens, click **Versions history**. **Result**: The version history modal opens. - To view a version, select it and click **Show**. - To compare versions, select two versions and click **Compare**. **Result**: A git-style diff opens.
A view of the version comparison
A view of the version comparison
- To restore a version: 1. Open two versions for comparison. 2. Above the version that you want to restore, click **Restore this version**. **Result**: The restored version is saved as a new version and the editor closes. ## Disabling response transformers Disabling a transformer doesn't delete it. 1. On the **Response transformers** tab, next to the active transformer, click the cross icon. 2. In the pop-up that opens, confirm the operation. # Removing catalogs You can remove catalogs you no longer need.
Before you remove a catalog, make sure it's not used as a source of data in other features.
1. Go to Data Modeling Hub icon **Data Modeling Hub > Catalogs**. 2. On the list, find the catalog you want to remove. 3. Click the Three-dot icon icon and from the dropdown list select **Delete**. # Voucher pools Voucher pool is a place where you can import discount codes and coupons, which you can later use through many communication channels (email, SMS, mobile push, web push, dynamic content, and [promotions](/docs/ai-hub/promotions/creating-promotions#add-voucher-codes) (for selected items and entire cart)). The discount codes and coupons get two forms: - a text string - [a barcode](#supported-barcodes)
A voucher code must be unique across the entire workspace, which means it cannot be duplicated within any voucher pool.
It is important to note that the system does not provide automatic warnings in the following scenarios: - when the voucher pool used in a message is inactive, - when all codes within an active voucher pool have already been assigned - when a voucher pool is inactive but there are still unassigned codes remaining. Therefore, it is your responsibility to control and manage these aspects independently. The voucher feature does not provide the logic of voucher usage. You will need to implement and integrate this logic in your applications and systems, ensuring that information about voucher usage is passed to Synerise. ### Supported barcodes Accepted types of barcodes in Synerise:
EAN_13 EAN_8
EAN_128 CODE_39
ITF_14 CODE_128
POSTNET QR-CODE
UPC-A UPC-E
### You may want to read --- - Developer Guide: [Barcodes](/developers/inserts/insert-usage#barcodes) - Use case: [Birthday email with coupon](/use-cases/birthday-coupon) - Use case: [Coupon for membership anniversary](/use-cases/coupon_for_anniversary) - Use case: [Discount coupon for installing the application](/use-cases/discount-for-app) ## Creating a code pool --- First, create a pool to which you will later import the codes.
A form for adding a pool
A form for adding a pool
1. Go to Data Modeling Hub icon **Data Modeling Hub > Voucher Pools > Add pool**. 2. On the pop-up, fill in the following fields: 1. In the **Pool name** field, enter the name of the pool (the name is only visible on the list of the voucher pools). 2. Optionally, from the **Barcode type** dropdown list, select the type of codes which will be imported in the CSV file to Synerise.
The selection in the dropdown has no influence on the further process. It serves only informational purposes for the users.
3. Optionally, in the **Voucher prefix** field, enter a number that will be added to the beginning of each code. 4. In the **Emission start** and **Emission end** fields, select the dates when the distribution of the codes starts and finishes, respectively. 5. Optionally, to limit the size of the pool, fill in the **Pool limit** field. 6. Optionally, in the **Description** field, enter the internal description of the pool that is visible only on the list of voucher pools. 3. Confirm by clicking **Apply**. **Result**: Your code pool appears on the top of the list. ## Importing codes to the pool --- After you created a pool, add or import codes to the pool. You must also import the codes to your backend.
An empty voucher pool
An empty voucher pool
Synerise does not validate if the codes you upload match the pool type.
1. Create a CSV file according to these [requirements](/docs/assets/imports/importing-vouchers#file-requirements).
There is a limit of 36 characters for the voucher code and the file can't exceed 200 MB.
2. Go to Data Modeling Hub icon **Data Modeling Hub > Voucher Pools**. 3. Double-click the code pool to which you want to import the file with codes. 4. Click **Import**. 5. Proceed according to [this instruction from step 3 (selecting the import method)](/docs/assets/imports/importing-vouchers#procedure). **Result**: A list of codes is uploaded.
You can also add the codes manually by clicking **Add record**.
## Assigning a code to a customer --- To limit code usage by redeeming, which is recommended when distributing unique codes to customers, you must first assign a code to the customer using the methods described in the table below. If you don't assign a code, it cannot be used. However, if you [distribute a code in a message](#distributing-codes), it will be assigned automatically. This part of the process can be omitted in a scenario in which you display one, non-redeemable discount code which expires at a specific date. | Method | API consumer | Description | Events generated | |---------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------|-------------------------------------------------------------------------|----------------------------| | [Assign a voucher from a pool to Profile](https://hub.synerise.com/api-reference/loyalty-and-engagement#operation/AssignAVoucherFromAPoolToAClient)
`/v4/vouchers/item/assign` | Profile (formerly client), Anonymous profile (formerly client) | This method lets you assign a code from a specific pool to a customer. | [voucherCode.assigned](/docs/assets/events/event-reference/loyalty#vouchercodeassigned) | | [Assign a voucher to a Profile](https://hub.synerise.com/api-reference/loyalty-and-engagement#operation/AssignAVoucherToAClient)
`/v4/vouchers/item/assign-for-client` | Workspace (formerly Business Profile), Synerise User | This method lets you assign a code from a specific pool to a customer. | [voucherCode.assigned](/docs/assets/events/event-reference/loyalty#vouchercodeassigned) | ## Distributing codes --- Apart from displaying discount codes, you can distribute them in: - [email](/docs/campaign/e-mail) - [SMS](/docs/campaign/SMS) - [mobile push](/docs/campaign/Mobile) - [web push](/docs/campaign/Webpush) - [promotions](/docs/ai-hub/promotions) Read more about [voucher pools inserts](/developers/inserts/insert-usage#code-pools) and [barcodes inserts](/developers/inserts/insert-usage#barcodes).
Click here to learn how to add a code in the form of a text string

As an example, the procedure describes distributing codes through an email.

  1. Go to Experience Hub icon Experience Hub > Email > Create new.

  2. In the Content section, click Create message.

  3. Select Code editor.

    Adding a discount code pool is also possible in Drag&drop builder.

  4. Enter one of the following code snippets in the HTML section:

    Insert formula Explanation
    {% voucher %} pool-uuid {% endvoucher %}
    This insert assigns a code from a pool to a customer. If the code is already assigned to the customer, it retrieves different code for this customer.
    {% voucher assign=false %} pool-uuid {% endvoucher %}
    This insert assigns a code from a pool to a customer (unless one is already assigned) and retrieves that same code for this customer every time
  5. Replace `pool-uuid` with the ID of your voucher pool. To get the uuid of the voucher pool:

    1. Go to Data Modeling Hub > Voucher Pools.
    2. From the list, open the pool.
    3. From the URL, copy the UUID of the pool.
Implementing a discount code in the form of a string in an email
The preview for a selected customer (the preview option is on)
Click here to learn how to add the code in the form of barcodes

As an example, the procedure describes distributing barcodes (type EAN_39) through an email.

  1. Go to Experience Hub icon Experience Hub > Email > Create new.

  2. In the Content section, click Create message.

  3. Select Code editor.

  4. In the HTML section, enter the following code:

    {% vouchervar id=uuid_of_voucher_pool %} {% barcode code= {{voucher_result}}, gray=true, type=barcode_type, hrp=BOTTOM %} {% endvouchervar %}
  5. Replace `uuid_of_voucher_pool` with the actual ID of your voucher pool. To get the ID of the voucher pool:

    1. Go to Data Modeling Hub > Voucher Pools.
    2. From the list, open the pool.
    3. From the URL copy the UUID of the pool.
  6. Edit the values for `type` and `hrp` parameters according to this instruction.

    The barcode type must match the type of codes stored in the voucher pool.

Results: The preview mode for a specific customer is unused for this configuration.

Implementing a discount code in the form of a barcode in an email
Implementing a discount code in the form of a barcode in an email

## Displaying codes --- You can distribute a discount code by displaying it on a website, mobile application, or digital signage. You can do it in the following ways: - Using the following method: | Method | API consumer | Description | Events generated | |---------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------|-------------------------------------------------------------------------|----------------------------| | [Get assigned vouchers](https://hub.synerise.com/api-reference/loyalty-and-engagement#operation/GetAssignedVouchers)
`/v4/vouchers/item/get-assigned` | Profile (formerly client), Anonymous profile (formerly client) | This method lets you retrieve all codes assigned to a customer so you can display it. | n/a | - You can use [dynamic content](/docs/campaign/dynamiccontent) for this purpose. While creating a dynamic content campaign, in its contents use an insert that [retrieves a code from a pool](/developers/inserts/insert-usage#code-pools). - [Create a document](/docs/assets/documents/creating-documents) that contains a [code pool insert](/developers/inserts/insert-usage#code-pools) and [barcode inserts](/developers/inserts/insert-usage#barcodes) in its body and display the document in a mobile application using the following methods: - [Android](/developers/mobile-sdk/method-reference/android/content#generate-document) - [Flutter](/developers/mobile-sdk/method-reference/react-native/content#generate-document) - [iOS](/developers/mobile-sdk/method-reference/ios/content#generate-document) - [React Native](/developers/mobile-sdk/method-reference/flutter/content#generate-document) When a voucher is retrieved for a profile, a [voucherCode.assigned](/docs/assets/events/event-reference/loyalty#vouchercodeassigned) event is generated. Example voucher insert:
{% vouchervar id=pool-uuid %}
  {{ voucher_result }}
{% endvouchervar %}
Output:
{% vouchervar id=5fae8aba-b48e-4144-8d28-db24b1570ab0 %}
<ul>
  <li>The voucher value is {{ voucher_result }}.</li>
</ul>
{% endvouchervar %}
## Redeeming codes --- When a customer uses a discount code in a transaction, your backend must send a redemption request right after the discount is used. If you don't redeem a code, it will still be available to the customers and they may use it again. It is highly recommended to implement control over redeeming codes on your backend. When a code is redeemed, a [voucherCode.redeemed](/docs/assets/events/event-reference/loyalty#vouchercoderedeemed) event is generated. | Method | API consumer | Description | Events generated | |---------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------|-------------------------------------------------------------------------|----------------------------| | [Redeem a voucher](https://hub.synerise.com/api-reference/loyalty-and-engagement#operation/RedeemAVoucher)
`/v4/vouchers/item/redeem` | Workspace (formerly Business Profile), Synerise User | This method lets you redeem a code. | [voucherCode.redeemed](/docs/assets/events/event-reference/loyalty#vouchercoderedeemed) | # Schema management ## Updating schemas
- When you update a schema by removing a data field, that field is automatically removed from existing records. - When you update a schema by adding a new data field, existing records are **not** automatically updated to include any value.
1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. In the list of schemas, locate the schema to delete and click Three dot icon. 3. In the menu that opens, click **Edit**. **Result:** the schema creation screen opens. 1. Edit the schema in the same way as in [Creating schemas](/docs/assets/schema-builder/creating-schemas). ## Previewing schemas You can check what the schema looks like when a user adds records manually. 1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. In the list of schemas, locate the schema to delete and click Three dot icon. 3. In the menu that opens, click **Preview**. **Result:** The preview opens. ## Duplicating schemas When you duplicate a schema, an identical schema is created under the name ` - copy`. The new schema does not contain any records. 1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. In the list of schemas, locate the schema to delete and click Three dot icon. 3. In the menu that opens, click **Duplicate**. **Result:** The schema is duplicated. ## Deleting schemas
When you delete a schema, all data records stored in that schema are also deleted.
1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. In the list of schemas, locate the schema to delete and click Three dot icon. 3. In the menu that opens, click **Delete**. **Result:** The schema and all its records are deleted. # Common event parameters These parameters may exist in all events.
Become familiar with the [event parameters which are denylisted](/docs/assets/events/introduction-to-events#denylist-of-event-parameters) by default for every workspace. These parameters are still available on the Raw data tab [in event details](/docs/crm/crm-profile#activity-list), if the data is available.
## Base parameters | Name | Type | Example | Description | | --- | ---| --- | --- | | action | string |`page.visit` | Type of the event. | | ip | string | `13.93.68.194` | IP of the device that sent the event. | | clientId | integer | `5092159999` | Unique identifier of the profile. | | eventUUID | string | `b26ba826-728d-46d2-8055-2c46ce9829f3` | Unique identifier of the event. | | uuid | string | `e0097757-d1e2-44ac-ba3c-d97979a354c1` | UUID of the profile. When multiple profiles are merged into one, the old profiles are deleted, but their UUIDs are saved in the new profile. The profile UUIDs stored in pre-merge events are used to associate those events with the post-merge profile. | | source | string | `WEB_DESKTOP` | The type of traffic source of the event. Possible values: `WEB_DESKTOP`, `MOBILEWEB`, `MOBILE_APP` | | time | integer| `1669725368520` | Time when the event occurred, as a Unix timestamp including milliseconds. This is the time needed for [overwriting events](/developers/api/events/overwriting-events) (needs to be converted into ISO first).
  • If the event didn't have a specified time when it was sent, `time` is the time when the event was received by Synerise
  • If the event had a future time specified when it was sent, that time is rejected and `time` is the time when the event was received by Synerise.
| | createDate | integer | `1669725368520` | Same as `time` | | eventCreateTime | string | `2022-11-29T12:36:06.682Z` | Time when the event was received by Synerise. Does not exist in events generated by the system. | | snr-original-time | string | `2048-10-05T15:25:06.459+02:00` | Original time that was sent with the event, even if it was rejected. Does not exist in events generated by the system. | | label | string | `string` | This is a legacy parameter saved in raw data and some APIs/SDKs require sending it, but it's not saved into persistent storage. You can't use it in analytics. It may be removed in the future. | | Custom parameters | any | `foo` | When importing events or sending them through the APIs/SDKs, you can add free-form custom parameters. They can also be added by [event enrichment](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs). | ## Parameters added by Web SDK Some of the events may be sent from a website or an email by using the Synerise Web SDK. In those events, the following parameters may be added: | Parameter | Type | Example | Description | | --- | --- | --- | --- | | tracker | string | `B264B70A-42D8-B6B7-13E5-ACAAAAAAA59` | Tracking code used to record this event | | tablet | boolean | `true` | Informs if the event occurred on a tablet | | mobile | boolean | `true` | `true` if the event occurred on a mobile device | | URL/url | string | `https://www.shop.pl/gaming/consoles/worse-than-pc-256gb-white?gclid=EAIaIQobChMIo66d4564th547AYASAAEgI_MvD_BwE` | URL of the site where the event occurred | | uri | string | `sub-domain.domain.com/path?gclid=EAIaIQobChMIo66d4564th547AYASAAEgI_MvD_BwE` | URI of the page where the event occurred | | host | string | `sub-domain.domain.com` | Domain name or IP address of URL | | location | string | `/eu-projects` | Resource location | | ua.os.family | string | `Mac OS X` | Operating system of the source device | | ua.os.major | string | `10` | Major version of the user's operating system | | ua.os.minor | string | `12` | Minor operating system version number | | ua.device.family | string | `Other` | The client device family | | ua.device.brand | string | `Brandname` | Brand name of the device. Only sent by mobiles and tablets. | | ua.device.model | string | `Model 8` | Model of the device. Only sent by mobiles and tablets. | | userAgent | string | `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko)` | Information about the User Agent | | ua.major | string | `605` | Major UA version number | | ua.minor | string | `15` | Minor UA version number | | ua.patch | string | `15` | The patch version of the User Agent | ## Parameters added by Mobile SDK If an event is sent by using [declarative tracking](/developers/mobile-sdk/event-tracking#declarative-tracking) or [predefined events](/developers/mobile-sdk/event-tracking#predefined-event-list) with the Mobile SDK, the `os` parameter is added. It informs about the operating system of the mobile device. # Importing profiles After importing profiles to Synerise, you can direct various actions towards them, such as: - Sending messages ([email](/docs/campaign/e-mail), [SMS](/docs/campaign/SMS), [mobile push](/docs/campaign/Mobile), [web push](/docs/campaign/Webpush), [in-app messages](/docs/campaign/in-app-messages)). - Creating [predictions](/docs/ai-hub/predictions). - Creating [query rules](/docs/ai-hub/ai-search/query-rules) in [AI search engine](/docs/ai-hub/ai-search). ## Requirements --- - You need user permissions that grant you access to Simple Imports or/and Automation - Prepare a file that contains one of the following profile identifiers: (the list contains recommended column names, if you use different names you will be able to map/transform data during the process): - `email` - use it only if you use [unique emails](/docs/settings/configuration/non-unique-emails) in Synerise. If you use non-unique emails, don't use `email` as an identifier during the import, use `customId` instead. - `uuid`, - `clientId` - can be used only when updating an existing profile - `customId`, - `phone` - Phone number is treated as an identifier only if no other identifier is provided. Then, if a profile with this phone number does not exist and non-unique emails are disabled, an anonymous profile is created. This is the only required column, the rest is optional.
If you choose an email as an identifier, pay attention to the correct format of emails. Otherwise, your import will fail.
- Spaces and special characters in the column headers are not allowed. - `.csv` files must be UTF-8 encoded - Maximum file size: 200 MB. ### Tips for preparing a CSV file - Recommended file metacharacters: - A character that splits columns (delimiter): `,` - A character that is used to contain the text (quotation mark): `"` - A character (escape character) that changes the default interpretation of a sign or string followed by the escape character: `\` - Attributes (column names) and values are case-sensitive (firstname and Firstname are not the same) - If you will use Automation Hub as a [method of import](/docs/assets/imports/introduction-to-imports#import-methods), below you can find the instructions how to transform the optional default profile properties: | Profile's property | Required name | Accepted values | Other comments | |-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Profile's first name | `firstName` | A string | n/a | | Profile's last name | `lastName` | A string | n/a | | Date of birth in the profile | `birthDate` | the `yyyy-mm-dd` format, months must be zero-padded (for example, May is `05`) | For example, `1999-09-09` | | Profile's company | `company` | A string | n/a | | Profile's city of residence | `city` | A string | n/a | | Profile's street address | `address` | A string | n/a | | Profile's zip code | `zipCode` | A string | n/a | | Profile's province of residence | `province` | A string | n/a | | Code of profile's country of residence in accordance with the ISO 3166 format | `countryCode` | A string | n/a | | Profile's gender | `sex` | `FEMALE`, `MALE`, `OTHER`, `NOT_SPECIFIED` | These values are transformed during import as follows:
- NOT SPECIFIED and OTHER to `0`
- FEMALE to `1`
- MALE to `2`
These values will be presented as such in a profile's card | | Marketing agreements of the profile |
- for email: `agreements.email`
- for web push: `agreements.webPush`
- for mobile push: `agreements.push`
- for SMS: `agreements.sms`
- for WhatsApp texts: `agreements.whatsapp` |
- for email: `true`, `false`, `True`, `False`, `1` (true), `O` (false)
- for web push: `true`, `false`
- for mobile push: `true`, `false`
- for SMS: `true`, `false`;
- for WhatsApp texts: `true`, `false` | If you use non-unique emails, email marketing agreement is saved as a custom attribute which takes the following values: `enabled`, `disabled` | | Tags assigned to a profile | `tags` | An array of strings | n/a | | A profile's phone number | `phone` | The phone number can contain digits, spaces, and an optional `+` at the beginning. | For example: `+48111222333`; `+48 111 222 333` | **Example**
Exemplary file for a profile import
Exemplary file for a profile import
For more details about parameters and their accepted formats, click [here](https://hub.synerise.com/api-reference/profile-management#operation/BatchAddOrUpdateClients). ## Procedure --- ### Selecting the file for import In this part of the process, you will upload a file from your device. 1. Go to Data Modeling Hub icon **Data Modeling Hub > Imports > New import**. 2. As the data type for import, select **Profiles**. 3. As the import method, select one of the following options: - Import a local file - To import a single `.csv` file to Synerise. - Import in Automation - To import a .`csv`, `.json`, `.jsonl`, and `.xml` files and execute periodical imports.
1. Upload the `.csv` file by using the **+ Upload file or drop one here** field. 2. Optionally, you can customize the file metacharacters by clicking the arrow down icon. 1. From the **Delimiter** dropdown, select the character that marks the end of a column. 2. From the **Quotation mark** dropdown list, select the characters that contain the text or data type. 3. From the **Escape character** dropdown lists, select the character which changes the default interpretation of a character or a string followed by the escape character. 3. To proceed to the next step, click the **Next** button. ### Mapping the columns with parameters in Synerise In this part of the process, you will connect the columns from the file with their counterparts (the existing parameters) in Synerise. This way, you will point which parameters in Synerise will contain the profile information from the imported file. You can also exclude parameters from the import. During the mapping process, you can't add new columns to the imported file. On the user interface, you will be presented with two columns - the left column displays the names of the columns from the imported file, the other contains dropdown lists with the parameters available in Synerise. The dropdown lists indicate **required** parameters for a successful import. 1. Next to the file column name, from the dropdown list, select the corresponding parameter in Synerise. Perform this step for all columns in your file. 2. To exclude a parameter from import, next to the column name, click this icon: An arrow icon **Result**: The icon changes to Don't import icon ### Launching import After steps described above you'll be redirected to the mapping summary. If it's correct, to launch the import, click **Run import**.
1. Select the method of delivering the file: - Local File - This option allows you to upload a file from your device. - SFTP protocol - This option allows you to upload a file from a server using the SFTP protocol. - HTTPS protocol - This option allows you to upload a file from a server using the HTTPS protocol. - Amazon S3 - This option allows you to upload a file from Amazon S3 bucket. - Azure - This option allows you to upload a file from Azure Blob Storage. - Google Cloud Storage - This option allows you to upload a file from Google Cloud Storage. 2. Click **Go to import template**. 3. Define the settings of the [Scheduled Run node](/docs/automation/triggers/scheduled-run). 4. Depending on the method of delivering the file, configure the settings of [Local File](/docs/automation/integration/http-integrations/http-get-file) or the [Get File](/docs/automation/integration/http-integrations/http-get-file) node that uses HTTP protocol or the [Get File](/docs/automation/integration/sftp-integrations/sftp-get-file) node that uses SFTP protocol. 5. If the data requires modification, configure the settings of the [Data Transformation node](/docs/automation/operation/data-transformation-node). If you have prepared the transformation rules for the data structure of the imported file, select it from the dropdown list. If not, create it from scratch. You can remove this node if your data doesn't require transformation. 6. The rest of the nodes in the default template don't require any further configuration. 7. If your workflow is ready, click **Save & Run**.
## Reserved parameters --- You are not allowed to create the following parameters while mapping. These are default parameters available in Synerise (they already exist in Synerise).
address agreements anonymous anonymous_type
avatarUrl birthdate birthDate businessProfileId
city clientId company confirmation_hash
confirmed countryCode country_id created
customId custom_identify deletedAt displayname
displayName email external_avatar_url facebookId
firstname firstName geo_loc_as geo_loc_city
geo_loc_country geo_loc_country_code geo_loc_isp geo_loc_lat
geo_loc_lon geo_loc_org geo_loc_query geo_loc_region
geo_loc_region_name geo_loc_status geo_loc_timezone geo_loc_zip
ip lastname lastName last_activity_date
newsletter_agreement ownerId phone province
receive_btooth_messages receive_push_messages receive_rfid_messages receive_smses
receive_webpush_messages receive_wifi_messages sex source
tags time type updated
uuid zipCode
# Schema relations Relations are defined between schemas, but applied in practice to records of these schemas. For example, you can create a list of people and a list of projects where these people are involved. To do this, you need to: 1. Create two schemas and define relations between them OR update existing schemas with relations. 2. Connect employee records with project records. When you create a relation in a schema, the other schema is updated automatically. For a practical [example](#relation-example) of creating a relation, continue reading this article.
A schema can include multiple relation definitions. Relations are not mutually exclusive - at the same time, you can have a relation that allows each person to be assigned to only one project and another, where a person can belong to many projects. An example is creating one relation to assign project leaders (a person can only lead one project at a time) and another relation to assign all project stakeholders (a project leader can be involved in the workflows of many other projects).
## Relation types In the explanations below, the following terms are used: - *Source schema* is the schema where you add the relation. In the [example](#relation-example), this is the employee schema. - *Target schema* is the schema that is updated automatically when you save the source schema. In the [example](#relation-example), this is the project schema. | Icon | Name | Description | | --- | --- | --- | | One to one relation icon | One to one | A record in the source schema can be related to only one record in the target schema; a record in the target schema can be related to only one record in the source schema. | | One to multiple relation icon | One to multiple | A record in the source schema can be related to multiple records in the target schema; a record in the target schema can be related to only one record in the source schema. | | Multiple to one relation icon | Multiple to one | A record in the source schema can be related to only one record in the target schema; a record in the target schema can be related to multiple records in the source schema. | | Multiple to multiple relation icon | Multiple to multiple | Records in both schemas can be related to multiple records. | ## Defining relations in schemas 1. Create a new schema or start editing an existing one. 2. Add a **Relation** component. 3. Open the component for editing. 4. On the **Data** tab, perform the following actions: 1. Select the [type of relation](#relation-types). 2. From the **Relation to** drop-down list, select the target schema. 3. **Optional**: From the **Displayed field** drop-down list, select the field whose value will be displayed from the target record when browsing records. For an example of the result, see [the relation example](#displayed-field). 5. Click **Apply**. 6. Save the schema. ## Relation example Before proceeding with the example, you should know how to [create schemas](/docs/assets/schema-builder/creating-schemas) and [add records](/docs/assets/schema-builder/schema-records). The example shows how to create a project-employee relation, in which an employee can only be associated with one project and a project can have many employees assigned. The example assumes that you create new schemas, but **you can add relations to existing schemas** in the same way by updating the schemas. ### Project schema This schema only stores one value: the name of the project. It does not have any relation defined, because the employee schema does not yet exist in this example, so a relation cannot be created.
A simple project schema
A simple project schema
### Employee schema The schema has two fields: - the name of the employee - the definition of a relation; with the **Displayed field** set to **Project name**.
The employee schema with a relation to the project schema. The Data tab of the relation field is open for editing.
The employee schema with a relation to the project schema. The Data tab of the relation field is open for editing.
When you save this schema, the project schema is updated automatically with a field for defining the relation. ### Connecting records 1. Create a project record. Employee records do not exist, so you can't connect anything yet. The relation field has the default label "relation", because it was created automatically.
A single project record, no relation
A single project record, no relation
1. Create some employee records with a relation to the project record you created.
If you're editing an existing record, open it and add the relation drop-down by clicking the **Add another** button. This is also used to add more than one relation to a record.
Creating a new record with a relation
Creating a new record with a relation
**Result:** You can see the relation in the employee records and the project record.
Employee records
Screenshot of two employee records related to the same project
The project record is updated automatically:
Screenshot of a project record relation that has no human-readable label
Project record before updating the relation with human-readable labels
1. If you want the project record to display the names of the employees and the name of the relation: 1. Open the project schema for editing. 2. Open the relation field for editing. 3. On the **Design** tab, in the **Label** field, enter a name for the relation, for example `Employees in this project`. 4. On the **Data** tab, in the **Displayed field**, select **Employee name (\)**. The **field ID** depends on the ID you assigned when creating the schema. If you didn't assign any, it receives a default value. 5. Apply the changes and save the schema. **Result:** The project record displays employee names and the relation name.
Project record after updating the relation with human-readable labels
Project record after updating the relation with human-readable labels
# Schema permissions Permissions in Schema Builder allow you to assign access to schemas and scope of actions you can perform (edit the schema structure, adding records to the schema, duplicating, and deleting). It helps you control the contributions to the schema and restrict the access to the defined users. ## Prerequisites --- To define schema permissions, you must [create a schema](/docs/assets/schema-builder/creating-schemas) first. ## Permission types --- You can assign permissions on two levels: - [General schema permissions](/docs/assets/schema-builder/schema-permissions#general-schema-permissions) - You can assign the access and editing permissions to users for a whole schema. - [Schema record permissions](/docs/assets/schema-builder/schema-permissions#schema-record-permissions) - You can assign users who can add records to the schema. ## General schema permissions --- There are four types of general schema permissions: | Permission type | Explanation | |-----------------|--------------------------------------------------------------------| | Private | Schema is viewable and editable by its author | | Public | Every user can view, edit the schema, and add records to it (default) | | Read-only | Only the author can edit the schema, all other users can view it | | Restricted | You can define different permissions for different users and user groups |
Regardless of the selected permission for the schema, only the author or the admin of the workspace can assign or modify permissions.
### Defining general schema permissions 1. Go to **Data Modeling Hub > Schema builder**. 2. On the list, find the schema you want to define permissions for. 3. Next to the name of the schema, click the padlock icon. 4. From the dropdown list, select the permission.
Assigning permissions to a schema
Assigning permissions to the schema
## Schema record permissions --- There are four types of record permissions: | Permission type | Explanation | |-----------------|--------------------------------------------------------------------| | Private | Only the author of the schema can add records to the schema, schema records are not visible or searchable for other users | | Public | All users can add records to the schema | | Read-only | Only the author of the schema can add records to it, all other users can view the records | | Restricted | You can define different permissions for different users and user groups |
Regardless of the selected permission for the schema, only the author or the admin of the workspace can assign or modify permissions.
### Defining schema record permissions 1. Go to **Data Modeling Hub > Schema builder**. 2. On the list, find and click the schema you want to define record permissions for. 3. Click the padlock icon on any schema record.
Assigning record permissions to a schema
Assigning record permissions to the schema
4. From the dropdown list, select the permission. Permission you selected is applicable for all records.
Selecting record permissions to a schema
Selecting record permissions to the schema
## User groups and users --- For the **Restricted** type of permission (general and schema record permissions), you can either define users or user groups and their permission scope. ### Users 1. Select the **Users** tab. 2. Enter the name or email addresses of users who you want to grant permissions. 2. Confirm your choice by clicking **Add user**. 3. In the table below, select permissions for the selected users. - **Execute** to complete actions such as editing the schema or adding records to the schema. - **Read** to preview schema or records in schema. - **Edit** to edit the structure of the schema and schema records. - **Delete** to delete schemas or schema records. 4. Confirm by clicking **Apply**.
Assigning record permissions to a schema
Assigning record permissions to the schema
### User groups The users groups are sourced from **Settings > Roles**.
You can read more about Roles [here](/docs/settings/identity-access-management/permissions).
1. Select the **User groups** tab. 2. Click the user group or user groups for which you want to define the permissions. 3. In the table below, select permissions for the selected users. - **Execute** to complete actions such as editing the schema or adding records to the schema. - **Read** to preview the schema or records in the schema. - **Edit** to edit the structure of the schema and schema records. - **Delete** to delete schemas or schema records. 4. Confirm by clicking **Apply**.
Assigning record permissions to a schema
Assigning record permissions to the schema
If there are users who are assigned with permissions as individuals and they belong to a user groups with different set of permissions at the same time, the user group permissions are applicable then.
The change of permissions can take up to 5 minutes.
# Schema Builder Schema builder allows you to create flexible, re-usable data templates. # Brickworks Jinjava inserts This article contains a reference of Brickwork inserts which can only be used within the Brickworks feature on the interface. ## Retrieving values from fields You can use the `{{ record }}` insert to retrieve the value of another field. You can only refer to String, Number, and Enumeration fields. - **Insert is allowed in**: [Jinjava code field type](/docs/assets/brickworks/schema-field-types#jinjava-code) - **Syntax**: `{{ record.APIname }}` `APIname` must be replaced with the value of the **API name** option available in the settings of the [field](/docs/assets/brickworks/schema-field-types) on the interface. - **Description**: This insert enables retrieval of values from other fields in a [record](/docs/assets/brickworks/core-concepts#record). Retrieval is limited to fields containing primitive data types: [strings](/docs/assets/brickworks/schema-field-types#string), [numbers](/docs/assets/brickworks/schema-field-types#number), and [booleans](/docs/assets/brickworks/schema-field-types#boolean) - **Where is the API name value located?**:
API name
API name in the configuration of the schema field
In the tabs below, you can find the request for the [preview of record results](/docs/assets/brickworks/quick-start/creating-a-record#previewing-records) and its response. The request contains two fields: - `productName` which is a [string field](/docs/assets/brickworks/schema-field-types#string) - `productId` which is a [Jinjava code field](/docs/assets/brickworks/schema-field-types#jinjava-code)
{
  "identifierValue": "74029569-b01d-5ade-8cc2-6e8f7c136649",
  "context": {},
  "values": {
    "productName": "Sneakers ABC",
    "productId": "The identifier of the {{ record.productName }} is: 123456"
  }
}
{
    "__slug": "this-is-unique-slug",
    "__recordVersion": 1,
    "__publishedAt": "2025-12-10T13:03:45.895630Z",
    "__updatedAt": "2025-12-10T13:03:45.872542Z",
    "__createdAt": "2025-12-10T13:03:45.872542Z",
    "productName": "Sneakers ABC",
    "productId": "The identifier of the Sneakers ABC is: 123456",
    "__schemaId": "4ce815e6-6273-4b68-a732-d4589d72c625",
    "__id": "a2b6d8a0-cde9-4987-804a-1bb215042cc6",
    "__schemaVersion": 1
}
## Retrieving context - **Allowed in**: - [Jinjava code field type](/docs/assets/brickworks/schema-field-types#jinjava-code) - **Product context** field in [AI recommendation field type](/docs/assets/brickworks/synerise-objects#ai-recommendation), - **Primary key** field in [Catalog field type](/docs/assets/brickworks/synerise-objects#catalog) - **Syntax**: `{{ context.myField }}` Replace `myField` with the parameter name whose value will be used as a context. - **Description**: Use the context insert to supply values for non-profile variables. When previewing the record, include the variable name as the key and its corresponding value to properly render the Jinjava field output in the preview. - **How to provide context for retrieval?** - In the **Additional parameters** in the preview of the record on the Synerise interface - In the Jinjava for [generating an object with record results](/docs/assets/brickworks/generating-objects) - In an [object generation request](/docs/assets/brickworks/generating-objects#api), in the `context` object. In the tabs below, you can find the request for the [preview of record results](/docs/assets/brickworks/quick-start/creating-a-record#previewing-records) and its response. The record contains the following fields: - `productName` which is a string field - `productId` which is a string field - `productInformation` which is a catalog field (Synerise object) - `product` which is an AI recommendation field (Synerise object)
{
  "identifierValue": "74029569-b01d-5ade-8cc2-6e8f7c136649",
  "context": {
    "itemId": "0000208295260"
  },
  "values": {
    "productName": "Sneakers",
    "productId": "0000208295260",
    "productInformation": {
      "id": "15988",
      "itemKey": "{{ context.itemId }}"
    },
    "products": {
      "id": "TtZiwYdJQbuR",
      "params": {
        "itemId": "{{ context.itemId }}"
      }
    }
  }
}
{
    "__slug": "this-is-unique-slug",
    "__recordVersion": 1,
    "productInformation": {
        "channel": "online",
        "description": "Excellent choice for colder seasons",
        "color": "Gray",
        "colors": [
            "Gray"
        ],
        "itemGroupId": "0000208295260",
        "link": "https://www.example.com./sneakers-abc-gray.html",
        "itemId": "0000208295260",
        "category": "Women > Sneakers",
        "discount": 0.508,
        "discountAmount": 320,
        "gender": "female",
        "additionalImageLinks": [
            "https://www.example.com/media/product/0/0/0000208295260_04_ks.jpg",
            "https://www.example.com/media/product/0/0/0000208295260_02_ks.jpg",
        ],
        "price": {
            "currency": "PLN",
            "value": 629.99
        },
        "contentLanguage": "PL",
        "availability": true,
        "brand": "ABC",
// ... other properties omitted for brevity
    },
    "__updatedAt": "2025-12-10T16:22:38.860058Z",
    "__createdAt": "2025-12-10T16:22:38.860058Z",
    "productName": "Sneakers",
    "productId": "0000208295260",
    "__schemaId": "8d64213a-4277-491d-93a8-e3be03e2666e",
    "__id": "73e1b44e-94ea-4e95-83c5-59207dcdc553",
    "__schemaVersion": 1,
    "products": {
        "data": [
            {
                "price": {
                    "value": 249.99
                },
                "brand": "XYZ",
                "link": "https://www.example.com/sneakers-xyz-black.html?snrai_campaign=TtZiwYdJQbuR&snrai_id=139beb5b-672e-4984-80ac-7aba76031a61",
                "itemId": "4002092027589",
                "category": "Women > Sneakers",
                "imageLink": "https://www.example.com/media/product/4/0/4002092027589_02_ws.jpg",
                "title": "Sneakers XYZ Black",
                "salePrice": {
                    "value": 249.99
                }
            },
            {
                "price": {
                    "value": 316.99
                },
                "brand": "DEF",
                "link": "https://www.example.com/sneakers-def-black.html?snrai_campaign=TtZiwYdJQbuR&snrai_id=139beb5b-672e-4984-80ac-7aba76031a61",
                "itemId": "5906489211270",
                "category": "Women > Sneakers",
                "imageLink": "https://www.example.com/media/product/5/9/5906489211270_01_plj.jpg",
                "title": "Sneakers DEF Black",
                "salePrice": {
                    "value": 316.99
                }
            }
        ],
        "extras": {
            "campaignId": "TtZiwYdJQbuR",
            "contextItems": null,
            "correlationId": "139beb5b-672e-4984-80ac-7aba76031a61",
            "slots": [
                {
                    "id": 0,
                    "itemIds": [
                        "4002092027589",
                        "5906489211270",  
                    ],
                    "name": "Unnamed slot",
                    "rows": null
                }
            ]
        }
    },
    "__publishedAt": "2025-12-10T16:22:38.875747Z"
}
# AI Prediction events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## snr.prediction.score A prediction was completed for a profile. Check the parameters to see the prediction score. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | modelId | string | `bftjpcmdxrku` | Unique ID of the prediction. It is part of the prediction's URL. | | modelName | string | `ltv_prediction` | Name entered when creating the prediction. You can use it to summarize what the prediction does or give the result an identifier that can be used later for another purpose. | | score_label | string | `Very low` | A textual label of the score, on a 2- or 5-point scale depending on the prediction's configuration. | | score | number | `101.297` | The score as a number | | percentile | number | `39` | The [percentile](/glossary/#percentiles) where this score is located among all other scores of the prediction. | | configurationVersion | number | `3` | Allows to verify whether two consecutive calculations ran with the same settings (only for debugging). | | modelVersion | string | `0.285` | Model version allows to verify whether two consecutive calculations ran on the same model parameters (only for debugging). | | featureInfluence | array | | [Local feature importance](/glossary/#feature-importance) | | classes | array of strings | `["0","1"]` | Available classes. Only exists in [classification](/docs/ai-hub/predictions/custom#select-the-model-type) predictions. | | prediction | string | `1` | Predicted class. Only exists in [classification](/docs/ai-hub/predictions/custom#select-the-model-type) predictions. | ## snr.propensity.score A propensity prediction was completed for a profile. Check the parameters to see the prediction score. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | modelId | string | `bftjpcmdxrku` | Unique ID of the prediction. It is part of the prediction's URL. | | modelName | string | `ltv_prediction` | Name entered when creating the prediction. You can use it to summarize what the prediction does or give the result an identifier that can be used later for another purpose. | | score_label | string | `Very low` | A textual label of the score, on a 2- or 5-point scale depending on the prediction's configuration. | | scoreName | string | `ltv_prediction` | Deprecated parameter: custom score name entered when creating the prediction. You can use it to summarize what the prediction does or give the result an identifier that can be used later for another purpose. | | score | number | `101.297` | The score as a number | | percentile | number | `39` | The [percentile](/glossary/#percentiles) where this score is located among all other scores of the prediction. | | configurationVersion | number | `3` | Allows to verify whether two consecutive calculations ran with the same settings (only for debugging). | | modelVersion | string | `0.285` | Model version allows to verify whether two consecutive calculations ran on the same model parameters (only for debugging). | ## snr.bestfit.score A best fit prediction was completed for a profile. Check the parameters to see the prediction result. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | configurationVersion | number | `3` | Allows to verify whether two consecutive calculations ran with the same settings (only for debugging). | | modelId | string | `bftjpcmdxrku` | Unique ID of the prediction. It is part of the prediction's URL. | | modelVersion | string | `0.285` | Model version allows to verify whether two consecutive calculations ran on the same model parameters (only for debugging). | | modelName | string | `ltv_prediction` | Name entered when creating the prediction. You can use it to summarize what the prediction does or give the result an identifier that can be used later for another purpose. | | attribute | string | `brand` | The name of an item attribute which was selected in the configuration of prediction. The value of this attribute is the prediction result. | | topValue | string | `myExampleBrand` | The value of the attribute selected in the prediction configuration - it is the prediction result. | | topScore | number | `101.297` | The score as a number | ## snr.lookalike.score A lookalike prediction was completed for a profile. Check the parameters to see the prediction score. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | modelId | string | `bftjpcmdxrku` | Unique ID of the prediction. It is part of the prediction's URL. | | modelName | string | `ltv_prediction` | Name entered when creating the prediction. You can use it to summarize what the prediction does or give the result an identifier that can be used later for another purpose. | | score_label | string | `Very low` | A textual label of the score, on a 2- or 5-point scale depending on the prediction's configuration. | | scoreName | string | `ltv_prediction` | Deprecated parameter: custom score name entered when creating the prediction. You can use it to summarize what the prediction does or give the result an identifier that can be used later for another purpose. | | score | number | `101.297` | The score as a number | | percentile | number | `39` | The [percentile](/glossary/#percentiles) where this score is located among all other scores of the prediction. | | configurationVersion | number | `3` | Allows to verify whether two consecutive calculations ran with the same settings (only for debugging). | | modelVersion | string | `0.285` | Model version allows to verify whether two consecutive calculations ran on the same model parameters (only for debugging). | ## snr.ate.prediction A time optimizer prediction was made for a profile. Check the parameters to see the result. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | isFallback | boolean | `false` | This parameter can take two values: `true` or `false`. It describes whether there was enough data to make a prediction. If there was not enough data, this parameter takes `true` value. In such case, the system takes the most used time from the distribution of other profiles. | | nextNhours | integer | `12` | This parameter is the value used in the **Custom time period** option. | | expireAt | string | `2022-12-04T19:39:47.398318+00:00` | This parameter contains the result of the prediction: the best date and time proposed by the algorithm given in UTC. | | topN | integer | `1` | This parameter takes numerical values and it informs how many best hour predictions matched the conditions and exclusions. Usually the value is `1`. | | mode | string | `standard` | This parameter returns the name of the [mode](/docs/settings/configuration/time-optimizer#modes) used for calculating the prediction. | | timeIndexExclude | array of arrays of integers | `[[166,167]]` | This parameter returns the days and hours that are excluded from the time proposed by the algorithm. | | predictedHour | number | `163` | This parameter returns the predicted hour in the form of an hour of the week (for example, according to the example in the `expireAt` description, the value for the `predictedHour` parameter is 163 - Sunday, 7 P.M. UTC) | # Imports The Imports feature in Data Modeling Hub allows you to import the following data types to Synerise: - profiles - transactions - events ## Business benefits --- - The possibility to use AI-powered features, prepare recommendations and adjust communication content and content on your website to customer preferences. - Extending the amount of data to gain even broader perspective. - Enlarging your customer database you gain in the external sources. - Importing information about past and current promotions. - Enriching your marketing activities with vouchers. ## Requirements --- - You need user permissions that grants you access to Data Modeling Hub or/and Automation Hub. - The imported files must be smaller than 200 MB. ## Contents # Importing promotions The Imports feature in Data Modeling Hub lets you import promotions to Synerise by: - [using a simple import wizard](/docs/ai-hub/promotions/importing-promotions#importing-in-simple-import-wizard) - This method allows you to upload only a .csv file from your device and map the columns contained in the file with the equivalent parameters in your workspace. **Recommended use**: Single import of `.csv` files. - [Automation Hub](/docs/ai-hub/promotions/importing-promotions#importing-in-automation) - This method allows you to import a file from a server or from your device. The supported file formats include: `.csv`, `.json`, `.jsonl`, and `.xml`. You will be redirected to a workflow template which you can adjust to your business assumptions. The template contains a Data Transformation node that allows you to select transformation rules if the imported data need modification before the import to Synerise to meet Synerise data standards. **Recommended use**: Imports of files stored in external servers (using HTTP and SFTP protocol), periodic imports; You can explore other methods of importing promotions to Synerise in ["Import methods" section](/docs/ai-hub/promotions/importing-promotions#import-methods). # Schema-exclusive API reference After you create a schema, you can download a YAML file that your software developers can use as an API reference for that schema when developing applications that use the schema. The documentation is created according to the OpenAPIv3 (formerly Swagger) standard. ## Downloading the API reference 1. Go to Data Modeling icon **Data Modeling Hub > Schema Builder**. 2. In the list of schemas, locate the schema and click Three dot icon. 3. In the menu that opens, click **Documentation**. 4. Save the file to your machine. # Importing transactions ## Importing transactional data By importing transactions to Synerise, you can [prepare analyses of transactions](/docs/analytics). The output of the import is transaction.charge events generated on the profile cards of customers indicated in the imported file. ### Requirements --- - You need user permissions that grants you access to Simple Imports or/and Automation - Prepare a `.csv` file that contains the data presented in the table below. If you use different names, you will be able to map them to the correct parameters during the import process. - Each row in the CSV represents one product. If an order contains multiple products, include one row per product and use the same `orderId` on each of those rows. The system groups rows by `orderId` and builds a single `transaction.charge` event with a `products` array. - All rows sharing the same `orderId` must be placed consecutively in the file. If rows from the same order are not grouped, the system will generate separate transactions instead of a single one. - Transaction-level fields (such as `revenue`, `value`, `source`) should be repeated identically on every row belonging to the same order. | Column | Required? | Description | |--------|----------|-------------| | `client` | Yes | Profile identifier. Accepted values: `email`, `uuid`, `clientId`, or `customId`. If using email, ensure the correct email format — an invalid format will cause the import to fail. | | `orderId` | Yes | ID of the transaction. Sending multiple transactions with the same `orderId` generates multiple events; use `eventSalt` if you need to overwrite a transaction instead. | | `paymentInfo.method` | Yes | How the transaction was paid (for example, `CASH`, `ONLINE`). | | `products.finalUnitPrice.amount` | Yes | Final unit price of the item. | | `products.finalUnitPrice.currency` | Yes | Currency of the final unit price (for example, `USD`, `EUR`). All monetary values in a transaction must use the same currency and be greater than or equal to zero. | | `products.quantity` | Yes | Number or quantity of purchased items. | | `products.sku` | Yes | SKU of the purchased item. | | `revenue.amount` | Yes | Transaction revenue **after taxation**. Not calculated automatically — you must provide this value by summing `finalUnitPrice × quantity` for all items in the transaction. | | `revenue.currency` | Yes | Currency of the transaction revenue. | | `value.amount` | Yes | Transaction amount **before taxation**. If you only have the post-tax price, set this to the same value as `revenue.amount`. | | `value.currency` | Yes | Currency of the transaction value before taxation. | | `source` | Yes | Source of the transaction. Accepted values: `POS`, `WEB_MOBILE`, `WEB_DESKTOP`, `MOBILE_APP`, `MOBILE`, `DESKTOP`. | | `recordedAt` | No | Date and time of the transaction. If omitted, the import date is used. See the `recordedAt` note below for accepted formats. | | `discountAmount.amount` | No | Discount applied to the total transaction cost. Must be greater than zero if provided. | | `discountAmount.currency` | No | Currency of the discount amount. | | `eventSalt` | No | Unique identifier that enables a transaction to be overwritten. If you send a new transaction with the same `eventSalt`, `recordedAt`, and profile, it overwrites the original. Must be unique within a workspace. Cannot be added to a transaction after the fact. | | `metadata.*` | No | Any custom transaction parameters, passed as nested columns (for example, `metadata.promotionCode`). To enable automatic redemption of `promotionCode` and `quantityToRedeem`, contact Synerise support. | | `products.name` | No | Name of the purchased item. | | `products.categories` | No | Categories of the item. | | `products.image` | No | URL of the item image. | | `products.url` | No | URL of the item page. | | `products.netUnitPrice.amount` | No | Net unit price of the item. | | `products.netUnitPrice.currency` | No | Currency of the net unit price. | | `products.tax` | No | Tax rate applied to the item. | | `products.regularPrice.amount` | No | Regular (non-discounted) price of the item. | | `products.regularPrice.currency` | No | Currency of the regular price. | | `products.discountPrice.amount` | No | Discounted price of the item. | | `products.discountPrice.currency` | No | Currency of the discounted price. | | `products.discountPercent` | No | Discount percentage applied to the item. | For the full list of accepted values and formats, see the [API reference](https://hub.synerise.com/api-reference/data-management#tag/Events/operation/BatchAddOrUpdateTransactions). - File requirements: - Spaces and special characters in the column headers are not allowed. - `.csv` files must be UTF-8 encoded. - If you don't have a value for an optional field, **omit the column entirely** rather than leaving the cell empty or setting it to `null`. - For numeric or composite fields (for example, `discountAmount.amount`, `discountAmount.currency`), leaving the cell empty while the column is present causes the entire row to fail import. - For custom attributes (for example, `metadata.*`), leaving the cell empty while the column is present clears any existing value for that attribute, the same as sending `null`. For Synerise-native attributes, sending `null` resets the attribute to its default value. - If only some rows in your file need a value for an optional field, split them into separate import files: one where the column is fully populated, and one where the column is omitted entirely. - Maximum file size: 200 MB. - To add the original dates for transactions, include the `recordedAt` parameter in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format, otherwise, the transaction will be added with the date of the import. The following formats are supported: - UTC time with a `Z` suffix (for example, `2025-10-01T12:02:06Z`) - Time with a timezone offset (for example, `2025-10-01T14:02:06+02:00` for UTC+2 or `2025-10-01T04:02:06-08:00` for UTC-8). All times are converted to UTC when saved in the database.
If you send a transaction with a future timestamp, the timestamp is rejected and replaced with the time of import.
More information about time formats for the `recordedAt` parameter can be found in the ["Create a transaction" method](https://hub.synerise.com/api-reference/data-management#tag/Events/operation/CreateATransaction).
#### Tips for preparing a CSV file - Recommended file metacharacters: - A character that splits columns (delimiter): `,` - A character that is used to contain the text (quotation mark): `"` - A character (escape character) that changes the default interpretation of a sign or string followed by the escape character: `/` - For more details about parameters and their accepted formats, click [here](https://hub.synerise.com/api-reference/data-management#operation/CreateATransaction). ### Procedure --- #### Selecting the file for import In this part of the process, you will upload a file from your device. 1. Go to Data Modeling Hub icon **Data Modeling Hub > Imports > New import**. 2. As the data type for import, select **Transactions**. 3. As the import method, select one of the following options: - Import a local file - To import a single `.csv` file to Synerise. - Import in Automation - To import a .`csv`, `.json`, `.jsonl`, and `.xml` files and execute periodical imports.
1. Upload the `.csv` file by using the **+ Upload file or drop one here** field. 2. Optionally, you can customize the file metacharacters by clicking the arrow down icon. 1. From the **Delimiter** dropdown, select the character that marks the end of a column. 2. From the **Quotation mark** dropdown list, select the characters that contain the text or data type. 3. From the **Escape character** dropdown lists, select the character which changes the default interpretation of a character or a string followed by the escape character. 3. To proceed to the next step, click the **Next** button. #### Mapping the columns with parameters in Synerise In this part of the process, you will connect the columns from the file with their counterparts (the existing parameters) in Synerise. This way, you will point which parameters in Synerise will contain the event information from the imported file. During mapping, you can: - exclude parameters from the import. - create new event parameters in Synerise to map the data in the input file to them. Note that all custom parameters will be imported as additional transaction parameters. Remember that you can't add new columns to the imported file while mapping. 1. Next to the file column name, from the dropdown list, select the corresponding parameter in Synerise. Perform this step for all columns in your file. 2. To exclude a parameter from import, next to the column name, click this icon: An arrow icon **Result**: The icon changes to Don't import icon 4. To proceed to the summary of the import, click **Next**. #### Counting revenue In this part of the process, optionally, you can enable automatic calculation of the revenue which is the multiplication of the item quantity by its price. 1. Enable the **Calculate revenue** option. 2. In the **Product unit price** field, from the dropdown list select the name of the column that contains the price of a single piece of an item. 3. Confirm by clicking **Next**. **Result**: The summary of the import is displayed. 5. After checking the import summary, to start the import, click **Run import**. **Result**: The output of the import is `transaction.charge` events generated on the profile cards of customers indicated in the imported file. #### Launching import After steps described above you'll be redirected to the mapping summary. If it's correct, to launch the import, click **Run import**.
1. Select the method of delivering the file: - Local File - This option allows you to upload a file from your device. - SFTP protocol - This option allows you to upload a file from a server using the SFTP protocol. - HTTPS protocol - This option allows you to upload a file from a server using the HTTPS protocol. - Amazon S3 - This option allows you to upload a file from Amazon S3 bucket. - Azure - This option allows you to upload a file from Azure Blob Storage. - Google Cloud Storage - This option allows you to upload a file from Google Cloud Storage. 2. Click **Go to import template**. 3. Define the settings of the [Scheduled Run node](/docs/automation/triggers/scheduled-run). 4. Depending on the method of delivering the file, configure the settings of [Local File](/docs/automation/integration/http-integrations/http-get-file) or the [Get File](/docs/automation/integration/http-integrations/http-get-file) node that uses HTTP protocol or the [Get File](/docs/automation/integration/sftp-integrations/sftp-get-file) node that uses SFTP protocol. 5. If the data requires modification, configure the settings of the [Data Transformation node](/docs/automation/operation/data-transformation-node). If you have prepared the transformation rules for the data structure of the imported file, select it from the dropdown list. If not, create it from scratch. You can remove this node if your data doesn't require transformation. 6. The rest of the nodes in the default template don't require any further configuration. 7. If your workflow is ready, click **Save & Run**.
# API reference The API reference for Brickworks is available at [https://hub.synerise.com/api-reference](https://hub.synerise.com/api-reference/brickworks). It includes endpoints for managing schemas, records, record versions, and content generation.
To learn the basics of generating content from records, see [Generating objects](/docs/assets/brickworks/generating-objects).
# Limits and constraints To provide high performance, data integrity, and predictable behavior, the following limits and constraints apply: | Limit | Value | Description | | -------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Maximum number of simple + managed schemas per workspace | 10 | You can create up to 10 schemas per workspace, regardless of whether they are simple or versioned. This limit applies universally. | | Maximum number of singleton schemas per workspace | 200 | This limit is separate from the limit above. | | Maximum number of records for a managed schema | 10,000 | You can add up to 10,000 records to a managed schema. | | Nesting depth of one-to-many relation | 2-level deep | Only one level of nesting (2 levels deep) is supported. | | Size of fetched records for one-to-many relation | 50 | In one-to-many relations, a maximum of 50 records is fetched. | | Enabling value uniqueness and searching for a schema field | Only for primitive field types | Only for the following field types, you can enable **Enable search & filtering** and **Unique values only** options: string, boolean, number. | | Maximum number of searchable fields per schema | 10 | Up to 10 top-level primitive fields—fields with basic data types like string, number, or boolean that are defined directly within the main schema and not nested inside objects or arrays—can have the Enable search & filtering option enabled. | | Maximum unique fields per schema | 5 | A schema can have up to 5 top-level primitive fields—those not nested within objects or arrays and directly defined in the main schema—marked as unique. | | Available HTTP methods for creating a connection to an external source | `GET` and `POST` | You can connect to the external sources using only `GET` or `POST` methods. | | Authentication method for external source connections | API key; login and password; SHA256-based authentication | While creating an external source, you can authenticate only with the API key of the external source, login and password, or SHA256 (recommended for authenticating with Eagle Eye) | | Profile data cache TTL | 60 seconds | After generating an object from a record, profile data is cached. The cache is used for subsequent requests even if the profile was updated | | Maximum string length | 32768 | The maximum number of characters for the value of a [String](/docs/assets/brickworks/schema-field-types#string) or [Jinjava code](/docs/assets/brickworks/schema-field-types#jinjava-code) field. This limit applies to default values in the schema and values in records. For Jinjava code fields, this limit does not apply to the generated output. | | [External source](/docs/assets/brickworks/creating-external-source) response cache TTL | Configured per External Source | After generating an object from a record, responses from external sources are cached. The cache is used when the external source, headers, query parameters, and request are the same in subsequent requests. | | Audience validation for referenced schemas | Top-level schema only | During the **generate** operation, the audience is validated only for the top-level schema. If the schema contains references to other schemas, the audience defined in those referenced schemas is not validated. | | Maximum number of [response transformers](/docs/assets/brickworks/response-transformers) per schema | 20 | Each schema has its own list of response transformers. | | Maximum number of [response transformer](/docs/assets/brickworks/response-transformers) versions | 20 | You can access up to 20 previous versions of a transformer. | | Maximum length of [transformation script](/docs/assets/brickworks/response-transformers) | 32 768 characters | - | # AI Search events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## item.search AI search returned response to a search request. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | totalResults | number | `45` | The number of results returned by the search. | | query | string | `shoes` | The query string that was searched. | | personalized | boolean | `true` | Informs if the search was personalized by the AI. | | total | number | `45` | The number of results returned by the search. | | filters | array of objects | `[{"name": "deleted","value": "!= 1"}]` | Filters that were used in the search | | correlationId | string | `ef3f2774b3c14ff3fb3c892c4da2d4ae` | Correlation ID for pagination. | | index | string | `afc98c53b968b4c47ff1e21e7219d4f41668083405` | ID of the search index that was used. | | appliedRules | array of numbers | `[435,234]` | Query rules that were applied to the search | | searchType | string | `full-text-search` | The search type | | Additional parameters | any | `lorem ipsum` | Additional parameters that were added to the search request, in the `params` parameter. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## item.search.classification AI search returned response to a search request using [predictive filtering](/docs/ai-hub/ai-search/predictive-filtering). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | chosenCategories | object | `[{"score": 275,"reliabilityLevel":"VeryHigh","ctr": "0.9581881533101045","actions": ["staticFilter","elasticFilter","boosting"],"category":"boots"}]` | The list of categories returned by predictive filtering with: the score, average CTR for all categories, reliability level, filter options; | | categories[reliabilityLevel] | object | `["boots"]` |An array of predicted categories at a specific reliability level (low, medium, high, very high, certain) | | query | string | `shoes` | The query string that was searched. | | index | string | `afc98c53b968b4c47ff1e21e7219d4f41668083405` | ID of the search index that was used. | | correlationId | string | `43cc2e3f-df11-4c78-abe1-4d0710abba3f` | Correlation ID is used to associate events that are the result of the same request, for example to link a recommendation frame with a recommendation.click event, a search request with an item.search.click event, or a user's conversational turn with the corresponding assistant.click event. | ## item.search.click An item was clicked in an AI search result. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | item | string | `16874` | ID of the clicked item. Must be the same as the item's `itemId` in the item feed and `sku` in transaction events. | | correlationId | string | `43cc2e3f-df11-4c78-abe1-4d0710abba3f` | Correlation ID is used to associate events that are the result of the same request, for example to link a recommendation frame with a recommendation.click event, a search request with an item.search.click event, or a user's conversational turn with the corresponding assistant.click event. | | position | integer | `2` | Position of the clicked item in the search results | | searchType | string | `full-text-search` | The search type | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## suggestion.search A request to a suggestion index has been sent. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | totalResults | number | `45` | The number of returned suggestions | | searchType | string | `full-text-search` | The search type | | query | string | `shoes` | The query string that was searched. | | total | number | `45` | The number of returned suggestions | | index | string | `bcd98c53b968b4c47ff1e21e7219d4f41668083679` | ID of the suggestion index that was used. | | correlationId | string | `ef3f2774b3c14ff3fb3c892c4da2d4ae` | Correlation ID for pagination. | ## suggestion.search.click An item from a suggestion was clicked in an AI search result. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | searchType | string | `full-text-search` | The search type | | position | integer | `2` | Position of the clicked suggestion in the search results | | correlationId | string | `ef3f2774b3c14ff3fb3c892c4da2d4ae` | Correlation ID for pagination. | ## variant.assign Event generated as a result of assigning a customer to a variant of an A/B/X test of a recommendation, AI Search, or dynamic content (for variant optimizer feature driven by AI engine). **Default retention** 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | experimentId | integer | `930` | ID of the A/B test | | variantId | integer | `2484` | ID of the variant for A/B test | | variantName | string | `FV5PIcmhmN0p` | ID of the recommendation campaign assigned to the test variant | # Profile events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## client.add A profile was added to the database. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | The event doesn't include information about profile data such as email address or custom parameters that were sent when creating the profile. ## client.identify A profile was updated or created with information that changed its status to "recognized". By default, this happens when an email address is provided. **Default retention**: 30 days **Recommended retention**: infinite The retention of this event affects the ability to debug profiles. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | email | string | `example@synerise.com` | Email address of the profile | ## client.register A profile was registered successfully. This event is only generated for Registration-as-a-Service. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | firstname | string | `John` | First name of the profile | | firstname | string | `Doe` | Last name of the profile | | applicationName | string | `testApp` | Name of the application where the profile registered | | email | string | `example@synerise.com` | Email address of the profile | | firstname | string | `Little teapot` | Custom identifier of the profile | ## client.updateData A profile's data was updated. Legacy event, available as [profile.updated](#profileupdated) in analytics. Includes the same data as profile.updated. **Default retention**: 30 days ## profile.updated A profile was updated. **Default retention**: 90 days **Retention guidelines:** Lowering the retention of this event affects: - In Automations and Communication: filters based on recent profile updates. - In debugging: - Investigating marketing agreement and attribute updates. - Investigating what forms were submitted and which data they changed. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | profile. | depends on attribute | `Joe` | Each attribute changed or added in the operation that created this event is saved as a `profile.` parameter. The value of the parameter is the new value of the profile attribute. For example, if the `city` attribute changed in the profile, the name of the event parameter with the new value is `profile.city`. ## client.addTag A tag was assigned to a profile. **Default retention**: 30 days **Recommended retention**: infinite The retention of this event affects analytics (such as client base growth) and troubleshooting (tracking how the profile was created). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | integer | `1856` | Unique ID of the tag | | name | string | `clubmember` | Name of the tag | ## client.removeTag A tag was removed from a profile. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | integer | `1856` | Unique ID of the tag | | name | string | `clubmember` | Name of the tag | ## client.merge Two or more profiles were merged into one. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | previouscustomers | array of objects | `[{"anonymousType":"CUSTOM_ID","email":"default_unique_a95d2fc9-9b94-4d1c-a272-a94760f622a3@anonymous.invalid","id":5290506224},{"anonymousType":"NONE","email":"littleteapot@example.com","id":5290506228}]` | Information about the profiles that were merged into this profile | ## profile.MembershipAttributeUpdated A [membership attribute](/docs/settings/workspace/multibrand-workspaces/sharing-segmentation-results#generated-events-and-attributes) has been created or updated. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | valueSet | boolean | `true` | The membership status value:
- `true`: a profile joined the segmentation;
- `false`: a profile left the segmentation. | | groupId | string | `f3019938-22fa-41a8-91bd-2ccdege60e34` | The unique identifier of the [workspace group](/docs/settings/workspace/multibrand-workspaces/create-workspace-group) for which the segmentation export is configured (on the organization level). | | group | string | `Multribrand group name` | The name of the [workspace group](/docs/settings/workspace/multibrand-workspaces/create-workspace-group) for which the segmentation export is configured (on the organization level). | | segmentationId | string | `2e57b401-a7b9-401b-8cae-49f4fc8a0242` | The unique identifier of the segmentation. | | attributeName | string | `Workspace name_mbr_segmentation_loyal_2e57b401-a7b9-401b-8cae-49f4fc8a0242` | The name of the [membership attribute](/docs/crm/customer-properties#managing-membership-attributes) that was updated as a result of the membership change. | | processId | string | `a08bedc5-4aa3-53b5-85d2-0f1b2299d676` | The ID of the primary organization-level process responsible for managing segmentation assignments. | | jobId | string | `d757b0d8-d649-4099-a3fb-6709f82d5c27` | The unique identifier of the materialization job execution. | | source | string | `internal` | Indicates the segmentation origin:
- `internal`: from the current workspace;
- `external`: from a different workspace. | # Transactions, cart, and favorites events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## transaction.charge A transaction was completed. This event is the summary of the transaction. Additionally, `product.buy` events are generated automatically for each item in the transaction. **Default retention**: infinite **Recommended retention**: infinite **Retention guidelines:** Lowering the retention of this event affects the quality of AI recommendation models. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | $totalAmount | number | `300.00` | Total value of the purchased items. Equal to the `value` parameter from the [transaction event request](https://hub.synerise.com/api-reference/data-management#operation/CreateATransaction). | | $revenue | number | `400.00` | Total value of the purchased items, with taxes and discounts. Equal to the `revenue` parameter of the [transaction event request](https://hub.synerise.com/api-reference/data-management#operation/CreateATransaction). | | $paymentType | object | `{"method":"CASH"}` | Transaction's payment method | | $currency | string | `USD` | Currency of the payment | | products | array of objects | `[{"$sku":"nui43ry89","$quantity":"1.0","$finalUnitPrice":"12.00","$name":"Soft drink","$currency":"PLN"}]` | An array of products in the transaction | | $orderID | string | `13045a77-5230-481f-8f10-50d867c8d930` | Unique ID of the transaction | | productEventsUUIDs | array of strings | `["d83fdb62-6273-3b7f-a52d-fd079098ba4f","14b4c1bf-ecc2-464d-81b6-978e2997a79b"]` | UUIDs of [product.buy](#productbuy) events generated by this transaction. | offline | integer or boolean | `true` | If the event was generated by an offline point of sales, this parameter is `true` or `1`, otherwise `false` or `0`. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | | snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of the page's URL. They are added to this event only if the event was generated by the `dataLayer.push` function in the JS SDK. | ## product.buy This event generated for each item in a transaction. If multiple copies of the item were bought, they are summarized in a single `product.buy` event. **Default retention**: infinite | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | sku | string | `nui43ry89` | Unique identifier of the item | | $finalUnitPrice | string | `12.00` | Final price of a single unit of the item, including tax and discounts | | $orderID | string | `13045a77-5230-481f-8f10-50d867c8d930` | Unique ID of the transaction | | $quantity | string | `1.5` | Quantity of the item | | $name | string | `Soft drink` | Name of the item | | $currency | string | `USD` | Currency of the payment | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | | snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of the page's URL. They are added to this event only if the event was generated by the `dataLayer.push` function in the JS SDK. | ## transaction.cancel A transaction was cancelled and funds need to be returned. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | ## product.addToCart A customer added an item to their cart. **Default retention**: infinite **Retention guidelines:** Lowering the retention of this event affects: - Analyses of cart interactions, potential revenue from carts, reporting - Automations based on cart interactions | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | $currency | string | `USD` | Currency of the payment | | sku | string | `nui43ry89` | Unique identifier of the item | | $name | string | `Soft drink` | Name of the item | | $quantity | string | `1.5` | Quantity of the item | | $finalUnitPrice | string | `12.00` | Final price of a single unit of the item, including tax and discounts | | offline | integer or boolean | `true` | If the event was generated by an offline point of sales, this parameter is `true` or `1`, otherwise `false` or `0`. | | producer | string | `Sneaky Sneakers` | Brand of the item | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | | snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of the page's URL. They are added to this event only if the event was generated by the `dataLayer.push` function in the JS SDK. | ## product.removeFromCart A customer removed an item from their cart. **Default retention**: infinite **Retention guidelines:** Lowering the retention of this event affects: - Analyses of cart interactions, potential revenue from carts, reporting - Automations based on cart interactions | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | $currency | string | `USD` | Currency of the payment | | sku | string | `nui43ry89` | Unique identifier of the item | | $name | string | `Soft drink` | Name of the item | | $finalUnitPrice | string | `12.00` | Final price of a single unit of the item, including tax and discounts | | offline | integer or boolean | `true` | If the event was generated by an offline point of sales, this parameter is `true` or `1`, otherwise `false` or `0`. | | producer | string | `Sneaky Sneakers` | Brand of the item | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | | snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of the page's URL. They are added to this event only if the event was generated by the `dataLayer.push` function in the JS SDK. | ## cart.status A summary of the cart's current contents. This event is not generated by default. See [Tracking cart status](/developers/web/cart) for instructions on implementing it. **Default retention**: 30 days **Retention guidelines:** Lowering the retention of this event affects: - Analyses of cart interactions, potential revenue from carts, reporting - Automations based on cart interactions | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | sku | string | `nui43ry89` | Unique identifier of the item | | products | array | `[{"sku":"236"."quantity":1},{"sku":"436"."quantity":4}]` | A list of items in the cart | | $totalAmount | number | `300.00` | Total value of the purchased items. Equal to the `value` parameter from the [transaction event request](https://hub.synerise.com/api-reference/data-management#operation/CreateATransaction). | | itemIds | array | `["236","436"]` | An array of item IDs that can be used in analytics and recommendations without extracting them from the `products` array. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## product.addToFavorite A user added an item to favorites. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | sku | string | `nui43ry89` | Unique identifier of the item | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## product.removeFromFavorite A user removed an item from favorites. This event can be tracked as a custom event. No parameters are required.
In some integrations, the event is called 'product.removeFromFavo**U**rite' (`favourite` as spelled in British English).
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | ## product.addReview This event is generated as a result of integrating Synerise with VTEX IO and Sylius. It is generated when a logged-in customer submits a product review.
If VTEX allows synchronizing reviews from anonymous customers, no events will be generated in Synerise due to the lack of customer identifiers needed to match reviews with customers.
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | |rating|number|`5`| Reviewer's rating | |nickname|string|`JohnDoe`| Reviewer's name | |productId|string|`1`|The ID of a reviewed product | |sku|string|`2`|The ID of SKU| |title|string|`Great product`|Review's title| |detail|string|`I love it!`|Review's text | |locale|string|`en-US`|Reviewer's locale| |verifiedPurchaser|boolean|`true`| Indicates if the reviewer is a verified purchaser (`true`) or not (`false`).| |approved|boolean|`true`|Indicates if the review was approved (`true`) or not (`false`).| # Loyalty events ## points.loyalty A profile’s loyalty point number increased. This event includes the parameters of the [`transaction.charge` event](/docs/assets/events/event-reference/items#transactioncharge) which generated the points. **Default retention**: 30 days **Recommended retention**: infinite | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | points | string | `52` | The number of assigned points | | $orderID | string | `13045a77-5230-481f-8f10-50d867c8d930` | Unique ID of the transaction | ## client.removePoints A profile's loyalty points were decreased. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | promotionCode | string | `0000080596` | Code of the promotion | | promotionName | string | `Free fries` | Display name of the promotion | | promotionUuid | string | `7810c17f-9e77-4053-a291-1db9d1d486f8` | UUID of the promotion | | points | integer | `1000` | Total number of removed points | | singleValue | integer | `500` | Points removed for one redemption | | value | integer | `1000` | Total number of removed points | | quantity | number | `2` | The number of times a promotion was redeemed | | date | integer | `1679512628953` | Unix timestamp of the event | | beneficiaryClientUuid | string | `81ac2d89-a488-4106-94cf-9a1d45e66e87` | UUID of the end-user who redeemed the voucher code from a promotion
Useful when [the **Allow voucher transfer** option in a promotion configuration is enabled](/docs/ai-hub/promotions/creating-promotions#add-voucher-codes). | ## points.sent Loyalty points were sent to a different profile. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | points | integer | `200` | The amount of transferred points | | recipient | string | `Bob` | The name of the recipient, provided by the sender | | recipientClientId | integer | `54689894` | The profile ID of the recipient | | message | string | `Have a snack` | Message added to the transfer, provided by the sender | | lockIdentifier | string | `d2307965-2aba-43d3-889f-cc362a1c9d07.1681561293278` | Identifier of the point lock which will be released once the points are transferred | ## points.received Loyalty points were received from a different profile. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | points | integer | `200` | The amount of transferred points | | sender | string | `Mike` | The name of the sender, provided by the sender | | senderClientId | integer | `54688644` | The profile ID of the sender | | message | string | `Have a snack` | Message added to the transfer, provided by the sender | ## client.activatePromotion This event is generated when a [mobile SDK](/developers/mobile-sdk/loyalty#working-with-single-promotions) or [API](https://hub.synerise.com/api-reference/loyalty-and-engagement#tag/Promotions) method activates a promotion. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | promotionCode | string | `0000080596` | Code of the promotion | | promotionUuid | string | `7810c17f-9e77-4053-a291-1db9d1d486f8` | UUID of the promotion | | promotionName | string | `Free fries` | Display name of the promotion | | promotionType | string | `GENERAL` | Promotion type | | promotionDiscountType | string | `AMOUNT` | Type of the discount | | promotionRedeemQuantityPerActivation | integer | `3` | How many times per activation a multibuy promotion can be redeemed. `0` means no limit. | | promotionRequireRedeemedPoints | integer | `10` | How many loyalty points are needed to activate the promotion | | lastingAt | string | `2023-08-24T14:15:22Z` | Time when promotion expires for the profile. If the promotion doesn't expire, the value is `null`. | | date | integer | `1694777235525` | Time when the event occurred (Unix timestamp) | ## client.deactivatePromotion This event is generated when a [mobile SDK](/developers/mobile-sdk/loyalty#working-with-single-promotions) or [API](https://hub.synerise.com/api-reference/loyalty-and-engagement#tag/Promotions) method deactivates a promotion. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | promotionCode | string | `0000080596` | Code of the promotion | | promotionUuid | string | `7810c17f-9e77-4053-a291-1db9d1d486f8` | UUID of the promotion | | promotionName | string | `Free fries` | Display name of the promotion | | promotionType | string | `GENERAL` | Promotion type | | promotionDiscountType | string | `AMOUNT` | Type of the discount | | promotionRedeemQuantityPerActivation | integer | `3` | How many times per activation a multibuy promotion can be redeemed. `0` means no limit. | | promotionRequireRedeemedPoints | integer | `10` | How many loyalty points are needed to activate the promotion | | lastingAt | string | `2023-08-24T14:15:22Z` | Time when promotion expires for the profile. If the promotion doesn't expire, the value is `null`. | | date | integer | `1694777235525` | Time when the event occurred (Unix timestamp) | ## client.promotionExpire A promotion expired for a profile (according to the `lastingAt` parameter). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | promotionCode | string | `0000080596` | Code of the promotion | | promotionUuid | string | `7810c17f-9e77-4053-a291-1db9d1d486f8` | UUID of the promotion | | promotionName | string | `Free fries` | Display name of the promotion | | promotionType | string | `GENERAL` | Promotion type | | currentRedeemedQuantity | integer | `6` | The number of times this promotion was redeemed by the profile. | | promotionDiscountType | string | `AMOUNT` | Type of the discount | | promotionRequireRedeemedPoints | integer | `10` | How many loyalty points are needed to activate the promotion | | promotionRedeemQuantityPerActivation | integer | `3` | How many times per activation a multibuy promotion can be redeemed. `0` means no limit. | | date | integer | `1694777235525` | Time when the event occurred (Unix timestamp) | ## client.promotionRequest This event is generated for each request made to [`/v4/promotions/promotion/get-for-client-by-custom-settings/{identifierType}/{identifierValue}`](https://hub.synerise.com/api-reference/loyalty-and-engagement#operation/GetClientPromotionsByACustomFilter). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | promotions | array of strings | `["1234","5678"]` | A list of promotions (promotion codes) that were returned in the response. | | date | integer | `1694777235525` | Time when the event occurred (Unix timestamp) | ## client.promotionActivationLimitReached This event is generated when a [mobile SDK](/developers/mobile-sdk/loyalty#working-with-single-promotions) or [API](https://hub.synerise.com/api-reference/loyalty-and-engagement#tag/Promotions) method is used to try activating a promotion that reached its global limit. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | promotionCode | string | `0000080596` | Code of the promotion | | promotionUuid | string | `7810c17f-9e77-4053-a291-1db9d1d486f8` | UUID of the promotion | | promotionName | string | `Free fries` | Display name of the promotion | | promotionType | string | `GENERAL` | Promotion type | | promotionDiscountType | string | `AMOUNT` | Type of the discount | | promotionRedeemQuantityPerActivation | integer | `3` | How many times per activation a multibuy promotion can be redeemed. `0` means no limit. | | promotionRequireRedeemedPoints | integer | `10` | How many loyalty points are needed to activate the promotion | | activationLimitGlobal | integer | `100` | How many times the promotion can be activated, regardless of individual usage per profile. | | lastingAt | string | `2023-08-24T14:15:22Z` | Time when promotion expires for the profile. If the promotion doesn't expire, the value is `null`. | | date | integer | `1694777235525` | Time when the event occurred (Unix timestamp) | ## handbill.assign Promotions from a personalized promotion were assigned to a profile. - If the same personalized promotion is requested multiple again before the generated promotion set expires, the event isn't generated. - If the same personalized promotion is requested again after the expiration and a new promotion set is generated, a new event is generated too. **Default retention**: 30 days
Some parameters in the table apply only to certain personalized promotion types and configurations.
| Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | date | integer | `1694777235525` | Time when the event occurred (Unix timestamp) | | lastingAt | string | `2023-08-24T14:15:22Z` | Time when promotion expires for the profile. If the promotion doesn't expire, the value is `null`. | ## voucherCode.assigned A [voucher](/docs/assets/code-pools) was assigned to a profile. **Default retention**: 30 days
Sources of this event
| Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | poolUUID | string | `add2c522-2ee5-4438-9e3e-153fb0b1f28c` | Unique identifier of the voucher pool | | poolName | string | `Example promo vouchers` | Name of the voucher pool | | voucherUUID | string | `8fed24da-a32b-487d-b5af-78781f4e4cd9` | Unique identifier of the voucher | | voucherCode | string | `14EDA294` | Code of the voucher | | expireIn | integer | `1700917039` | Date when the voucher expires (Unix timestamp in seconds). If the voucher never expires, the value is null. | | assignedAt | integer | `1698242239` | Date of assigning the voucher (Unix timestamp in seconds) | ## voucherCode.redeemed A [voucher](/docs/assets/code-pools) was redeemed. **Default retention**: 30 days
Sources of this event

`/v4/vouchers/item/redeem` API method
NOTE: API methods can also be called by SDKs and outgoing integrations.

| Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | poolUUID | string | `add2c522-2ee5-4438-9e3e-153fb0b1f28c` | Unique identifier of the voucher pool | | poolName | string | `Example promo vouchers` | Name of the voucher pool | | voucherUUID | string | `8fed24da-a32b-487d-b5af-78781f4e4cd9` | Unique identifier of the voucher | | voucherCode | string | `14EDA294` | Code of the voucher | | redeemedAt | integer | `1700139439` | Date of redeeming the voucher (Unix timestamp in seconds) | # Importing vouchers Vouchers are the perfect solution if you plan, for example, to distribute unique discount codes. Thanks to Synerise's capabilities in the area of communication, you can distribute your vouchers through SMS, email, web push and mobile communication, but also directly on your webpage. ## Requirements --- - You need user permissions that grants you access to Simple Imports or/and Automation - [Create voucher pool](/docs/assets/code-pools) - Prepare a file that contains the column (`code`) with the voucher codes.
- Values in the `code` column must be unique across the whole workspace and all voucher pools within it, and be limited to 36 characters. - The maximum file size is 200 MB
### File requirements - Recommended file metacharacters: - A character that splits columns (delimiter): `,` - A character that is used to contain the text (quotation mark): `"` - A character (escape character) that changes the default interpretation of a sign or string followed by the escape character: `\` - Spaces and special characters in the column headers are not allowed. - `.csv` files must be UTF-8 encoded ## Procedure --- ### Selecting the file for import In this part of the process, you will upload a file from your device. 1. Go to Data Modeling Hub icon **Data Modeling Hub > Imports > New import**. 2. As the data type for import, select **Voucher pool**. 3. As the import method, select one of the following options: - Import a local file - To import a single `.csv` file to Synerise. - Import in Automation - To import a .`csv`, `.json`, `.jsonl`, and `.xml` files and execute periodical imports.
1. Upload the `.csv` file by using the **+ Upload file or drop one here** field. 2. Optionally, you can customize the file metacharacters by clicking the arrow down icon. 1. From the **Delimiter** dropdown, select the character that marks the end of a column. 2. From the **Quotation mark** dropdown list, select the characters that contain the text or data type. 3. From the **Escape character** dropdown lists, select the character which changes the default interpretation of a character or a string followed by the escape character. 3. To proceed to the next step, click the **Next** button. ### Selecting voucher pool Select the voucher pool to which you want to import your data. If you selected the Import option on the interface of a specific voucher pool (**Data Modeling Hub > Voucher pools**), the voucher pool will be selected automatically.
Selection of an existing voucher pool
Selection of an existing voucher pool
### Selecting column with codes You can import only codes into the voucher pool. Your file must contain a column with the codes. However, if your file contains more than one column, at this stage you must indicate which column contains the codes. The remaining columns will not be imported.
Selection of the column containing the codes
Selection of the column containing the codes
### Launching import After selecting the column that contains a code, you will be redirected to the mapping summary. If it's correct, to launch the import, click **Run import**.
1. Select the method of delivering the file: - Local File - This option allows you to upload a file from your device. - SFTP protocol - This option allows you to upload a file from a server using the SFTP protocol. - HTTPS protocol - This option allows you to upload a file from a server using the HTTPS protocol. - Amazon S3 - This option allows you to upload a file from Amazon S3 bucket. - Azure - This option allows you to upload a file from Azure Blob Storage. - Google Cloud Storage - This option allows you to upload a file from Google Cloud Storage. 2. Click **Go to import template**. 3. Define the settings of the [Scheduled Run node](/docs/automation/triggers/scheduled-run). 4. Depending on the method of delivering the file, configure the settings of [Local File](/docs/automation/integration/http-integrations/http-get-file) or the [Get File](/docs/automation/integration/http-integrations/http-get-file) node that uses HTTP protocol or the [Get File](/docs/automation/integration/sftp-integrations/sftp-get-file) node that uses SFTP protocol. 5. If the data requires modification, configure the settings of the [Data Transformation node](/docs/automation/operation/data-transformation-node). If you have prepared the transformation rules for the data structure of the imported file, select it from the dropdown list. If not, create it from scratch. You can remove this node if your data doesn't require transformation. 6. The rest of the nodes in the default template don't require any further configuration. 7. If your workflow is ready, click **Save & Run**.
# Automation events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
The events generated by the response to requests to external services through the [Integration nodes](/docs/automation/integration) are available in [Integration events](/docs/assets/events/event-reference/integration). ## attachment.expired An attachment has expired and cannot be used in the **Send Email** node as a dynamic attachment. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | |params |array of objects|`"params": [{"mimeType": "text/csv","id": "ad7e1e7e-16bb-476b-805d-767159619c9c","minioBucketName": "3d2bbac6f7eacc33da9c9f4299c3154c49965926","filename": "Policy certificate","extension": "csv","path": "/113ad6144463ea34ff9b778e544464b4bb5644bf/ea3d2fe6-13ed-412a-9a0d-1470f447890c","size": 48}]`| An array of file parameters | ## attachment.failed An upload of an attachment failed and the file cannot be used in the **Send email** node as a dynamic attachment. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | |params |array of objects|`"errors": [{"source": null,"timestamp": "2023-07-31T09:24:13.093001074Z","field": "mimetype/extension","errors": [],"help": null,"errorCode": "UPL-001","httpStatus": 400,"details": {"filename": "Policy certificate","mimetype": "ghj/csv","extension": "csv"},"message": "Wrong mime type or extension","traceId": "7451773f1a4468d6"}]`| An array of file parameters | ## attachment.upload A base64 encoded file has been uploaded successfully and it is ready to be used as a dynamic attachment in the **Send email** node. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | |params |array of objects|`"params": [{"attachment.0.size": 48,"attachment.0.filename": "Policy certificate","attachment.0.extension": "csv","attachment.0.mimeType": "text/csv","attachment.0.id": "ad7e1e7e-16bb-476b-805d-767159619c9c","attachments": [{"mimeType": "text/csv","id": "ad7e1e7e-16bb-476b-805d-767159619c9c","minioBucketName":"3d2bbac6f7eacc33da9c9f4299c3154c49965926","filename": "Policy certificate","extension": "csv","path": "/113ad6144463ea34ff9b778e544464b4bb5644bf/ea3d2fe6-13ed-412a-9a0d-1470f447890c","size": 48}]`| An array of file parameters | ## automation.abTestVariantAssigned A profile reached the [ABx Test node](/docs/automation/conditions/abx-split-node) and A/B/X test variant has been assigned to them. This event is generated only after enabling the **Generate a variant assignment event** option in the configuration of the node. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | variantName | string | `Group A` | Name of the variant (group) to which a profile has been assigned | | variantIndex | number | `1` | The number of path that leads the profile further in the workflow. | ## automation.clientStartPath A profile entered a workflow path.
This event can't be used as an automation trigger.
**Default retention**: 2 days This event is necessary to store and read the current state of an Automation journey. It's also used in debugging. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | activatedBlockName | string | `abandoned cart` | Name of the node that was activated in this step | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | activatedBlockId | string | `fc8248b3-fba1-41ad-8d55-1a255fbfe47c` | Unique ID of the node that was activated in this step | | pathId | number | `1` | ID of the path on which the activated node is placed | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | _causalityId | number | `4` | This parameter is used to sort events that occurred in the same second, so that they can be displayed in the correct order. | | diagramName | string | `Abandoned cart emails` | Name of the workflow | ## automation.clientPathStep A profile completed a step (node) in a workflow path.
This event can't be used as an automation trigger.
**Default retention**: 2days This event is necessary to store and read the current state of an Automation journey. It's also used in debugging. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | activatedBlockName | string | `abandoned cart` | Name of the node that was activated in this step | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | activatedBlockId | string | `fc8248b3-fba1-41ad-8d55-1a255fbfe47c` | Unique ID of the node that was activated in this step | | pathId | number | `1` | ID of the path on which the activated node is placed | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | _causalityId | number | `4` | This parameter is used to sort events that occurred in the same second, so that they can be displayed in the correct order. | | diagramName | string | `Abandoned cart emails` | Name of the workflow | ## automation.clientEndPath A profile completed a journey by reaching the End node in one of a workflow's paths.
This event can't be used as an automation trigger.
**Default retention**: 2 days This event is necessary to store and read the current state of an Automation journey. It's also used in debugging. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | activatedBlockName | string | `abandoned cart` | Name of the node that was activated in this step | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | activatedBlockId | string | `fc8248b3-fba1-41ad-8d55-1a255fbfe47c` | Unique ID of the node that was activated in this step | | pathId | number | `1` | ID of the path on which the activated node is placed | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | _causalityId | number | `4` | This parameter is used to sort events that occurred in the same second, so that they can be displayed in the correct order. | | diagramName | string | `Abandoned cart emails` | Name of the workflow | ## automation.clientPathAborted The Profile's transition through the workflow was interrupted for reasons other than the workflow's completion. **Default retention**: 30 days This event is necessary to store and read the current state of an Automation journey. It's also used in debugging. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | activatedBlockName | string | `abandoned cart` | Name of the node that was activated in this step | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | activatedBlockId | string | `fc8248b3-fba1-41ad-8d55-1a255fbfe47c` | Unique ID of the node that was activated in this step | | pathId | number | `1` | ID of the path on which the activated node is placed | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | _causalityId | number | `4` | This parameter is used to sort events that occurred in the same second, so that they can be displayed in the correct order. | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | errorMessage | string | `global timeout` | The reason for the error occurrence | ## automation.clientPathError The Profile's transition through the workflow was interrupted due to a Jinjava syntax error, for example. **Default retention**: 30 days This event is necessary to store and read the current state of an Automation journey. It's also used in debugging. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | activatedBlockName | string | `abandoned cart` | Name of the node that was activated in this step | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | activatedBlockId | string | `fc8248b3-fba1-41ad-8d55-1a255fbfe47c` | Unique ID of the node that was activated in this step | | pathId | number | `1` | ID of the path on which the activated node is placed | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | _causalityId | number | `4` | This parameter is used to sort events that occurred in the same second, so that they can be displayed in the correct order. | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | errorMessage | string | `global timeout` | The reason for the error occurrence | | errorCode | integer | `408` | The code of the error | ## automation.flowLimiterCount A profile transitioned through the [Flow limiter node](/docs/automation/conditions/flow-limiter). This event is generated for transitions below the limit set in the Flow Limiter configuration and the event contains information on the number of passages through the node. **Default retention**: 30 days This event is necessary to store and read the current state of an Automation journey. It's also used in debugging. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | limit | number | `100` | Transition limit set in Flow Limiter | | operationMode | string | `Block` | Transition counting mode | | timeWindowTimezone | string | `Europe/Warsaw` | Time zone for transition counting | | timeWindowType | string | `Hour` | Time unit for counting the limit | | transitionNumber | number | `2` | Transition number through the node within the limit | # Data Modeling Hub The Data Modeling Hub serves as the central data repository for your workspace, consolidating key data assets such as catalogs (including item feeds and business information used in campaigns), events with their parameters, tags, and files. These assets are essential for driving analysis, crafting message templates, and building workflows. In addition to data storage, the hub enables the creation and management of reusable content. This includes schemas, snippets — reusable code segments that allow dynamic data usage across templates and fields within the Synerise platform — and voucher pools. To support seamless integration and efficient data handling, the Data Modeling Hub also facilitates data transfer by providing tools to import and export data with ease. ## Required user permissions See [Data Modeling Hub permissions](/docs/settings/identity-access-management/permissions/data-management-permissions). # Integration events This section contains events which are generated in response to a request to the external endpoint. You can find these events on the activity list of profiles for whom the request was made. Each event contains a `body` object whose structure you can see below: #### Response body properties example For the following response body:
{
    "prop1": "string",
    "prop2": [
        "value1",
        "value2"
    ],
    "prop3": {
        "key1": true,
        "key2": 15
    }
}
The following event params are generated: | Name | Value | | --- | --- | | `body.prop1` | `string` | | `body.prop2[0].someKey` | `123` | | `body.prop2[1].someKey` | `456` | | `body.prop3.key1` | `true` | | `body.prop3.key2` | `15` | ## amazonApiGateway.sendRequest A response from Amazon API Gateway has been received. The action name of this event defaults to `amazonApiGateway.sendRequest`. We recommend using your own, custom name instead - you can enter it in the **Response action** field when configuring the ["Send Request" node](/docs/automation/integration/amazon-api-gateway/send-request). This will make it easier to differentiate between events from different automations. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | req.url | string | `https://example.com/hook` | URL of the request | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | status | integer | `200` | HTTP code of the request status | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | name | string | `AmazonApiGateway` | Name of the integration | | statusDescription | string | `OK` | Status of the request | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | ## bigQuery.uploadData A response from Google BigQuery was received. The request was made by execution of the ["Upload Data to Table" node](/docs/automation/integration/google-bigquery/upload-data-to-bigquery). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## eagleEye.couponCreated A response from Eagle Eye was received. The request was made by execution of the ["Create Coupon" node](/docs/automation/integration/eagle-eye/create-coupon). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `EagleEye` | Name of the integration | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## facebook.sendCustomEvent A response from Facebook was received. The request was made by execution of the ["Send Custom Event" node](/docs/automation/integration/facebook/send-custom-event). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `Facebook` | Name of the integration | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## facebook.removeFromAudience A response from Facebook was received. The request was made by execution of the ["Remove Profiles from Custom Audience" node](/docs/automation/integration/facebook/remove-profiles-from-custom-audience). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## facebook.sendAudience A response from Facebook was received. The request was made by execution of the ["Add Profiles to Custom Audience" node](/docs/automation/integration/facebook/send-custom-audience). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `Facebook` | Name of the integration | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## facebook.sendOfflineTransaction A response from Facebook was received. The request was made by execution of the ["Send Offline Transactions" node](/docs/automation/integration/facebook/send-offline-transactions). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `Facebook` | Name of the integration | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## facebook.sendOnlineTransaction A response from Facebook was received. The request was made by execution of the ["Send Online Transactions" node](/docs/automation/integration/facebook/send-online-transactions). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## googleAds.sendOfflineConversion A response from Google Ads was received. The request was made by execution of the ["Send Offline Conversion" node](/docs/automation/integration/google-ads/google-ads-send-offline-conversions). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | name | string | `GoogleAds` | Name of the integration | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## googleSheets.uploadData A response from Google Sheets was received. The request was made by execution of the ["Upload Data to Spreadsheet" node](/docs/automation/integration/google-sheets/upload-data-to-spreadsheets). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `GoogleSheets` | Name of the integration | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## MSteams.sendChannelMessage A response from Microsoft Teams was received. The request was made by execution of the ["Send Channel Message" node](/docs/automation/integration/microsoft-teams/send-message-to-teams-channel-v2). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## pubSub.publishMessage A response from Google Cloud Pub/Sub was received. The request was made by execution of the ["Publish Message" node](/docs/automation/integration/google-cloud-pubsub/publish-message). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## pubSub.publishRawMessages A response from Google Cloud Pub/Sub was received. The request was made by execution of the ["Publish Raw Message" node](/docs/automation/integration/google-cloud-pubsub/publish-raw-messages). | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `GooglePubSub` | Name of the integration | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## salesforce.getLead A response for a request to retrieve a lead information from Salesforce CRM was received. The request was made by execution of the ["Get a Lead" node](/docs/automation/integration/salesforce-crm/get-lead). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `SalesforceCRM` | Name of the integration - predefined | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## salesforce.leadCreated A response for creating a lead in Salesforce CRM was received. The request was made by execution of the ["Create a Lead" node](/docs/automation/integration/salesforce-crm/create-lead). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `SalesforceCRM` | Name of the integration - predefined | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## salesforce.leadUpdated A response for updating lead information in Salesforce CRM was received. The request was made by execution of the ["Update a Lead" node](/docs/automation/integration/salesforce-crm/update-lead). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `SalesforceCRM` | Name of the integration - predefined | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## slack.sendChannelMessage A response from Slack was received. The request was made by execution of the ["Send Channel Message" node](/docs/automation/integration/slack/send-message-to-slack-channel). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `Slack` | Name of the integration - predefined | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## trustmate.createInvitation A response for creating an invitation for a product review in TrustMate was received. The request was made by execution of the ["Create Invitation" node](/docs/automation/integration/trustmate/create-invitation). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `TrustMate` | Name of the integration - predefined | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## trustMate.getSurveyLinks A response for creating an invitation for a product review in TrustMate was received. The request was made by execution of the ["Get Survey Link (Single Product)" node](/docs/automation/integration/trustmate/get-survey-link). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `trustmateOI` | Name of the integration - predefined | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## weatherapi.getWeatherInfo A response from Weather API was received. The request was made by execution of the ["Get Weather Information" node](/docs/automation/integration/weatherapi/get-weather-information). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `WeatherAPI` | Name of the integration - predefined | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | ## webhook.response (and custom webhook response names) An outgoing webhook from Automation Hub returned a response. The action name of this event defaults to `webhook.response`. We recommend using your own, custom name instead - you can enter it in the **Webhook event name** field when configuring the ["Outgoing Integration" node](/docs/automation/actions/webhook-node) or a [reusable integration](/docs/automation/integration/outgoing-webhook). This will make it easier to differentiate between events from different automations. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | req.url | string | `https://example.com/hook` | URL of the request | | name | string | `Pull data` | Name of the webhook | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | ## webhook.timeout An [Outgoing Integration](/docs/automation/integration/outgoing-webhook) node timed out. This event is produced only by nodes where the **Produce timeout event** option is enabled (by default, it's disabled). The timeout value is influenced by a number of factors and may change over time. The current value is returned in `timeoutMs`. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | req.url | string | `https://example.com/hook` | URL of the request | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | timeoutMs | number | `7000` | Timeout value in milliseconds | | pathId | number | `1` | ID of the path on which the activated node is placed | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | status | integer | `200` | HTTP code of the request status | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | name | string | `DelayedWebhook` | Name of the webhook | | statusDescription | string | `OK` | Status of the request | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | ## whatsApp.bounce A WhatsApp message has been sent but didn't reach the recipient. This event is a response to the request made by execution of the ["Send Template Message" node](/docs/automation/integration/whatsapp-partner-integration/send-template-message). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | anonymousType | string | `NONE`, `CUSTOM_ID` | User is anonymous (or not) | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | additionalParameters | object | `{"custom.infobip.error.id":"7009","custom.infobip.status.id":"4","custom.infobip.error.name":"EC_INVALID_TEMPLATE","custom.infobip.status.groupId":"2","custom.infobip.status.name":"UNDELIVERABLE_REJECTED_OPERATOR","custom.infobip.error.groupId":"1","custom.infobip.error.permanent":"true"}` | Further details about the error that caused the bounce: status code group ID, status code group name, status name, status ID, and status code description | ## whatsApp.click A button or link in the message has been clicked. The request was made by execution of the ["Send Template Message" node](/docs/automation/integration/whatsapp-partner-integration/send-template-message). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | snrs_whatsapp_template | string | `Promotion template` | Name of the Meta (WhatsApp Business) template containing the button that was clicked | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | ## whatsApp.send A WhatsApp message has been sent. The request was made by execution of the ["Send Template Message" node](/docs/automation/integration/whatsapp-partner-integration/send-template-message). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | messageOrigin | string | `AUTOMATION` | For whatsApp.send/notSent events, this parameter is always set to `AUTOMATION`.
Informs if the the message was caused by a workflow in Automation Hub or by Experience Hub. | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | templateName | string | `shop_now` | The name of the template | | isAlert | boolean | `true` | Only added when the message was caused by a workflow. When `true`, it was caused by an [SMS](/docs/automation/actions/sms-alert-node) or [Email](/docs/automation/actions/send-email-alert-node) Alert node. | | sender | object | {"credentialId":"e1dc0920-76e7-4fb2-a692-6f16082da670"} | Credential ID of the sender account; can be used to [enrich the event](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) with sender details, such as the name. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | ## whatsApp.show A WhatsApp message has been opened by the recipient. The request was made by execution of the ["Send Template Message" node](/docs/automation/integration/whatsapp-partner-integration/send-template-message). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | anonymousType | string | `NONE`, `CUSTOM_ID` | User is anonymous (or not) | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | additionalParameters | object | `{}` | Further details about the messag; by default it's empty | ## whatsApp.notSent A WhatsApp message was not sent. Check the parameters to locate the reason. The request was made by execution of the ["Send Template Message" node](/docs/automation/integration/whatsapp-partner-integration/send-template-message). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | messageOrigin | string | `AUTOMATION` | For whatsApp.send/notSent events, this parameter is always set to `AUTOMATION`.
Informs if the the message was caused by a workflow in Automation Hub or by Experience Hub. | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | templateName | string | `shop_now` | The name of the template | | isAlert | boolean | `true` | Only added when the message was caused by a workflow. When `true`, it was caused by an [SMS](/docs/automation/actions/sms-alert-node) or [Email](/docs/automation/actions/send-email-alert-node) Alert node. | | sender | object | {"credentialId":"e1dc0920-76e7-4fb2-a692-6f16082da670"} | Credential ID of the sender account; can be used to [enrich the event](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) with sender details, such as the name. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | info | string | `Infobip API error 400 Bad Request: {"requestError":{"serviceException":{"messageId":"BAD_REQUEST","text":"Error while parsing request body. Please check your syntax."}}}` | Cause of the error that prevented message sending | ## whatsApp.sendTemplateMessage A response from WhatsApp was received. The request was made by execution of the ["Send Template Message" node](/docs/automation/integration/whats-app/send-template-message). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | actionId | string | `3bbcee75-cecc-5b56-8031-b6641c1ed1f1` | The identifier of the action performed by the node. | | blockId | string | `a920849d-3e72-593d-b791-86fcecd0b873` | Unique ID of the node on the canvas | | blockName | string | `Assign a customer to a variant` | Name of the node, defined by the user | | body.<keyPath>| string | `exampleValue` | Data from the response body. Each property of the response body is saved as a separate parameter named after the dot notation path of the corresponding key. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | diagramName | string | `Abandoned cart emails` | Name of the workflow | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | name | string | `WhatsApp` | Name of the integration - predefined | | pathId | number | `1` | ID of the path on which the activated node is placed | | req.url | string | `https://example.com/hook` | URL of the request | | statusDescription | string | `OK` | Status of the request | | status | integer | `200` | HTTP code of the request status | # Landing page events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## landingpage.visit A visit to the landing page. This event is generated even without a tracking code on the landing page. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | userAgent | string | `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko)` | Information about the User Agent | ## landingpage.renderFail A landing page couldn't be generated. This event is generated even without a tracking code on the landing page. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | userAgent | string | `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko)` | Information about the User Agent | | error | string | `Jinjava syntax error` | Cause of render failure of the landing page | | info | string | `Jinja rendering terminated by user` | Error message from the [`terminate`](/developers/inserts/insert-usage#stopping-communication-from-rendering) insert | # Email events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## marketingAgreement.turnOn The email marketing agreement was enabled in a profile. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | ## marketingAgreement.turnOff The email marketing agreement was disabled in a profile. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | ## newsletter.unsubscribe The Synerise unsubscribe link (generated with the `{{ synerise-resign-link }}` insert) was used to unsubscribe from a newsletter. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | ID | string | `cfb1845c-6508-49c8-952d-b96fb7326ee5` | Unique ID of the newsletter campaign where the unsubscribe link was clicked | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | label | string | `Check this promo!` | Name of the newsletter campaign where the unsubscribe link was clicked. This is **not** the same `label` parameter as the label parameter common to all events. | | method | string | `RESIGN_LINK` | Method of resignation. Possible values: `RESIGN_LINK` if the resignation link in email template was clicked, `ONECLICK_LINK` or `ONECLICK_MAILTO` if the recipient clicked the unsubscribe button displayed by mail client.| ## message.send An email was sent to a profile. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | sender | object | {"accountId":1234} | Account ID of the sender account; can be used to [enrich the event](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) with sender details, such as the name. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | title | string | `Monthly newsletter` | Title (subject) of the message. | | isAlert | boolean | `true` | Only added when the message was caused by a workflow. When `true`, it was caused by an [SMS](/docs/automation/actions/sms-alert-node) or [Email](/docs/automation/actions/send-email-alert-node) Alert node. | | messageOrigin | string | `AUTOMATION` | Informs if the the message was caused by a workflow in Automation Hub or by Experience Hub. | ## newsletter.capping An email was not sent due to message limits set for this type of communication.
If messages are sent through Automation Hub, this event may be generated for customers who do not have the required marketing agreement for receiving this message type. This is because the sending process checks the limits before the customers' agreement status.
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | cappingType | string | `AUTOMATION_EMAIL` | The type of communication activity where the capping occurred. Possible values: `AUTOMATION_EMAIL`, `CAMPAIGN_EMAIL`, `TAG`; if the capping happened in Automation Hub, the `journeyId` and `diagramId` are added to the parameters. If the capping is related to a tag, `cappedTagIds` is added to the parameters. | | cappingLimit | integer | `4` | Limit of how many messages can be sent in the defined period | | cappingPeriod | integer | `86400` | Capping period, in seconds | | cappedTagIds | array | `[2a185433-aa26-43bf-9aef-67342091b489]` | IDs of tags for which the communication limit has been reached. | | cappedTagNames | array | ["churn","loyalty"] | Names of tags for which the communication limit has been reached. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## newsletter.controlGroup An email was not sent because the recipient belongs to the control group. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | type | string | `global` | Type of the control group. `global` if the global control group was used;`campaign` if the control group was defined in the campaign settings. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | globalControlGroupId | string | `00000000-0000-0000-0000-000000000001` | Parameter reserved for future purposes. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## message.skipped An email was not sent because Silence Hours were active. If the process of sending multiple messages overlaps with Silence Hours, sending is stopped in progress. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantName | string | `Variant A` | Name of the message variant | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## newsletter.open This event is generated only when a recipient opens a regular email. Opening test and alert emails does not generate this event. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | url | string | `https://web.snrbox.com/pix.gif?...` | The URL of the pixel that enables event tracking inside the message. This pixel is added automatically when the message is sent. | | campaignName | string | `Black Friday promotions` | Title of the campaign in Experience Hub | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | testDelivery | boolean | `false` | For the newsletter.open event, this parameter is always set to false.
Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## newsletter.click This event is generated only when a recipient clicks a link a regular email. Clicking links in test and alert emails does not generate this event. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | url | string | `https://web.snrbox.com/pix.gif?...` | The URL of the link that was clicked. | | campaignName | string | `Black Friday promotions` | Title of the campaign in Experience Hub | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | testDelivery | boolean | `false` | For the newsletter.click event, this parameter is always set to false.
Informs if the message was sent as a communication test. | | messageOrigin | string | `AUTOMATION` | Informs if the the message was caused by a workflow in Automation Hub or by Experience Hub. | ## message.notSent An email was not sent. Check the parameters to locate the reason.
When a message can't be sent, it still counts towards [communication limits](/docs/settings/configuration/campaign-limits)!
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | info | string | `message too old` | A description of why the message was not sent. The content of this parameter may come from your email provider or from the [`terminate`](/developers/inserts/insert-usage#stopping-communication-from-rendering) insert. | | extra | string | `Missing currentStep value` | Additional information about the Jinjava problem that stopped the message from sending. | | exception | string | `Syntax error in {% endfor %}: Mismatched end tag, expected: endif` | Additional information about a problem that stopped the communication from sending. | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | sender | object | {"accountId":1234} | Account ID of the sender account; can be used to [enrich the event](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) with sender details, such as the name. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | title | string | `Monthly newsletter` | Title (subject) of the message. | | isAlert | boolean | `true` | Only added when the message was caused by a workflow. When `true`, it was caused by an [SMS](/docs/automation/actions/sms-alert-node) or [Email](/docs/automation/actions/send-email-alert-node) Alert node. | | messageOrigin | string | `AUTOMATION` | Informs if the the message was caused by a workflow in Automation Hub or by Experience Hub. | ## newsletter.dropped The recipient's email address is on the denylist. This event is generated only when the SMTP provider supports it. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | ## newsletter.hardbounce An email was not delivered because the email address is invalid or the recipient blocked receiving emails. This event is generated only when the SMTP provider supports it. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | ## newsletter.softbounce An email was not delivered due to an overloaded inbox, server error, or email size. This event is generated only when the SMTP provider supports it. **Default retention**: 90 | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | ## newsletter.spambounce The recipient's email server recognized the message as potential spam. The email is rejected and **not saved**, even in the spam folder. This event is generated only when the SMTP provider supports it. **Default retention**: 90 | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | # Web push events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## webpush.subscribe Web push permission was enabled in a profile. This happens as the final step of the subscription process or when the setting was changed by API/in the Profile card. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## webpush.unsubscribe Web push permission was disabled in a profile. This happens as the final step of disabling the subscription or when the setting was changed by API/in the Profile card. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | ## webpush.subscribeBlock A profile rejected a web push subscription in the agreement form. This is sent by forms implemented additionally to the browser's native web push permission. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## webpush.subscribeDiscard A web push subscription form was closed or no interaction with it occurred. This is sent by forms implemented additionally to the browser's native web push permission. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## webpush.permissionAgree A customer allowed web push notifications in their browser. This refers to the browser's native web push permissions. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## webpush.permissionBlock A customer denied web push notification permissions in their browser. This refers to the browser's native web push permissions. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## webpush.permissionDiscard A web push subscription form was closed or no interaction with it occurred. This refers to the browser's native web push permissions. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## webpush.send A web push notification was sent. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | title | string | `Monthly newsletter` | Title (subject) of the message. | ## webpush.capping A wepbush notification was not sent due to message limits set for this type of communication.
If messages are sent through Automation Hub, this event may be generated for customers who do not have the required marketing agreement for receiving this message type. This is because the sending process checks the limits before the customers' agreement status.
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | cappingPeriod | integer | `86400` | Capping period, in seconds | | cappingType | string | `AUTOMATION_WEB_PUSH` | The type of communication activity where the capping occurred. Possible values: `AUTOMATION_WEB_PUSH`, `CAMPAIGN_WEB_PUSH`, `TAG`; if the capping happened in Automation Hub, the `journeyId` and `diagramId` are added to the parameters. If the capping is related to a tag, `cappedTagIds` is added to the parameters. | | cappingLimit | integer | `4` | Limit of how many messages can be sent in the defined period | | cappedTagIds | array | `[2a185433-aa26-43bf-9aef-67342091b489]` | IDs of tags for which the communication limit has been reached. | | cappedTagNames | array | ["churn","loyalty"] | Names of tags for which the communication limit has been reached. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## webpush.notSent A web push notification was not sent. Check the parameters to locate the reason.
When a message can't be sent, it still counts towards [communication limits](/docs/settings/configuration/campaign-limits)!
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | info | string | `unexpected failure` | Error message from the provider or the [`terminate`](/developers/inserts/insert-usage#stopping-communication-from-rendering) insert. | | exception | string | `Syntax error in {% endfor %}: Mismatched end tag, expected: endif` | Additional information about a problem that stopped the communication from sending. | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | title | string | `Monthly newsletter` | Title (subject) of the message. | ## webpush.controlGroup A web push notification was not sent because the recipient belongs to the control group. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | type | string | `global` | Type of the control group. `global` if the global control group was used;`campaign` if the control group was defined in the campaign settings. | | globalControlGroupId | string | `00000000-0000-0000-0000-000000000001` | Parameter reserved for future purposes. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## webpush.skipped A web push notification was not sent because Silence Hours were active. If the process of sending multiple messages overlaps with Silence Hours, sending is stopped in progress. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantName | string | `Variant A` | Name of the message variant | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## webpush.show A web push notification was viewed. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## webpush.click A web push notification was clicked. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | actionButton | number | `1` | Information about the action button clicked in the notification. It's value can be `1` or `2`, depending on which button was clicked. | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `44a5938a-098c-4bd3-b7dd-cda405ee76a1` | Unique ID of the message | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | mobile | boolean | `true` | `true` if the event occurred on a mobile device | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## webpush.mismatchSenderId A web push message was not sent, because the Firebase project to which the profile was registered changed. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | registrationId | string | `ew3Mp4LA6Hg:APA91bFeQCOsICtTU...BOTeMBwcAn6Q_FK3jrC-TfI4onOwNKDB6M3OTDf2GWCR_rCdqsaYUOnPh` | The registration ID that was used to try sending the message | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## webpush.invalidRegistrationId A web push message was not sent due to an incorrectly assigned registrationId in Firebase. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | registrationId | string | `ew3Mp4LA6Hg:APA91bFeQCOsICtTU...BOTeMBwcAn6Q_FK3jrC-TfI4onOwNKDB6M3OTDf2GWCR_rCdqsaYUOnPh` | The registration ID that was used to try sending the message | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## webpush.notRegistered A web push notification was not sent due to an invalid Firebase token. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | registrationId | string | `ew3Mp4LA6Hg:APA91bFeQCOsICtTU...BOTeMBwcAn6Q_FK3jrC-TfI4onOwNKDB6M3OTDf2GWCR_rCdqsaYUOnPh` | The registration ID that was used to try sending the message | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## webpush.tokenDelete A Firebase token for web push notifications was deleted. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | token | string | `f_9fQEAtNBM:APA91bHAYC42Iw15s2IGg0KcY2v7...nziPOdVVAfeMFuYd57G3rP-` | The deleted token | ## webpush.tokenUpdate A Firebase Cloud Messaging token for web push notifications was updated. This happens when: - A new token is received from Firebase. - The profile context in the browser changes (another user visits the website from the same browser or the current user receives a new UUID). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | version | string | `3.0.0` | The version of service worker stored in the browser | | domain | string | `www.yoursite.com` | The domain for which the new token was generated | | token | string | `equYW_K6h5o:APA91bGSfXwpjDKnV5...8GyVLwNedEtnmMVwK6DWTSbEI` | The new token | # Dynamic content events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## dynamicContent.show Dynamic content on a web page was displayed to a visitor. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | firstTimeVisitor | boolean | `true` | This parameter is only added to event if it's `true`. It means that the **Include first time visitors in audience** option is enabled in the Dynamic Content configuration and this event was generated for a first-time visitor. | | title | string | `Release notification` | Title of the campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## dynamicContent.controlGroup The user belongs to the global control group. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Important notice` | Name of the campaign | | type | string | `global` | Type of the control group. `global` if the global control group was used;`campaign` if the control group was defined in the campaign settings. | | globalControlGroupId | string | `00000000-0000-0000-0000-000000000001` | Parameter reserved for future purposes. | | firstTimeVisitor | boolean | `true` | This parameter is only added to event if it's `true` and the global control group applies to this campaign. It is related only to campaigns directed to everyone and means that a first-time visitor was treated as part of the control group (content wasn't displayed) | ## dynamicContent.click Dynamic content on a web page was clicked by a visitor. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | firstTimeVisitor | boolean | `true` | This parameter is only added to event if it's `true`. It means that the **Include first time visitors in audience** option is enabled in the Dynamic Content configuration and this event was generated for a first-time visitor. | | campaignName | string | `Important notice` | Name of the campaign | | host | string | `sub-domain.domain.com` | Domain name or IP address of URL | | location | string | `/eu-projects` | Resource location | | referrer | string | `synerise.com/careers` | The page that the user was on before being directed to the current resource | | refdomain | string | `synerise.com` | Referrer domain | | ref | string | `/careers` | Referrer location | | name | string | `Important notice` | Title of the campaign | | campaign | string | "0" | Deprecated parameter | | campaignHashID | string | `a6ab2e6f-6712-4d7c-8367-615f158af496` | ID of the campaign | | hash | string | `a6ab2e6f-6712-4d7c-8367-615f158af496` | ID of the campaign | | snrs_cp | string | `a6ab2e6f-6712-4d7c-8367-615f158af496` | ID of the campaign | | id | string | `a6ab2e6f-6712-4d7c-8367-615f158af496` | ID of the campaign | | identity | string | `email` | The way that the profile was identified | | identityHash | string | `-1896583966` | Identity hash is used to verify if the current user is the same as the last user who accessed a resource from the device. | | user_hash | string | `8743b52063cd84097a65d1633f5c74f5 ` | If the *_ush* cookie is set, the value is stored here. | | ssuid | string | `a9cdcf44-7cba-4a33-b3b3-a9aa190d910c` | Session ID | | s_visits | string | `3` | Number of visits in this session | | visits | string | `82` | Total number of visits | | u24_visits | string | `7` | Number of visits in the last 24 hours | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | | current | string | `1677527752` | Unix time when the event happened | | init | string | `1677527752` | The time of the first page visit (time from the customer's browser) | | last | string | `1677527748` | The time of the most recent page visit | | ecookies | string | `true` | Informs if cookies were enabled at the time of sending the event | | encoding | string | `UTF-8` | Encoding of the message | | res | string | `1024x768` | Screen resolution | | lang | string | `pl_pl` | Language of the site | | long | integer | `45` | Duration of the current session in seconds | | browser | string | `Chrome` | Name of the browser | | browserVer | string | `109.0.0.0` | Version of the browser | | osver | string | `10_15_7` | Version of the operating system | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | | snr_sdk_version | string | `4.10.1` | Synerise SDK version | | tck | string | `B264B70A-42D8-B6B7-13E5-ACAAAAAAA59` | Tracking code used to record this event | | type.id | integer | `9` | Numerical ID of the communication type | | type.title | string | `Dynamic content` | Communication type | ## variant.assign Event generated as a result of assigning a customer to a variant of an A/B/X test of a recommendation, AI Search, or dynamic content (for variant optimizer feature driven by AI engine). **Default retention** 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | experimentId | integer | `930` | ID of the A/B test | | variantId | integer | `2484` | ID of the variant for A/B test | | variantName | string | `FV5PIcmhmN0p` | ID of the recommendation campaign assigned to the test variant | # Customer AI Assistant events ## assistant.click An event generated when an item shown in the assistant response is clicked. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | assistantId | string | `d9710386-8de5-4d71-8327-93c0411b4b3c` | The ID of the agent configuration | | channel | string | `web` | The channel within which the conversation has started; possible values: `WEB_DESKTOP`, `MOBILEWEB`, `MOBILE_APP` | | clickedFromComponent | string | `CAROUSEL` | Message-element type the clicked item was rendered in (for example, CAROUSEL, BUBBLE_TEXT). | | correlationId | string | `43cc2e3f-df11-4c78-abe1-4d0710abba3f` | Correlation ID is used to associate events that are the result of the same request, for example to link a recommendation frame with a recommendation.click event, a search request with an item.search.click event, or a user's conversational turn with the corresponding assistant.click event. | | itemId | string | `123456` | The ID of the clicked item | | seqNo | integer | `4` | Sequential number of this response within the thread, starting from `0` | | threadId | string | `93d3cc74-a909-4cd9-b725-3e349d949c8b` | The ID of the conversation | ## assistant.conversationStart An event generated when a profile starts a conversation with the assistant. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | assistantId | string | `d9710386-8de5-4d71-8327-93c0411b4b3c` | The ID of the agent configuration | | channel | string | `web` | The channel within which the conversation has started; possible values: `WEB_DESKTOP`, `MOBILEWEB`, `MOBILE_APP` | | threadId | string | `93d3cc74-a909-4cd9-b725-3e349d949c8b` | The ID of the conversation | | eventWeight | float | `0.01727089956` | Event weight, dynamic for each event, identifying the amount of work performed. Used for billing purposes. | ## assistant.responseGenerated An event generated when the assistant produces a response to a profile's message. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | action | string | search | Type of action taken to produce the response. Covers every conversational turn outcome, including non-tool ones. Null when no action was resolved (for example, an error occurred before planning). Possible values: `search`, `recommend`, `brickworks`, `answer_products`, `reject`, `clarify`, `button_action`, `mcp_tool`, `link`, `message` | | assistantId | string | `d9710386-8de5-4d71-8327-93c0411b4b3c` | The ID of the agent configuration | | channel | string | `web` | The channel within which the conversation has started; possible values: `WEB_DESKTOP`, `MOBILEWEB`, `MOBILE_APP` | | context | string | `{"context_category": "electronics"}` | Arbitrary contextual key/value pairs captured for the turn | | correlationId | string | `43cc2e3f-df11-4c78-abe1-4d0710abba3f` | Correlation ID is used to associate events that are the result of the same request, for example to link a recommendation frame with a recommendation.click event, a search request with an item.search.click event, or a user's conversational turn with the corresponding assistant.click event. | | errorReason | string | `AgentExecutionError` | Human-readable error reason; set only when `status` is `ERROR` | | eventWeight | float | `0.01727089956` | Event weight, dynamic for each event, identifying the amount of work performed. Used for billing purposes. | | guardrails | object | `{"blocked": false, "validators": []}` | Determines whether the assistant response has been blocked by the Guardrails policy | | items | array | `["12345","67891","23456","78901","23344"]` | A list of item IDs that has been returned in response | | requestParams | object | `{"fastMode": false,"streaming": true }`| Assistant's settings (determines whether streaming and fastModes are enabled) | | selectedModel | string | `null` | For future use | | seqNo | integer | `4` | Sequential number of this response within the thread, starting from `0` | | status | string | `ok` | Outcome of producing the response, when the response is `ERROR` then the `errorReason` parameter is included in this event. | | threadId | string | `93d3cc74-a909-4cd9-b725-3e349d949c8b` | The ID of the conversation | | toolCallParams | object | `{}` | Breakdown of parameters for each tool invoked during this turn, grouped by tool type | | toolCallsCnt | object | `{"SEARCH": 1}` | Number of invocations for each tool type used during this conversational turn. Tool types with no invocations are omitted. | # Exporting data This article outlines which Synerise data you can export, the export methods, and accessing the exported files and export logs. ## Prerequisites --- You must be assigned with a user role with the following permissions: - [export data](/docs/settings/identity-access-management/permissions/settings-permissions#export-data) - to access Export feature in Data Modeling Hub - [create and edit workflows](/docs/settings/identity-access-management/permissions/automation-permissions#create-and-edit-workflows) - to export using Automation Hub - to download CSV from a report preview: - **Analytics > Report**: `read`, `create`, `execute` - **Analytics > Metrics**: `read` - to export catalogs: **Assets > Catalogs**: `read` ## Data type and available export methods The table lists the data types you can export from Synerise and the export methods available for each. Each export method downloads a file in the formats shown in the table, except when stated differently. You can access the exported files regardless of the export method in Data Modeling Hub icon **Data Modeling Hub > Exports**. | Data Type | Export Methods | File format | |---------------------------|--------------------------------------------------------------------------------------------------|---------------| | [Profiles](/docs/crm/crm-profile) | - [Simple export](/docs/crm/exporting-profiles#single-export)
- [Automation Hub](/docs/crm/exporting-profiles#export-in-automation-hub) | - `CSV`,
- `JSON`,
- `JSONL` | | [Segmentations](/docs/analytics/segmentations) | Go to **Decision Hub > Segmentations** (on segmentation list, next to the segmentation which you want to export, click Three dot icon **> Export**) | - `CSV`,
- `JSON`,
- `JSONL` | | [Schema Records (Brickworks)](/docs/assets/brickworks) | - [Simple export](/docs/assets/brickworks/exporting-records#simple-export)
- In [Automation Hub](/docs/assets/brickworks/exporting-records#export-through-the-automation-hub) | - `JSON`,
- `JSONL` | | [Metric results](/docs/analytics/metrics) | - [Automation Hub](/docs/automation/actions/synerise-integrations/get-metric-results) | - `CSV`,
- `JSON`,
- `JSONL`| | [Report results](/docs/analytics/reports) | - From report preview (CSV format) - go to **Descision Hub > Reports**, select a report, then select the **Preview** tab,
- [Automation Hub](/docs/automation/actions/synerise-integrations/get-analytics-report)
Automation Hub report export is limited to a maximum of 250,000 records
| - `CSV`,
- `JSON`,
- `JSONL` | | Communication Statistics | [Automation Hub](/docs/automation/actions/synerise-integrations/get-statistics) | - `CSV`,
- `JSON`,
- `JSONL` | | [Catalog records](/docs/assets/catalogs) | - [Simple export](/docs/assets/catalogs/exporting-data-from-catalogs#simple-export)
- [Automation Hub](/docs/automation/actions/synerise-integrations/export-data-from-catalog) | - `CSV`,
- `JSON`,
- `JSONL` | ### What is simple export? --- A simple export is a built-in feature available directly within Synerise components that allows you to quickly export data to a file. For example, to perform a one-off export of profiles: 1. Go to **Behavioral Data > Profiles**. 2. In the upper-right corner, click **Export > Export single file**. This method provides a straightforward way to export data without the need for additional configurations or workflows. ### What is Automation Hub export? --- The Automation Hub export method allows you to create workflows that perform either one-off or recurring exports of data to various destinations: - Downloadable file from the Synerise platform: For example, a workflow that performs a one-off export of statistics from a specific email campaign to a file.
This workflow performs a one-off export of statistics of specific email campaign to a file
This workflow performs a one-off export of statistics of specific email campaign to a file
- External sources with which there are native integrations: For example, a scheduled workflow that retrieves metrics results on a defined date and sends the file to Azure Blob Storage.
Check the list of [native integrations available in Automation Hub](/docs/automation/integration) - the Send File node actions (for example, Amazon S3 Bucket ["Send File" node](/docs/automation/integration/amazon-s3-bucket/send-file-amazon-s3-bucket)) let you export the files further.
This workflow is scheduled at a define date, retrieves results from a selected metrics, and send the file to Azure Blob Storage
This workflow is scheduled at a define date, retrieves results from a selected metrics, and send the file to Azure Blob Storage
- Any endpoint: For example, a one-off export of statistics from a specific email campaign to a custom endpoint configured in the [Outgoing Integration](/docs/automation/integration/outgoing-webhook)
This workflow performs a one-off export of statistics of specific email campaign to an endpoint defined in the settings of the Outgoing Integration node
This workflow performs a one-off export of statistics of specific email campaign to an endpoint defined in the settings of the Outgoing Integration node
#### Benefits - Flexible scheduling: define when the export process starts. - Control over frequency: run exports one-time or on a recurring basis - Data customization: modify the data file before export by applying transformation rules.
To modify data before exporting, you first need to create a [transformation rule](/docs/automation/data-transformation-and-imports/creating-data-transformation) first, and then create a workflow which contains ["Outgoing Integration" node](/docs/automation/actions/webhook-node) placed before a node that exports data.
- For certain data types (for example, profiles and schema records), Synerise provides draft workflows that you can use as-is or customize to fit your business scenario, you can read the instructions of using these workflows in: - [Configure and lanauch workflow section](/docs/assets/brickworks/exporting-records#configure-and-launch-workflow) in the documentation for exporting schema records - [Export in Automation hub section](/docs/crm/exporting-profiles#export-in-automation-hub) in the documentation for exporting profiles ## Accessing export logs and files Whichever export method you choose, you can access logs and files from the list of exports in Data Modeling Hub. ### Accessing logs 1. Go to Data Modeling Hub icon **Data Modeling > Exports**. 2. On the left pane, select the location from which the export of data was initiated.
List of exports from Data Modeling > Exports
List of exports from Data Modeling > Exports
3. In the row with the export process, click Three-dot icon. 4. Click **Show details**. ### Accessing files 1. Go to Data Modeling Hub icon **Data Modeling > Exports**. 2. On the left pane, select the location from which the export of data was initiated. 3. In the row with the export process, click Three-dot icon. 4. From the menu select one of the following options: - Download CSV - Download JSON - Download JSON lines # Importing custom events and transactions - To learn how to import custom events to Synerise, read [this article](/docs/assets/imports/importing-custom-events). - To learn how to import transactions, read [this article](/docs/assets/imports/importing-transactional-data). # Brickworks events ## brickworks.generated This event is generated whenever a schema record is invoked. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | `audience` | string | `null` | This parameter is always null | | `matchedAudience` | boolean | `false` | Returns information if a profile which invoked a schema record belongs to the schema audience | | `inputParam` | object | `{"context.testfield.test":true,"metric_additional_params.testfield.test":true}` | Contains Jinjava context | | `generatedTimeInMs` | number | `38` | The amount of time it took to generate record result | | `schema` | object | `{"appId":"clothes","id":"a78920c3-97ca-4dfa-8160-46967b54ccbf","version":3}` | Schema information | | `values` | object | `{"clothingColor":"purple","clothingType":"jacket","lastSeenItem":{}}` | Contains record fields with their values | | `objectId` | string | `bbb5e4a1-e115-450c-927c-f2ddfce8ee53` | ID of the record | ## brickworks.generated.error This event is generated whenever a schema record couldn't be generated due to an error. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | `audience` | string | `null` | This parameter is always null | | `inputParam` | object | `{"context.testfield.test":true,"metric_additional_params.testfield.test":true}` | Contains Jinjava context | | `generatedTimeInMs` | number | `38` | The amount of time it took to generate record result | | `schema` | object | `{"appId":"clothes","id":"a78920c3-97ca-4dfa-8160-46967b54ccbf","version":3}` | Schema information | | `values` | object | `{"clothingColor":"purple","clothingType":"jacket","lastSeenItem":{}}` | Contains record fields with their values | | `objectId` | string | `bbb5e4a1-e115-450c-927c-f2ddfce8ee53` | ID of the record | | `error` | object | `{"code":"CAT-002","details":{"details":"I can't generate record."},"message":"Object not found in catalog.","source":null}` | Error details | # SMS events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## sms.send An SMS was sent to a profile. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | sender | object | {"accountId":1234} | Account ID of the sender account; can be used to [enrich the event](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) with sender details, such as the name. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | isAlert | boolean | `true` | Only added when the message was caused by a workflow. When `true`, it was caused by an [SMS](/docs/automation/actions/sms-alert-node) or [Email](/docs/automation/actions/send-email-alert-node) Alert node. | | messageOrigin | string | `AUTOMATION` | Informs if the the message was caused by a workflow in Automation Hub or by Experience Hub. | ## sms.notSent An SMS was not sent. Check the parameters to locate the reason.
When a message can't be sent, it still counts towards [communication limits](/docs/settings/configuration/campaign-limits)!
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | info | string | `Body is empty` | Content of the error message from Synerise, the SMS provider, or the message from the [`terminate`](/developers/inserts/insert-usage#stopping-communication-from-rendering) insert. | | exception | string | `Syntax error in {% endfor %}: Mismatched end tag, expected: endif` | Additional information about a problem that stopped the communication from sending. | | sender | object | {"accountId":1234} | Account ID of the sender account; can be used to [enrich the event](/docs/assets/events/adding-event-parameters#enriching-events-with-data-from-catalogs) with sender details, such as the name. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | isAlert | boolean | `true` | Only added when the message was caused by a workflow. When `true`, it was caused by an [SMS](/docs/automation/actions/sms-alert-node) or [Email](/docs/automation/actions/send-email-alert-node) Alert node. | | messageOrigin | string | `AUTOMATION` | Informs if the the message was caused by a workflow in Automation Hub or by Experience Hub. | ## sms.capping An SMS was not sent due to message limits for this type of communication in the workspace settings (not related to capping for a particular automation).
If messages are sent through Automation Hub, this event may be generated for customers who do not have the required marketing agreement for receiving this message type. This is because the sending process checks the limits before the customers' agreement status.
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `db47c241-f093-4488-b3a0-1c1d7f69ed89` | Unique ID of the SMS campaign created by the Automation Hub engine | | cappingLimit | integer | `4` | Limit of how many messages can be sent in the defined period | | cappingPeriod | integer | `86400` | Capping period, in seconds | | cappingType | string | `AUTOMATION_SMS` | The type of communication activity where the capping occurred. Possible values: `AUTOMATION_SMS`, `CAMPAIGN_SMS`, `TAG`; if the capping happened in Automation Hub, the `journeyId` and `diagramId` are added to the parameters. If the capping is related to a tag, `cappedTagIds` is added to the parameters. | | cappedTagIds | array | `[2a185433-aa26-43bf-9aef-67342091b489]` | IDs of tags for which the communication limit has been reached. | | cappedTagNames | array | ["churn","loyalty"] | Names of tags for which the communication limit has been reached. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | ## sms.click A link in an SMS was clicked. To collect these events, the link must be inserted with `{% preparelink%}`. See [Creating SMS templates](/docs/campaign/SMS/creating-SMS-template).
This event isn't generated for test deliveries.
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | URL/url | string | `https://www.shop.pl/gaming/consoles/worse-than-pc-256gb-white?gclid=EAIaIQobChMIo66d4564th547AYASAAEgI_MvD_BwE` | URL of the site where the event occurred | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantName | string | `Variant A` | Name of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | | ua.os.family | string | `Mac OS X` | Operating system of the source device | | ua.os.major | string | `10` | Major version of the user's operating system | | ua.device.family | string | `Other` | The client device family | | ua.device.brand | string | `Brandname` | Brand name of the device. Only sent by mobiles and tablets. | | ua.device.model | string | `Model 8` | Model of the device. Only sent by mobiles and tablets. | | ua.family | string | `Apple Mail` | User Agent family; value of this parameter may contain the name of the bot which clicked the link in the message. You can use this parameter in analytics by excluding sms.click events where the user agent name indicates a bot| | userAgent | string | `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko)` | Information about the User Agent | | ua.major | string | `605` | Major UA version number | | ua.minor | string | `15` | Minor UA version number | | ua.patch | string | `15` | The patch version of the User Agent | ## sms.controlGroup An SMS was was not sent because the recipient belongs to the control group. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | type | string | `global` | Type of the control group. `global` if the global control group was used;`campaign` if the control group was defined in the campaign settings. | | globalControlGroupId | string | `00000000-0000-0000-0000-000000000001` | Parameter reserved for future purposes. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## sms.skipped An SMS was not sent because Silence Hours were active. If the process of sending multiple messages overlaps with Silence Hours, sending is stopped in progress. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | # Mobile campaign events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## mobileCampaign.view A mobile campaign banner or walkthrough was viewed. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | ## mobileCampaign.clicked A mobile campaign banner or walkthrough was clicked. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | ## mobileCampaign.closed A mobile campaign banner or walkthrough was closed. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | ## mobileCampaign.finished A walkthrough was completed. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | slideIndex | string | `0` | Index of the slide which triggered the event. | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | ## screen.content A screen view campaign was displayed. By default, this event is generated automatically only by the Mobile SDK. If you also want to generate it automatically when generating a screen view with the [`/schema-service/v3/screen-views/{feedSlug}/generate` API methods](https://hub.synerise.com/api-reference/campaigns#tag/Screen-views/operation/generateScreenViewByFeedGetV2), contact Synerise Support. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | viewId | string | `bb0640bf-9730-4a96-b2b6-5c9ea085c2f0` | ID of the screen view that was selected from the feed | | name | string | `Test campaign` | Name of the screen view | | priority | number | `99` | Priority of the screen view | | audienceIds | string | array of strings | UUIDs of the segmentations that are the audience for this screen view. Sent only when at least one segmentation is selected. | | audienceQuery | string | `{"analysis":{"title":"Unnamed segmentation","description":"","unique":true,"segments":[{"title":"Segmentation A","description":"","filter":{"matching":true,"expressions":[{"_id":"986e72a2-aabc-46eb-9525-158cfd5bb02f","name":"","type":"FUNNEL","matching":true,"funnel":{"_id":"4a12eb3b-aad2-4397-89ea-689b41107dc3","title":"Unnamed","completedWithin":null,"dateFilter":{"type":"RELATIVE","offset":{"type":"DAYS","value":0},"duration":{"type":"DAYS","value":30}},"steps":[{"_id":"8a3c0598-17a1-4fe2-becd-132b9d1e9ecf","title":"","action":{"id":232159,"name":"screen.content"},"eventName":"screen.content","expressions":[]}],"exact":false}}]}}]}}` | Query for the analytics engine. This is sent when you select "New audience" when creating the screen view.| | version | string | `1.0.0` | Legacy parameter, always `1.0.0` | ## product.like A mobile app user clicked the "like" button [in the content widget](/developers/mobile-sdk/displaying-recommendations). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | productId | string | `16874` | ID of the viewed item. Must be the same as the item's `itemId` in the item feed and `sku` in transaction events. | | name | string | `Running shoes 14` | Name of the item | | campaignId | string | `mXRQzZjARZhz` | ID of the recommendation campaign | | campaignHash | string | `502f7dd3-19dc-4c69-87fd-a1f64f1a2cce` | Hash ID of the campaign | ## product.dislike A mobile app user clicked the "dislike" button [in the content widget](/developers/mobile-sdk/displaying-recommendations). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | productId | string | `16874` | ID of the viewed item. Must be the same as the item's `itemId` in the item feed and `sku` in transaction events. | | name | string | `Running shoes 14` | Name of the item | | campaignId | string | `mXRQzZjARZhz` | ID of the recommendation campaign | | campaignHash | string | `502f7dd3-19dc-4c69-87fd-a1f64f1a2cce` | Hash ID of the campaign | # Mobile push events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## push.send A mobile push notification was sent to a profile. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | os | string | `ios` | Operating system of the device | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | title | string | `Monthly newsletter` | Title (subject) of the message. | | tokenAgeInDays | integer | `30` | Number of days between updating the token and sending the notification. | | tokenUpdateDate | integer | `1718479748868` | Last update time of the token to which the notification was sent, as a Unix timestamp including milliseconds. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## push.capping A mobile push was not sent due to message limits set for this type of communication.
If messages are sent through Automation Hub, this event may be generated for customers who do not have the required marketing agreement for receiving this message type. This is because the sending process checks the limits before the customers' agreement status.
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | cappingType | string | `AUTOMATION_MOBILE_PUSH` | The type of communication activity where the capping occurred. Possible values: `AUTOMATION_MOBILE_PUSH`, `CAMPAIGN_MOBILE_PUSH`, `TAG`; if the capping happened in Automation Hub, the `journeyId` and `diagramId` are added to the parameters. If the capping is related to a tag, `cappedTagIds` is added to the parameters. | | cappingLimit | integer | `4` | Limit of how many messages can be sent in the defined period | | cappingPeriod | integer | `86400` | Capping period, in seconds | | cappedTagIds | array | `[2a185433-aa26-43bf-9aef-67342091b489]` | IDs of tags for which the communication limit has been reached. | | cappedTagNames | array | ["churn","loyalty"] | Names of tags for which the communication limit has been reached. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## push.view A mobile push notification was shown in the system notification drawer. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| ## push.notView **This event is only generated for Android 7.0 or later.** A mobile push was sent, but the device did not display it due to the `areNotificationsEnabled` setting on the device. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | reason | string | `"No system permission"` | In this event, the reason is always "No system permission" | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | | id | string | `728c91e-21e5-4675-836d-3ed987e44cc9` | Unique identifier of the campaign | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| ## push.click A mobile push notification was tapped.
This event is called [push.button.click](#pushbuttonclick-deprecated) in SDK versions **older than** (not including): - React Native SDK 0.23.0 - Flutter SDK 1.3.0 - Android SDK 5.20.0
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | | clickSource1 | string | `push` | `push` if the notification was tapped, `actionButton` if a button in the notification was tapped | | actionType1 | string | `url` | The action type of the tap: `url`, `deepLink`, `openApp` | | url1 | string | `http://example.com` | The URL of the tap, if the action is a URL or a deep link | | actionButtonTitle1 | string | `Open` | Text of the action button, if the source is an action button | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | 1These parameters were introduced in SDK versions: React Native 0.23.0, Flutter 1.3.0, Android 5.20.0, iOS 4.19.0 ## push.button.click (deprecated) A button in an Android SDK/React Native SDK/Flutter SDK notification was clicked.
This event is replaced by [push.click](#pushclick) since: - React Native SDK 0.23.0 - Flutter SDK 1.3.0 - Android SDK 5.20.0
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | actionButtonTitle | string | `Open` | Text of the action button | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## push.openInApp A mobile push notification was viewed in the app. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## push.dismiss A mobile push notification was dismissed. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignTitle | string | `Monthly newsletter` | Title of the campaign in Experience Hub | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | campaignType | string | `Mobile push` | Campaign type. `Mobile push` includes banners and walkthrough campaigns, too. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## push.notSent A push notification was not sent. Check the parameters to locate the reason.
When a message can't be sent, it still counts towards [communication limits](/docs/settings/configuration/campaign-limits)!
**Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | info | string | `fcm responded with 500 Internal Server Error ` | Details of the problem, for example an API response from the messaging provider or a message from the [`terminate`](/developers/inserts/insert-usage#stopping-communication-from-rendering) insert. | | exception | string | `Syntax error in {% endfor %}: Mismatched end tag, expected: endif` | Additional information about a problem that stopped the communication from sending. | | os | string | `ios` | Operating system of the device | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | title | string | `Monthly newsletter` | Title (subject) of the message. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | tokenAgeInDays | integer | `30` | Number of days between updating the token and sending the notification. | | tokenUpdateDate | integer | `1718479748868` | Last update time of the token to which the notification was sent, as a Unix timestamp including milliseconds. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## push.imageTimeout An image in a mobile push notification could not be loaded. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantName | string | `Variant A` | Name of the message variant | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | exception | string | `java.net.SocketTimeoutException: timeout` | Summary of the timeout | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## push.controlGroup A mobile push notification was not sent because the recipient belongs to the control group. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | variantName | string | `Variant A` | Name of the message variant | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | type | string | `global` | Type of the control group. `global` if the global control group was used;`campaign` if the control group was defined in the campaign settings. | | globalControlGroupId | string | `00000000-0000-0000-0000-000000000001` | Parameter reserved for future purposes. | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## push.skipped A mobile push notification was not sent because Silence Hours were active. If the process of sending multiple messages overlaps with Silence Hours, sending is stopped in progress. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantName | string | `Variant A` | Name of the message variant | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | tokenAgeInDays | integer | `30` | Number of days between updating the token and sending the notification. | | tokenUpdateDate | integer | `1718479748868` | Last update time of the token to which the notification was sent, as a Unix timestamp including milliseconds. | ## push.mismatchSenderId A mobile push message was not sent, because the Firebase project to which the profile was registered changed. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | registrationId | string | `ew3Mp4LA6Hg:APA91bFeQCOsICtTU...BOTeMBwcAn6Q_FK3jrC-TfI4onOwNKDB6M3OTDf2GWCR_rCdqsaYUOnPh` | The registration ID that was used to try sending the message | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | os | string | `ios` | Operating system of the device | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | tokenAgeInDays | integer | `30` | Number of days between updating the token and sending the notification. | | tokenUpdateDate | integer | `1718479748868` | Last update time of the token to which the notification was sent, as a Unix timestamp including milliseconds. | ## push.invalidRegistrationId A mobile push message was not sent due to an incorrectly assigned registrationId in Firebase. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | registrationId | string | `ew3Mp4LA6Hg:APA91bFeQCOsICtTU...BOTeMBwcAn6Q_FK3jrC-TfI4onOwNKDB6M3OTDf2GWCR_rCdqsaYUOnPh` | The registration ID that was used to try sending the message | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | os | string | `ios` | Operating system of the device | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | tokenAgeInDays | integer | `30` | Number of days between updating the token and sending the notification. | | tokenUpdateDate | integer | `1718479748868` | Last update time of the token to which the notification was sent, as a Unix timestamp including milliseconds. | ## push.notRegistered A push notification was not sent due to an invalid Firebase token. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | registrationId | string | `ew3Mp4LA6Hg:APA91bFeQCOsICtTU...BOTeMBwcAn6Q_FK3jrC-TfI4onOwNKDB6M3OTDf2GWCR_rCdqsaYUOnPh` | The registration ID that was used to try sending the message | | campaignSubject | string | `Monthly message` | Title (subject) of the message. | | variantID/variantId | integer | `7044429` | Unique identifier of the message variant | | variantName | string | `Variant A` | Name of the message variant | | testDelivery | boolean | `true` | Informs if the message was sent as a communication test. | | os | string | `ios` | Operating system of the device | | ignoreCapping | boolean | `true` | Informs if the communication was configured to ignore capping. | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | diagramId | string | `c819738e-2d61-482c-a680-75ebdbc9a762` | Unique ID of the workflow that caused this event (if applicable) | | journeyId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow that caused this event (if applicable). If the Profile has a workflow in progress and enters it again, `journeyId` is the same, because it's the same workflow. | | nodeId | string | `db0a9db2-8849-5c58-9871-e07d45d64bd7` | Unique ID of the workflow node that caused this event (if applicable).| | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | tokenAgeInDays | integer | `30` | Number of days between updating the token and sending the notification. | | tokenUpdateDate | integer | `1718479748868` | Last update time of the token to which the notification was sent, as a Unix timestamp including milliseconds. | ## push.tokenDelete A Firebase token for mobile push notifications was deleted. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | token | string | `f_9fQEAtNBM:APA91bHAYC42Iw15s2IGg0KcY2v7...nziPOdVVAfeMFuYd57G3rP-` | The deleted token | ## push.tokenUpdate A Firebase Cloud Messaging token for mobile push notifications was updated. This happens when: - A new token is received from Firebase. - A change occurred in authentication (new log-in, changed UUID, and so on). - An iOS application is started. - An application (iOS or Android) is started on a different device than the last device used by a profile. This means that push notifications are only sent to the last used device. - A new device is assigned to a profile. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | domain | string | `www.yoursite.com` | The domain for which the new token was generated | | token | string | `equYW_K6h5o:APA91bGSfXwpjDKnV5...8GyVLwNedEtnmMVwK6DWTSbEI` | The new token | # Brickworks
This feature is in a [public preview](/glossary/#public-preview) mode.
Brickworks is a flexible content management layer that lets you create custom data models tailored to your business needs. You define all types, fields, and relationships to match your processes, rather than adapting to preset templates. It integrates seamlessly with Synerise’s tools for promotions, AI recommendations, real-time customer segmentation, and behavioral personalization, enabling content to update instantly based on customer behavior. You can connect and combine live data from external systems like ERPs or CRMs in real-time, creating unified content that reflects your current data. Content is validated strictly against your custom schema to ensure accuracy and reliability. Using Jinjava templating, you can build dynamic content with real-time logic and calculations. Brickworks is suited for complex setups like e-commerce catalogs, loyalty programs, and marketing campaigns, offering enterprise-grade flexibility and real-time personalization. ## Requirements You must be assigned a role with the permissions that allow the access to Schemas, Data collections, and External sources sections and adding new schemas, data collections, and external sources. See [Brickworks user permissions](/docs/settings/identity-access-management/permissions/data-management-permissions#work-with-brickworks). ## Contents # In-app messaging events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## inApp.show An in-app message was shown. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantId | string | `"f84141a7-c80a-49e7-b603-27cc83f4ca64"` | UUID of the generated message variant | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## inApp.capping An in-app message was not displayed due to [capping](/docs/campaign/in-app-messages/create-inapp-message#capping) or [frequency limits](/docs/campaign/in-app-messages/create-inapp-message#frequency). You can disable sending this event in the SDK Settings - [Enable/disable sending in-app capping event](/developers/mobile-sdk/settings#enabledisable-sending-inappcapping-event). **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantId | string | `"f84141a7-c80a-49e7-b603-27cc83f4ca64"` | UUID of the generated message variant | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## inApp.click The content of an in-app message was tapped. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantId | string | `"f84141a7-c80a-49e7-b603-27cc83f4ca64"` | UUID of the generated message variant | | url | string | `https://example.com/details?test=true` | The URL that was accessed when the user interacted with the in-app. | | type | string | `deepLink` | The type of the clicked link. | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## inApp.controlGroup An in-app message was not displayed because the recipient belongs to the control group. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | | type | string | `global` | Type of the control group. `global` if the global control group was used;`campaign` if the control group was defined in the campaign settings. | | os | string | `ios` | Operating system of the device | | globalControlGroupId | string | `00000000-0000-0000-0000-000000000001` | Parameter reserved for future purposes. | ## inApp.discard An in-app message was closed. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantId | string | `"f84141a7-c80a-49e7-b603-27cc83f4ca64"` | UUID of the generated message variant | | os | string | `ios` | Operating system of the device | | closedBy | string | `user` | Information about how the in-app was closed. When `user`, it was closed with the [JS method in the in-app](/docs/campaign/in-app-messages/creating-inapp-templates/creating-inapp-template#close-a-message). When `application`, it was closed by using the [Mobile SDK method](/developers/mobile-sdk/campaigns/in-app-message/overlay-in-app#closing-a-message). | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## inApp.hide An in-app message was hidden. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantId | string | `"f84141a7-c80a-49e7-b603-27cc83f4ca64"` | UUID of the generated message variant | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## inApp.customHook A custom action (implemented by your app developers and included in the in-app definition) from an in-app message was triggered. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantId | string | `"f84141a7-c80a-49e7-b603-27cc83f4ca64"` | UUID of the generated message variant | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | ## inApp.renderFail An in-app message was not displayed due to an error. This may be cause, for example, by an error in the Jinjava syntax or a connection problem. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignName | string | `Black Friday promotions` | Name of the communication campaign | | variantName | string | `Variant A` | Name of the message variant | | error | string | `Connection Issue: Socket closed` | Summary of the problem | | info | string | `Jinja rendering terminated by user` | Error message from the [`terminate`](/developers/inserts/insert-usage#stopping-communication-from-rendering) insert | | id | string | `c8f0b875-62e9-4dae-b9d5-241cbc9453b3` | Unique ID of the campaign | | variantId | string | `"f84141a7-c80a-49e7-b603-27cc83f4ca64"` | UUID of the generated message variant | | os | string | `ios` | Operating system of the device | | Additional parameters | string | `Custom value` | Parameters added in the **Additional parameters** section of the campaign's settings | # AI Recommendation events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## recommendation.generated A recommendation was generated for a profile. You can use the data from this event to analyze which recommendation campaigns and types are displayed, what items are recommended, and so on. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignId | string | `mXRQzZjARZhz` | ID of the recommendation campaign | | contextItem | array | `["10990874"]` | `itemId`s of the items that were used as the context of the recommendation | | type | string | `recommendations-complement-basket` | Type of the recommendation | | catalogId | string | `5464` | Item catalog that was used in the recommendation | | correlationId | string | `43cc2e3f-df11-4c78-abe1-4d0710abba3f` | Correlation ID is used to associate events that are the result of the same request, for example to link a recommendation frame with a recommendation.click event, a search request with an item.search.click event, or a user's conversational turn with the corresponding assistant.click event. | | experimentId | integer | `930` | ID of the A/B test | | variantId | integer | `2484` | ID of the variant for A/B test | | recommendedItems | array | `["0000209942583","0000207614376","0000301228783","5901985665329"]` | The IDs of items that were recommended.
Use in [analyses](/docs/analytics) instead of the `results` parameter. | | results | array of objects | `[{"item":"12000254","score":"0.062140"}]` | A list of item that were recommended, with their scores on a scale from 0 to 1, where 1 is the highest score.
The parameter is available upon request.
Unusable in [analyses](/docs/analytics). | | Additional parameters | any | `lorem ipsum` | Additional parameters that were added to the recommendation request, in the `params` parameter. | ## recommendation.view A recommendation frame was displayed to a viewer. The parameters may include a list of the items in the frame, depending on your implementation. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | items | array | `["12345","67890"]` | An array of items that were displayed, identified by `itemId` (also called sku, productId, or retailer_part_no in some APIs and SDKs). | | campaignId | string | `mXRQzZjARZhz` | ID of the recommendation campaign | | correlationId | string | `43cc2e3f-df11-4c78-abe1-4d0710abba3f` | Correlation ID is used to associate events that are the result of the same request, for example to link a recommendation frame with a recommendation.click event, a search request with an item.search.click event, or a user's conversational turn with the corresponding assistant.click event. | ## recommendation.click A recommended item was clicked. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | item | string | `12345` | The item that was clicked, identified by `itemId` (also called sku, productId, or retailer_part_no in some APIs and SDKs). | | campaignId | string | `mXRQzZjARZhz` | ID of the recommendation campaign | | correlationId | string | `43cc2e3f-df11-4c78-abe1-4d0710abba3f` | Correlation ID is used to associate events that are the result of the same request, for example to link a recommendation frame with a recommendation.click event, a search request with an item.search.click event, or a user's conversational turn with the corresponding assistant.click event. | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | ## recommendation.seen Event from content widget. Sent by mobile SDKs separately for each item in a displayed recommendation. The SDK can be configured to send a `recommendation.view` event instead, which sends all items in one event. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | campaignId | string | `mXRQzZjARZhz` | ID of the recommendation campaign | ## variant.assign Event generated as a result of assigning a customer to a variant of an A/B/X test of a recommendation, AI Search, or dynamic content (for variant optimizer feature driven by AI engine). **Default retention** 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | experimentId | integer | `930` | ID of the A/B test | | variantId | integer | `2484` | ID of the variant for A/B test | | variantName | string | `FV5PIcmhmN0p` | ID of the recommendation campaign assigned to the test variant | # Website and app interaction events
Your integration may add custom parameters. The tables only list parameters that exist in Synerise and SDKs/APIs by default.
## session.start A user entered the website or opened the application and a session was opened. The session ends when 30 minutes pass since the user's last activity. This event is generated by the backend when any of these events occurs and there is no active session: - [client.applicationStarted](/docs/assets/events/event-reference/web-and-app#clientapplicationstarted) - [screen.view](/docs/assets/events/event-reference/web-and-app#screenview) - [screen.click](/docs/assets/events/event-reference/web-and-app#screenclick) - [dynamicContent.show](/docs/assets/events/event-reference/dynamic-content#dynamiccontentshow) - [page.visit](/docs/assets/events/event-reference/web-and-app#pagevisit) - [form.submit](/docs/assets/events/event-reference/web-and-app#formsubmit) - button.click (custom event) - event log (legacy event) - slider.change (legacy event) - switch.change (legacy event) **Default retention**: 30 days **Retention guidelines:** Lowering the retention of this event affects: - In Decision Hub: - metrics that calculate monthly or weekly sessions, average session length. - segmentations based on session length. - analyses that use event parameters based on IP address, such as `ip`, `city`, `operator`. - analyses that use location data. - In Automation Hub: profile filters based on recent sessions and their length. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | mobile | boolean | `true` | `true` if the event occurred on a mobile device | | country | string | `Poland` | Name of the country where the event was generated | | countryCode | string | `PL` | Code of the country | | regionName | string | `Lesser Poland` | Name of the region | | region | string | `12` | Code of the region | | city | string | `Krakow` | Name of the city | | zip | string | `31-008` | ZIP Code | | lat | string | `50.0585` | Latitude | | lon | string | `19.9342` | Longitude | | timezone | string | `Europe/Warsaw` | Timezone of the device | | isp | string | `Example ISP Ltd` | Internet Service Provider (ISP) name | | org | string | `example.com` | ISP organization | | as | string | `AS38435 Example ISP Ltd` | Autonomous System of the ISP | ## session.end 30 minutes passed since a user was last active and the session was closed. **Default retention**: 30 days **Retention guidelines:** Lowering the retention of this event affects: - In Decision Hub: - metrics that calculate monthly or weekly sessions, average session length. - segmentations based on session length. - analyses that use event parameters based on IP address, such as `ip`, `city`, `operator`. - analyses that use location data. - In Automation Hub: profile filters based on recent sessions and their length. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | session_duration_millis | integer | `700171` | Duration of the session (in milliseconds) | | mobile | boolean | `true` | `true` if the event occurred on a mobile device | ## client.applicationStarted A user opened the mobile application. This event is sent every time the mobile SDK is initialized. This event: - can be used to target campaigns based on: - last activity in the application. - mobile network operator. - brand and model of the device. - includes information about the user's marketing consent. - is used to determine which device a user used most recently, so that mobile push campaigns are sent to that device. - can be used to trigger in-app messages. - is used for debugging. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | applicationName | string | `testApp` | Name of the application where the profile registered | | applicationType | string | `NATIVE` | Type of the application, for example 'NATIVE' for native apps and 'FLUTTER' for hybrid app built by Flutter | | sdkVersion | string | `4.10.1` | Synerise SDK version | | currentSDKVersion | string | `4.10.1` | Synerise SDK version (Android SDK only, deprecated in 6.0.0) | | sdkPreviousVersion | string | `4.8.0` | Previous version of Synerise SDK | | lastSDKVersion | string | `4.8.0` | Synerise SDK previous version (Android SDK only, deprecated in 6.0.0) | | sdkPluginVersion | string | `1.0.0` | Synerise SDK Plugin version (in hybrid apps, for example built with Flutter or React Native) | | sdkVersionCode | integer | `61200` | Numeric version code of the Synerise SDK | | version | string | `34.1.5` | Version of the application (deprecated) | | appVersion | string | `34.1.5` | Version of the application | | appVersionCode | integer | `120` | Numeric version code of the application | | deviceId | string | `EC09B76E-B4EA-4583-983E-339EE1A8171E` | Unique identifier of the device | | deviceID | string | `EC09B76E-B4EA-4583-983E-339EE1A8171E` | Unique identifier of the device (iOS SDK only, removed in 5.0.0) | | deviceModel | string | `XY-1234` | Model name of the device | | systemPushConsent | string | `enabled` | Informs if push messages are allowed in system settings | | networkType | string | `WIFI` | Type of the network that the device was connected to | | networkCountry | string | `pl` | Country code of the mobile network operator | | cellType | string | `4G` | Cellular network generation (2G, 3G, 4G, 5G) | | cellCarrier | string | `string` | Name of the mobile network carrier | | cellCountry | string | `pl` | Country code of the SIM card | | cellRoaming | string | `false` | Informs if the device is currently roaming | | deviceType | string | `SMARTPHONE` | Type of the device | | deviceResolution | string | `1170x2532` | Resolution of the device | | deviceManufacturer | string | `Apple` | Brand of the device | | deviceRooted | boolean | `false` | Informs if the device is rooted | | backgroundRestricted | boolean | `false` | Informs if the app's background activity is restricted on the device | | os | string | `ios` | Operating system of the device | | osLanguage | string | `en` | Language of the operating system | | osVersion | string | `16.4` | Version of the operating system | | origin | string | `APP_STARTED` | Reason (APP_STARTED or REINITIALIZED) | ## client.applicationCrashed Report about a mobile application crash, with additional data for troubleshooting. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | exception | string | `InvalidArgumentException` | Summary of the exception | | isRooted | boolean | `false` | Informs if the device is rooted | | reason | string | `+[SNRGetInAppDefinitionsRequest removeResponseForEtagIfExists]: unrecognized selector sent to class 0x108185418` | Additional details of the exception | | stacktrace | string | `0CoreFoundation0x0000000[...]` | Stack trace of the error | | os | string | `ios` | Operating system of the device | ## click.errorReceiver The SDK couldn't start an intent because of an `ActivityNotFoundException`. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | intentAction | string | `ACTION_VIEW` | The action of the intent | | os | string | `ios` | Operating system of the device | ## client.login A user logged in to the website or mobile application. This event is only generated for OAuth and Registration-as-a-Service authentication. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | method | string | `FACEBOOK` | Sign in method | | email | string | `example@synerise.com` | Email address of the profile | | deviceId | string | `EC09B76E-B4EA-4583-983E-339EE1A8171E` | Unique identifier of the device | ## client.anonymousLogin An anonymous profile generated a new authentication token. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | deviceId | string | `EC09B76E-B4EA-4583-983E-339EE1A8171E` | Unique identifier of the device | ## client.simpleAuthLogin A user logged in with [Simple Profile Authentication](/developers/mobile-sdk/user-identification-and-authorization/simple-authentication) **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | deviceId | string | `EC09B76E-B4EA-4583-983E-339EE1A8171E` | Unique identifier of the device | ## client.tryToLogInToInactiveAccount A profile tried to log in to an inactive account. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | deviceId | string | `EC09B76E-B4EA-4583-983E-339EE1A8171E` | Unique identifier of the device | ## client.logout A user logged out from the website or mobile application. By default, this event is generated only when you use Synerise Registration-as-a-Service. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | ## page.visit A user visited a website. **Default retention**: 30 days **Retention guidelines:** Lowering the retention of this event affects the quality of AI recommendation models. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | og:\ | string | `"og:type": "website",` | OG tags of the site, if applicable (multiple parameters). | | product:\ | string | `"product:retailer_part_no": "d7b23c08-deb6-4df4-8ced-c9d4ce340f3a"` | `product` metadata are a type of OG tags | | ogTags | string | `{\"og:type\":\"website\",\"og:title\":\"Synerise\",\"og:url\":\"https://synerise.com/\",\"og:image\":\"https://example.com/image.png\",\"og:image:secure_url\":\"https://example.com/image.png\"}` | All the OG tags collected into a single string, if applicable | | ecookies | string | `true` | Informs if cookies were enabled at the time of sending the event | | title | string | `Synerise Hub` | Title of the website | | host | string | `sub-domain.domain.com` | Domain name or IP address of URL | | location | string | `/eu-projects` | Resource location | | user_hash | string | `8743b52063cd84097a65d1633f5c74f5 ` | If the *_ush* cookie is set, the value is stored here. | | identity | string | `email` | The way that the profile was identified | | identityHash | string | `-1896583966` | Identity hash is used to verify if the current user is the same as the last user who accessed a resource from the device. | | referrer | string | `synerise.com/careers` | The page that the user was on before being directed to the current resource | | refdomain | string | `synerise.com` | Referrer domain | | ref | string | `/careers` | Referrer location | | s_visits | string | `3` | Number of visits in this session | | visits | string | `82` | Total number of visits | | u24_visits | string | `7` | Number of visits in the last 24 hours | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## product.view A mobile application user viewed an item. This is equivalent to a `page.visit` event generated for an item's web page. **Default retention**: 30 days **Retention guidelines:** Lowering the retention of this event affects the quality of AI recommendation models. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | productId | string | `16874` | ID of the viewed item. Must be the same as the item's `itemId` in the item feed and `sku` in transaction events. | ## screen.view The mobile application rendered and display a new view. **Default retention**: 90 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | autotrackValue | string | `SampleApp.BarcodeViewController` | Identifier of the screen that was viewed | ## screen.click This event is sent every time a mobile application user clicks a clickable object from a view. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | screenName | string | `LoginView` | Name of the screen where the interaction occurred | | controlType | string | `button` | Type of the UI element that was tapped | | actionType | string | `close` | The action that the UI element performed | ## form.submit A website visitor has submitted a data form, for example a newsletter subscription. **Default retention**: 30 days **Retention guidelines:** Lowering the retention of this event affects: - In Automations and Communication: filters based on recent profile updates. - In debugging: - Investigating marketing agreement and attribute updates. - Investigating what forms were submitted and which data they changed. | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | | formType | string | `login_form` | Type of the form | | formFieldsMapping | string | `{\"skip\":\"skip\",\"skipAsAttribute\":\"skip-as-attribute\",\"email\":\"email\"}` | Mapping of the fields in the form | | formData | string | `{\"param\":\"value\"}` | Data sent in the form | .| snrs_* | string | `string` | `snrs_*` parameters are saved from the query parameters of URLs that open a page with the tracking code.
The exact parameters and their values vary depending on the medium and how the content with the link was generated by Synerise. | | Parameters added by Synerise Web SDK | various | n/a | If the event was sent from a web page or an email with a tracking code, [some parameters are added automatically](/docs/assets/events/event-reference/common-parameters#parameters-added-by-web-sdk). | ## client.hitTimer Timer events can be used to measure time between activities. They are implemented by your developers according to business needs. This event tells when a timer was used, there is no start/stop mechanism. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | ## client.shared A "share" button was used to share content, for example to social media. **Default retention**: 30 days | Parameter | Type | Example | Description | | --- | --- | --- | --- | | Base parameters | various | n/a | [Parameters that may exist in all events](/docs/assets/events/event-reference/common-parameters#base-parameters) | ## event.log This event is deprecated. It may still occur in some integrations. # Blocks The **Blocks** feature has been replaced with [Snippets](/docs/assets/snippets). As of June 16, 2025, the Blocks feature will no longer be available for use. # Synerise event reference This reference can be used to read events that exist in Synerise. It covers the default events and their parameters that are generated automatically, required in APIs/SDKs, and optional in APIs/SDKs. For instructions on how to send events, refer to the documentation of the API or SDK that you're using to send them.