# Create localized content Source: https://help.getvero.com/api-reference/broadcast-message-contents/create-localized-content /api-reference/campaigns-v2/campaigns-v2.yaml post /broadcasts/{broadcast_id}/messages/{message_id}/contents Creates localized broadcast message content by cloning the message's default content. `locale` is required. Fields you provide will override the cloned default. The `content` field must be exactly one of `mjml` (email), `html` (email), `text` (email and SMS), or `payload` (push). Content can only be created while the broadcast is a draft. Duplicate locales are rejected with `409 Conflict`. # Get localized content Source: https://help.getvero.com/api-reference/broadcast-message-contents/get-localized-content /api-reference/campaigns-v2/campaigns-v2.yaml get /broadcasts/{broadcast_id}/messages/{message_id}/contents/{id} Reads one content of a broadcast message, including the `content` attribute. # List localized contents Source: https://help.getvero.com/api-reference/broadcast-message-contents/list-localized-contents /api-reference/campaigns-v2/campaigns-v2.yaml get /broadcasts/{broadcast_id}/messages/{message_id}/contents Returns active content records (localization variants) for a broadcast message. Ordered with default content first, then localized content sorted by `locale` ascending and then `id` ascending. There is one content record per locale as well as a default. The list response omits `content`. Use the dedicated endpoint to retrieve the contents. # Update localized content Source: https://help.getvero.com/api-reference/broadcast-message-contents/update-localized-content /api-reference/campaigns-v2/campaigns-v2.yaml patch /broadcasts/{broadcast_id}/messages/{message_id}/contents/{id} Partially updates localized broadcast message content. Optional `content` must be exactly one of `mjml`, `html`, `text`, or `payload` as the UI infers the editor type from that key. Content can only be updated while the broadcast is a draft. You cannot add a `locale` value on the default message content and you cannot clear the `locale` field on a localized content record. Duplicate `locale` values are rejected with `409 Conflict`. # Create a message Source: https://help.getvero.com/api-reference/broadcast-messages/create-a-message /api-reference/campaigns-v2/campaigns-v2.yaml post /broadcasts/{broadcast_id}/messages Creates an additional message (A/B test arm) on a draft broadcast by cloning the control message's default content (`subject`, `body`, `sender`). Optionally provide `from`, `reply_to` and `content` (`subject`, `preheader_text`, `name`, `body`) fields to override the cloned defaults. Editable only while the broadcast is a draft. # Get a message Source: https://help.getvero.com/api-reference/broadcast-messages/get-a-message /api-reference/campaigns-v2/campaigns-v2.yaml get /broadcasts/{broadcast_id}/messages/{id} Reads one message (A/B test arm) of a broadcast. # List messages Source: https://help.getvero.com/api-reference/broadcast-messages/list-messages /api-reference/campaigns-v2/campaigns-v2.yaml get /broadcasts/{broadcast_id}/messages Lists a broadcast's messages (A/B test arms), ordered by `position` ascending and then `id`. `from` and `reply_to` are email-only and will be `null` for non-email channels. # Update a message Source: https://help.getvero.com/api-reference/broadcast-messages/update-a-message /api-reference/campaigns-v2/campaigns-v2.yaml patch /broadcasts/{broadcast_id}/messages/{id} Updates a message's sender (`from` and `reply_to`) and `active` flag on a draft broadcast. Changes to the sender attributes apply across all of the message's contents. The control and the last remaining active message cannot be deactivated. `name`, `position`, and `test_name` are derived and are rejected with `422`. # Create a broadcast Source: https://help.getvero.com/api-reference/broadcasts/create-a-broadcast /api-reference/campaigns-v2/campaigns-v2.yaml post /broadcasts Creates an unscheduled broadcast draft for your project, optionally seeding the default first message and default content from `message.content.body`. At this time `audience` and `schedule` fields are rejected with `422`. # Get a broadcast Source: https://help.getvero.com/api-reference/broadcasts/get-a-broadcast /api-reference/campaigns-v2/campaigns-v2.yaml get /broadcasts/{id} Returns a single broadcast. Archived broadcasts return 200 with `status: "archived"`. # List broadcasts Source: https://help.getvero.com/api-reference/broadcasts/list-broadcasts /api-reference/campaigns-v2/campaigns-v2.yaml get /broadcasts Lists broadcasts for your project, returning the newest first. Cursor-paginated: no total count is exposed. Archived broadcasts are excluded by default but can be requested explicitly with `?status=archived`. # Update a broadcast Source: https://help.getvero.com/api-reference/broadcasts/update-a-broadcast /api-reference/campaigns-v2/campaigns-v2.yaml patch /broadcasts/{id} Updates broadcast metadata (`name` and a constrained `channel`). `audience` and `schedule` fields are rejected with `422`. A `channel` change is accepted only while the broadcast is a single-message draft whose current message is not yet sendable: switching channels will reset the message content body. This endpoint cannot be used to update broadcast content. See dedicated endpoints. # Create localized content Source: https://help.getvero.com/api-reference/campaign-message-contents/create-localized-content /api-reference/campaigns-v2/campaigns-v2.yaml post /campaign-messages/{campaign_message_id}/content Creates localized content by cloning the message's default content. Omitted fields inherit from the cloned default. Optional `content` uses exactly one of `mjml`, `html`, `text`, or `payload` (see `CampaignContentBody`). Content can only be created while the parent campaign is in `draft`. # Get localized content Source: https://help.getvero.com/api-reference/campaign-message-contents/get-localized-content /api-reference/campaigns-v2/campaigns-v2.yaml get /campaign-messages/{campaign_message_id}/content/{id} # List localized contents Source: https://help.getvero.com/api-reference/campaign-message-contents/list-localized-contents /api-reference/campaigns-v2/campaigns-v2.yaml get /campaign-messages/{campaign_message_id}/content Returns active content records for the message (one per locale / default). The list response omits `content`; use `GET .../content/:id` to load the body. Ordering: - default content first - localized content next, sorted by locale then id # Update localized content Source: https://help.getvero.com/api-reference/campaign-message-contents/update-localized-content /api-reference/campaigns-v2/campaigns-v2.yaml patch /campaign-messages/{campaign_message_id}/content/{id} Partially updates message content. Optional `content` uses exactly one of `mjml`, `html`, `text`, or `payload`; the API infers the editor type from that key. Content can only be updated while the parent campaign is in `draft`. Non-workflow messages reject duplicate locales with `409 Conflict`. # Get a message Source: https://help.getvero.com/api-reference/campaign-messages/get-a-message /api-reference/campaigns-v2/campaigns-v2.yaml get /campaign-messages/{id} Returns a single campaign message. # List messages Source: https://help.getvero.com/api-reference/campaign-messages/list-messages /api-reference/campaigns-v2/campaigns-v2.yaml get /campaigns/{campaign_id}/campaign-messages Lists a campaign's messages, ordered by position then id. # Get a campaign Source: https://help.getvero.com/api-reference/campaigns/get-a-campaign /api-reference/campaigns-v2/campaigns-v2.yaml get /campaigns/{id} Returns a single campaign for your project. This endpoint will continue to work but is being replaced by dedicated Broadcasts and Journeys endpoints. Refer to these new endpoints in this API reference. # Track Source: https://help.getvero.com/api-reference/events/track /api-reference/track/track.yml post /events/track This endpoint tracks an event for a specific user. If the user profile doesn't exist Vero will create it. **Deduplication**: We will automatically deduplicate events that are sent to our API with the same `event_name`, the same properties and that are tracked against the same user `id` within a five (5) minute window. This is designed to solve issues related to Javascript event handling and retries. You can force Vero to ignore deduplication and track every event by including a property within `data` with a unique timestamp. This will ensure the event is not seen by the Vero system as a duplicate due to the unique data. Variables on which duplication is based: 1. If you provide `data`, then the combination of `auth_token`, `event_name`, `identifier` and `data` is used. 2. If there is no `data` and you have provided a `check_id`, then the combination of `auth_token`, `event_name`, `identifier` and `check_id` is used. 3. If you have provided neither `data` or `check_id` then the combination of `auth_token`, `event_name` and `identifier` is used. # Get localized content Source: https://help.getvero.com/api-reference/journey-message-contents/get-localized-content /api-reference/campaigns-v2/campaigns-v2.yaml get /journeys/{journey_id}/messages/{message_id}/contents/{id} Reads one content of a broadcast message, including the `content` field. This is the only journey endpoint that emits a content body. # List localized contents Source: https://help.getvero.com/api-reference/journey-message-contents/list-localized-contents /api-reference/campaigns-v2/campaigns-v2.yaml get /journeys/{journey_id}/messages/{message_id}/contents Returns active content records (localization variants) for a journey message. Ordered with default content first, then localized content sorted by `locale` ascending and then `id` ascending. There is one content record per locale as well as a default. The list response omits `content`. Use the dedicated endpoint to retrieve the contents. # Get a message Source: https://help.getvero.com/api-reference/journey-messages/get-a-message /api-reference/campaigns-v2/campaigns-v2.yaml get /journeys/{journey_id}/messages/{id} Reads a single message in a journey. Returns message metadata only and does not include content bodies. # List messages Source: https://help.getvero.com/api-reference/journey-messages/list-messages /api-reference/campaigns-v2/campaigns-v2.yaml get /journeys/{journey_id}/messages Lists all message nodes within a journey. These are ordered by `node_id`, in ascending order. Returns message metadata only (including `id`, `from` and `reply_to`) but never content body attributes. The `from` and `reply_to` are email-only fields and will return `null` for SMS and push message nodes. # Get a journey Source: https://help.getvero.com/api-reference/journeys/get-a-journey /api-reference/campaigns-v2/campaigns-v2.yaml get /journeys/{id} Retrieves a single journey including its full graph. The graph include the `trigger`, `nodes` and `edges`. The graph is composed of nodes and edges. Messaging nodes expose message and content metadata but do not include content bodies or audience details. Archived journeys return 200 with `status: "archived"`. # List journeys Source: https://help.getvero.com/api-reference/journeys/list-journeys /api-reference/campaigns-v2/campaigns-v2.yaml get /journeys Lists the journeys in your project, sorted by the date last updated in descending order. Each item in the returned list is a summary including the `id`, `name`, `description`, `status` and timestamps of the journey, omitting the journey steps (represented as a graph) and message content. Results are cursor-paginated and do not include a total count. Archived journeys are excluded by default but can be requested explicitly with `?status=archived`. # API Overview Source: https://help.getvero.com/api-reference/overview Vero provides two REST APIs: the Track API for sending customer data, and the Campaigns API for managing campaigns programmatically. Send user profiles, properties and activity data to Vero. Build, update, and manage broadcasts and journeys via API. ## Base URL All requests contain the following base URL: ```bash API Base URL theme={null} https://api.getvero.com/api/v2 ``` ## Questions or problems Have questions or can't get something to work? Get in touch via [support@getvero.com](mailto:support@getvero.com). ## Track API The Track API is very stable. The current endpoints were released prior to 2016 and there have been no breaking changes since that time. ### Authentication Authentication against the Track API is via a valid Auth Token or Tracking API Key. Auth Tokens and Tracking API Keys should be kept secret. To generate and access API credentials: * In Vero 1.0, visit [Settings](https://app.getvero.com/settings/project) and scroll to the **Track API Keys** section. * In Vero 2.0, visit [Settings > Project > API Keys > Tracking Keys](https://connect.getvero.com/settings/project/api-keys?tab=track). Note that in Vero 2.0, "Auth Tokens" have been renamed to "Tracking API Keys". Requests are authenticated by providing a parameter called `auth_token` or `tracking_api_key` with each request. All API requests must be made over HTTPS. Calls made over plain HTTP will fail. ### Errors Vero uses conventional HTTP response codes to indicate the success or failure of an API request. Codes in the `2xx` range mean success, codes in the `4xx` mean there was an error in the data passed to Vero's API (such as missing parameters) and codes in the `5xx` range indicate an error with Vero's endpoint. | Code | Description | | :------------------------------ | :------------------------------ | | **200 - OK** | The request was successful. | | **400 - Bad request** | Bad request. | | **401 - Unauthorized** | Your credentials are invalid. | | **404 - Not Found** | The resource doesn't exist. | | **50X - Internal Server Error** | An error occurred with our API. | ### Sending data with requests Unless otherwise specified, request data should be passed to the API as JSON objects via `POST`. ### Our SDKs Refer to our [Developer Guide](/developer-docs/sdk) for more information on available SDKs. Note that the request samples used in our API documentation are auto-generated and do not reference our SDKs. ### Supported Track API integrations Many of our customers use tools like [Segment](https://www.getvero.com/integrations/segment-source/) or [Rudderstack](https://www.getvero.com/integrations/rudderstack/) to track and send data to Vero Cloud. See the full list of [Integrations](https://www.getvero.com/integrations/) for integrations that support this API. Use the "Data In: API" filter. ## Campaigns API **API in public preview**. This API is in public preview. Access is granted upon request. Please email [support@getvero.com](mailto:support@getvero.com) for access. ### Authentication Authentication against the Campaigns API is via a valid Campaigns API secret key. Once granted access you can generate an API key in your project settings: * In Vero 1.0, visit [Settings](https://app.getvero.com/settings/project) and scroll to the **Campaigns API Keys** section * In Vero 2.0, visit [Settings > Project > API Keys > Campaign API](https://connect.getvero.com/settings/project/api-keys?tab=campaigns). Note that in Vero 2.0, "Auth Tokens" have been renamed to "Tracking API Keys". Make sure you use a Campaign API key. A [Track API]() key will not give you access to this API. Requests are authenticated by adding an `Authorization` header with a value of either `Authorization: ` or `Authorization: Bearer `. ### Resource structure **Campaigns resource deprecation.** The `Campaigns` resource is being superseded by the more specific `Broadcast` and `Journey` endpoints. We will continue to support the `Campaigns` endpoints into the future and we'll notify you if this changes. | Resource name | Description | | :---------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Broadcast** | A one-off or recurring ad-hoc campaign specifying a schedule, a channel, an audience and at least one message. | | **Broadcast Message** | All `Broadcast` resources must have at least one message. You can test multiple messages against each other within a single broadcast. You can think of messages as an A/B test arm. | | **Broadcast Message Content** | You can add multiple contents to a `Broadcast Message` to support localized variants of your message content. | | **Journey** | A triggered campaign specifying a multi-step workflow made up of nodes and represented as a graph with edges. | | **Journey Message** | Lists all message nodes in a journey. This differs from the definition of `Message` used in relation to Broadcasts. | | **Journey Message Content** | You can add multiple contents to a `Journey Message` to support localized variants of your message content. | ### Feedback We want to hear your feedback on the Campaigns API. We're actively making changess. Please email us your suggestions via [support@getvero.com](mailto:support@getvero.com). # Edit Source: https://help.getvero.com/api-reference/tags/edit /api-reference/track/track.yml put /users/tags/edit This endpoint adds/removes tags to a user's profile. # Alias Source: https://help.getvero.com/api-reference/users/alias /api-reference/track/track.yml put /users/reidentify This endpoint lets you change a user's identifier (`id`). **Note**: The _alias_ method is used to merge two user identities, merging two sets of user data into one. This is an advanced method and may have unintended consequences. Please get in touch if you have questions regarding its usage. # Delete Source: https://help.getvero.com/api-reference/users/delete /api-reference/track/track.yml post /users/delete This endpoint lets you delete a user. **Warning:** When deleting a user all properties and activities will be lost forever. Deleted useres are not recoverable. # Identify Source: https://help.getvero.com/api-reference/users/identify /api-reference/track/track.yml post /users/track This endpoint creates a new user profile if the user doesn't exist yet. Otherwise, the user profile is updated based on the properties provided. **Stale data rejection**: Vero compares a timestamp against when each property was previously updated and rejects outdated changes. Provide `created_at` in `extras` to set this timestamp explicitly; if omitted, the time the request was received is used. This helps prevent out-of-order updates from overwriting newer data. **Update only**: If you include `update_only` set to `"true"` in `extras`, Vero updates an existing user profile but does not create a new profile if the user does not exist. # Resubscribe Source: https://help.getvero.com/api-reference/users/resubscribe /api-reference/track/track.yml post /users/resubscribe This endpoint globally resubscribe a user. # Unsubscribe Source: https://help.getvero.com/api-reference/users/unsubscribe /api-reference/track/track.yml post /users/unsubscribe This endpoint globally unsubscribes a user. # Community & Server-Side SDKs Source: https://help.getvero.com/developer-docs/community-sdks Official and community-maintained SDKs for integrating Vero with Ruby, PHP, iOS, and other platforms. In addition to the [JavaScript/TypeScript SDK](/developer-docs/javascript-sdk), Vero has official and community-maintained libraries for several other languages and platforms. ## Official SDKs Official Ruby SDK for server-side integration with Vero. Official PHP SDK for server-side integration with Vero. ### Ruby Install the gem: ```bash theme={null} gem install vero ``` Or add it to your Gemfile: ```ruby theme={null} gem 'vero' ``` For full setup instructions and usage, see the [GitHub repository](https://github.com/getvero/vero). ### PHP Install via Composer: ```bash theme={null} composer require getvero/vero-php ``` For full setup instructions and usage, see the [GitHub repository](https://github.com/getvero/vero-php). ## Legacy SDKs Legacy iOS SDK. No longer actively maintained. ## REST API For languages without a dedicated SDK, you can integrate directly with the [Track REST API](/api-reference/overview#track-rest-api). The API supports any language or platform that can make HTTP requests. ## Contributing Built an SDK or integration for Vero? We'd love to hear about it. Reach out to [support@getvero.com](mailto:support@getvero.com) to have it listed here. # Configuring Delivery Providers Source: https://help.getvero.com/developer-docs/configuring-delivery-providers You can configure Vero to send your email and push messages via multiple providers. ## Email By default Vero will send emails using a shared domain and shared IP addresses. You can configure a custom domain so that your emails are signed by `yourdomain.com`. You can also configure Vero to send emails via your own account with `Sendgrid`, `Mailgun`, `Mailjet` and more. Configure email providers and custom domains in Vero Connect. Configure a custom sending domain in Vero Cloud. ## iOS and Android Push To send iOS and Android push messages you must configure your application to handle incoming push messages. Vero does not currently provide an iOS or Android SDK but does provide an explanation and examples of the minimum code required to handle push messages. Push notifications are currently only available in Vero 1.0 (Cloud). Set up your application to handle push messages from Vero. # Getting Started Source: https://help.getvero.com/developer-docs/getting-started Set up Vero tracking in your application. Install the SDK, identify users, and start tracking events in minutes. ## Prerequisites Before you begin, you'll need: * A Vero account ([sign up here](https://getvero.com/get-started) if you don't have one) * Your **Tracking API key**, found in the [API keys settings page](https://connect.getvero.com/settings/project/api-keys?tab=track). ## Choose your integration method Recommended for websites and front-end applications. For React, Node.js, and other JavaScript build environments. For server-side integrations in any language. Ruby, PHP, and other community-maintained libraries. ## Install the JavaScript SDK Add the following to the `` section of every page you want to track, replacing `` with your API key. You can find your Tracking API key on the [API keys settings page](https://connect.getvero.com/settings/project/api-keys?tab=track) of your Vero account. ```html theme={null} ``` This SDK is also available as [an NPM package](https://www.npmjs.com/package/@getvero/tracking) for advanced use cases (e.g., integrating in React or Node.js applications). Refer to the package's README for more information. ## Identify a user When a user logs in, call `user.identify` with their `id` and `email` (both required). This adds or updates the user in your Vero data store. ```javascript theme={null} vero.tracker.user.identify({ id: "", email: "" }) ``` You can also attach additional channels and custom data to the user profile: ```javascript theme={null} vero.tracker.user.identify({ id: "", email: "", phone_number: "", channels: [ { type: "push", address: "", platform: "android" } ], data: { first_name: "", last_name: "" } }) ``` The `phone_number` property stores a phone number against the user's profile and is used as the delivery address for SMS messages sent via Journeys. Similarly, the `channels` array is used to register push tokens so Vero can deliver push notifications to the user's device. Once identified, users will appear in the **Profiles** section of your Vero account where you can view their properties, channel addresses, and activity history. Learn more about [user profiles](/vero-2/user-profiles/understanding-user-profiles). ## Track an event An event represents a user action in your application, such as viewing a product or completing a purchase. ```javascript theme={null} vero.tracker.event.track({ eventName: "viewed product", data: { product_name: "Red T-shirt", product_url: "https://www.example.com/products/red-t-shirt", } }) ``` You must call `user.identify` before calling `event.track`, unless you supply an `identity` object to the method. Once you call `user.identify`, the SDK stores the `id` and `email` in local storage for future requests. Tracked events will appear on the **Events** page in your Vero account, where you can view recent occurrences, event properties, and which campaigns use each event as a trigger. Learn more about [events in Vero](/vero-2/events/events-overview). ## Unidentify a user When a user logs out, call `user.unidentify` so future events are not associated with them. ```javascript theme={null} vero.tracker.user.unidentify() ``` # JavaScript SDK Reference Source: https://help.getvero.com/developer-docs/javascript-sdk Complete reference for all methods available in the Vero JavaScript/TypeScript SDK. This page covers all methods available in the Vero JavaScript/TypeScript SDK. If you haven't set up the SDK yet, start with the [Getting Started guide](/developer-docs/getting-started). ## Identify a user Both `id` and `email` are required. This adds or updates a user in your Vero data store. ```javascript theme={null} vero.tracker.user.identify({ id: "", email: "" }) ``` You can attach additional channels or custom data to the user profile: ```javascript theme={null} vero.tracker.user.identify({ id: "", email: "", phone_number: "", channels: [ { type: "push", address: "", platform: "android" } ], data: { first_name: "", last_name: "" } }) ``` You can also pass in an optional `extras` object as outlined in the [Track REST API](/api-reference/users/identify): ```javascript theme={null} vero.tracker.user.identify({ id: "", email: "", extras: { createdAt: "2023-05-30T04:46:31+0000", updateOnly: true, } }) ``` ## Track an event An event represents a user action in your application, such as viewing a product or completing a purchase. ```javascript theme={null} vero.tracker.event.track({ eventName: "viewed product", data: { product_name: "Red T-shirt", product_url: "https://www.example.com/products/red-t-shirt", } }) ``` You must call `user.identify` prior to calling `event.track`, unless you supply an `identity` object to the method. Once you call `user.identify`, the SDK automatically stores the `id` and `email` in the browser's local storage for future requests. You can also pass in an optional `extras` object as outlined in the [Track REST API](/api-reference/overview#track-rest-api): ```javascript theme={null} vero.tracker.event.track({ eventName: "viewed product", data: { product_name: "Red T-shirt", product_url: "https://www.example.com/products/red-t-shirt", }, extras: { source: "My application", createdAt: "2023-05-30T04:46:31+0000", } }) ``` ## Unidentify a user Call this when a user logs out so future events are not associated with them. ```javascript theme={null} vero.tracker.user.unidentify() ``` ## Alias / merge a user Merge two user identities into one. This is useful when an anonymous user logs in and you want to combine their activity. ```javascript theme={null} vero.tracker.user.alias({ newId: "" }) ``` ## Add or remove tags ```javascript theme={null} vero.tracker.tag.edit({ add: [""], remove: [""] }) ``` ## Unsubscribe a user ```javascript theme={null} vero.tracker.user.unsubscribe() ``` ## Resubscribe a user ```javascript theme={null} vero.tracker.user.resubscribe() ``` ## Delete a user ```javascript theme={null} vero.tracker.user.delete() ``` # Legacy JavaScript SDK (m.js) Source: https://help.getvero.com/developer-docs/legacy-javascript-sdk Documentation for the legacy m.js JavaScript SDK. We recommend using the current JavaScript/TypeScript SDK for new projects. This is the legacy `m.js` JavaScript SDK. We recommend using the [JavaScript/TypeScript SDK](/developer-docs/getting-started) for all new projects. The legacy SDK will continue to be supported but is no longer actively developed. ## Initialize the SDK Place the following JavaScript in the `` section of your HTML. We recommend including this on every page. Insert an active Vero API key. You can manage your API keys under Settings in your Vero Cloud account. ```js theme={null} var _veroq = _veroq || []; _veroq.push(["init", {api_key: "INSERT_API_KEY"}]); (function () { var ve = document.createElement("script"); ve.type = "text/javascript"; ve.async = true; ve.src = "//d3qxef4rp70elm.cloudfront.net/m.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ve, s); })(); ``` ## Add or update a user When adding a user, either an `id` or `email` value is required. All other attributes are optional and customizable. ```js theme={null} _veroq.push([ "user", { id: "123", email: "damienb@getvero.com", first_name: "Damien", last_name: "Brzoska", subscription: "medium", }, ]); ``` ## Track an event An event represents a user action in your application. You do not need to pass an `identity` object as outlined in the [Track REST API](/api-reference/overview#track-rest-api). Instead, you **must** call the `identify` SDK method above. A cookie is then stored and this identity is used by the SDK to form the full API request for you. ```js theme={null} _veroq.push([ "track", "viewed product", { product_name: "Red T-shirt", product_url: "http://www.yourdomain.com/products/red-t-shirt", }, ]); ``` The JavaScript SDK also supports passing the optional `extras` object as outlined in the [Track REST API](/api-reference/overview#track-rest-api): ```js theme={null} _veroq.push([ "track", "viewed product", { product_name: "Red T-shirt", product_url: "http://www.yourdomain.com/products/red-t-shirt", }, { source: "My application", created_at: "2024-08-01 10:05", }, ]); ``` ## Alias / merge a user The alias method merges two user identities into one. This is an advanced method and may have unintended consequences. Please get in touch if you have questions regarding its usage. ```js theme={null} _veroq.push([ 'reidentify', { '456', // The new user ID '123'// The old user ID }]); ``` ## Add or remove tags Tags are one way to assign states or temporary attributes to users. For new use cases we encourage you to update a user attribute rather than use a tag. ```js theme={null} _veroq.push([ "tags", { id: "123", add: ["prospect"], remove: ["customer"], }, ]); ``` ## Unsubscribe and resubscribe Supply the user's `id`. In this example, `123` is the `id`. ```js theme={null} _veroq.push(["unsubscribe", "123"]); ``` ```js theme={null} _veroq.push(["resubscribe", "123"]); ``` ## Delete a user Users cannot be deleted via the legacy JavaScript SDK. Use the [Track REST API](/api-reference/overview#track-rest-api) or the [current JavaScript SDK](/developer-docs/javascript-sdk) instead. # Vero Developer Guide Source: https://help.getvero.com/developer-docs/overview Vero platform overview Vero is a customer engagement platform for product and marketing teams at B2C and product-led B2B businesses. Vero works best for post-signup use cases where you have a solid, clear "identifier" for the users of your software. ## Start here Install the SDK, identify users, and track your first event. Understand how Users, Events, and Campaigns work together in Vero. ## SDKs and APIs Full reference for all methods in the JavaScript/TypeScript SDK. Official and community-maintained libraries for Ruby, PHP, and more. Track user profiles and events server-side from any language. Configure and manage campaigns, templates, and other data programmatically. **We want your feedback!** The Campaigns REST API is currently in preview. We'd love to hear how you plan to use it. Send your feedback to [support@getvero.com](mailto:support@getvero.com). ## More integrations Receive real-time notifications about message events and user activity. Set up and manage your email and SMS delivery providers. Documentation for the legacy m.js SDK. # Platform Core Concepts Source: https://help.getvero.com/developer-docs/platform-core-concept Vero's API is built around these core concepts. ## User A `User` represents a user of your product. Vero is best suited to post-signup use cases where you have a unique, database identifier for each of your users. You can use Vero for pre-signup use cases. Users can be tracked into Vero with an `email` address and no `id`, enabling you to `alias` and update a user's `id` once they sign up. Similarly, you can generate random, unique `id` values for non-signed sessions and `alias` these once a user logs in. ## Event An `Event` represents an action taken by a `User` at a specific point in time. Examples of common events include `Signed up`, `Clicked Button`, `Campaign Created`, `Order Completed`. Events represent the historical log of everything a user has done. Events typically relate to a `User` and some other object, e.g., an `Order`, a `Campaign`, etc. ## Campaign A `Campaign` links three things together: 1. A `Trigger`. 2. An `Audience`. 3. A `Message`. * Triggers include a single, scheduled time, a recurring schedule and event triggers. * You don't **need** a `Campaign` to send a `Message`. You can send a `Message` directly via the API if you'd like to. * `Reports` are only aggregated for `Campaigns`. We record all the opens/clicks/etc. for every `Delivery` and `Message` record but `Campaigns` are a way of reporting on a group of `Messages` together. ## Trigger A `Trigger` defines how a `Campaign` is initiated. Trigger types include: * `immediate` which sends the campaign as soon as it is launched. * `scheduled` which runs at a specific time. * `recurring` which runs on a cron schedule. We're building our new triggers such as `api`, `event` and more. ## Audience An `Audience` represents a list of one or more users. ## Message A `Message` represents a templated version of what will be sent to an `Audience`. A `Message` is designed to be multichannel and contains an array of `Content` objects: one for each channel the message may be sent to. Vero currently supports `email`, `push` `Content` and we are working to add `sms` and `http`. ## Content The `Content` object includes all of the fields required to successfully deliver a message on a specific channel. For example, email always requires a `to`, `subject` and `body` field. # Webhooks Source: https://help.getvero.com/developer-docs/webhooks Send real-time notifications about message events and user activity to external systems using Vero's webhooks. Webhooks allow you to send real-time HTTP notifications to your systems whenever certain events occur in Vero, such as a message being sent, opened, or a user unsubscribing. You can [add a webhook](/vero-2/integrations/setting-up-reporting-webhooks) in your Vero account under [Settings > Project > Reporting Webhooks](https://connect.getvero.com/settings/webhooks). ## Supported events Webhooks can be configured for the following events: | Event | Description | | :--------------- | :---------------------------------------------------------- | | **Sent** | An email has been sent by Vero | | **Delivered** | An email has been delivered to the recipient's email server | | **Opened** | A customer has opened an email | | **Clicked** | A customer has clicked a link in an email | | **Failed** | An email could not be sent due to an error | | **Bounced** | An email was not delivered (hard or soft bounce) | | **Converted** | A customer has converted on a campaign | | **Unsubscribed** | A customer has unsubscribed | | **Resubscribed** | A customer has resubscribed | | **Complained** | A customer has marked an email as spam | | **User created** | A user profile was created via the API or import | | **User updated** | A user profile was updated via the API or import | For full payload examples for each event type, see the [Vero 2.0 webhooks guide](/vero-2/integrations/setting-up-reporting-webhooks#webhook-payloads). # Vero 1.0 Documentation Source: https://help.getvero.com/index Welcome to the Vero 1.0 help documentation Looking for Vero 2.0 documentation? [Visit the Vero 2.0 docs](/vero-2/introduction). Find everything you need to get started with Vero, send your first campaigns, and make the most of the platform. ## Get started Follow our step-by-step guide to set up your account and send your first email. Add the Vero JavaScript library to your website. Learn how to create and send newsletter campaigns. Target the right customers with segmentation. ## Build and automate Trigger emails based on customer actions. Create multi-step automated email sequences. Use dynamic content to personalize your emails. Connect Vero to Segment, Zapier, and other tools. ## For developers Explore our SDKs and integration guides. View the full API reference for tracking users and events. ## Account and settings Set up your sending domain for better deliverability. Add team members and manage access levels. # Add team members to Vero Source: https://help.getvero.com/vero-1/account-billing-and-team/add-team-members-to-vero Invite team members, assign access levels, and manage permissions across projects. Administrator users can invite and remove team members to a Vero Account on the [Team page](https://app.getvero.com/account/team). By visiting **Account** > **Team** the administrator can invite team members by hitting the **Invite Team Member** button. vero.invite-team-member Once invited, administrators can grant each team member access to each different project. There are five levels of access: * **Administrator**. Can view/edit campaigns and customer data, can edit project settings and manage team members across ALL projects. * **View and edit**. Can edit campaigns and customer data, cannot manage team members. * **Deny customer data**. Same access as "View and edit" but removes access to customer data. * **Deny customer data and deny publish**. Same access as "Deny customer data" but further removes ability to publish/unpublish all campaign types. * **View only**. Read only access to campaigns and customer data. Cannot create or edit anything. An invited user will receive an email from Vero referencing your account and asking the new user to set a password. ## Revoking Access Administrators can revoke access for any team member by hitting the **Remove** button on the Team management screen. vero.remove-team-member # Paying annually Source: https://help.getvero.com/vero-1/account-billing-and-team/annual-plan-discount Save 10% on your Vero subscription by switching to an annual billing plan. Email and push messages will likely form a critical and ongoing part of your customer experience. And, if like many customers, you have a good idea of how your subscriber numbers will look over the next 12 months, you can choose an annual plan and save 10%. If you already have a paid Vero account and would like to change to an annual plan you can do so in the [change your plan page](https://app.getvero.com/account/billing/change-your-plan). If you are a new customer and are looking to pay on an annual basis, please contact [sales@getvero.com](mailto:sales@getvero.com). # Cancel your account Source: https://help.getvero.com/vero-1/account-billing-and-team/cancel-your-vero-account Steps for administrators to cancel a Vero account through the billing settings. To cancel your Vero account, login to your Vero Email Marketing account and go to [Account > Billing](https://app.getvero.com/account/billing). On this page select "Cancel your account". Note that only Administrators of a Vero account have access to this page. # Change your credit card Source: https://help.getvero.com/vero-1/account-billing-and-team/change-your-credit-card Update your payment method and credit card details in Vero. If you need to update the credit card on file for your Vero account, visit **[Account> Billing](https://app.getvero.com/account/billing)**. Update your card details by entering your card number, cardholder name and CVC number. We will email you when your card is about to expire to remind you to update your credit card details. # Choosing a subscription Source: https://help.getvero.com/vero-1/account-billing-and-team/choosing-a-subscription Compare Vero's pricing plans, features, usage limits, and annual billing options. We offer four pricing plans, each containing different features and access levels. Our [pricing page](https://www.getvero.com/pricing) shows the different features available on each tier. As well as specific features, each plan includes a total number of user profiles, a monthly message limit and a monthly data tracking limit. You can manually choose the plan that best suits the features and team access you need. We will *not* automatically move you between our four pricing plans. If you exceed the included usage limits within a tier we will charge you overage for your extra usage, rounded to the nearest thousand users. To keep things simple, we charge overage based on the one, "user", metric. See [Exceeding your usage limits](/vero-1/account-billing-and-team/what-happens-if-you-exceed-your-subscription-limits) for more details. ## Annual plans Email and push messages will likely form a critical and ongoing part of your customer experience. And, if like many customers, you have a good idea of how your subscriber numbers will look over the next 12 months, you can choose an annual plan and save 10%. If you already have a paid Vero account and would like to change to an annual plan you can do so in the [change your plan page](https://app.getvero.com/account/billing/change-your-plan). If you are a new customer and are looking to pay on an annual basis, please contact [sales@getvero.com](mailto:sales@getvero.com). # Downgrading your account Source: https://help.getvero.com/vero-1/account-billing-and-team/downgrading-my-account How to request a downgrade to a lower Vero billing plan. If you would like to downgrade from your currently selected billing plan you can email us at [support@getvero.com](mailto:support@getvero.com) and we will action the downgrade for you. # How the 30 day free trial works Source: https://help.getvero.com/vero-1/account-billing-and-team/how-the-30-day-free-trial-works What's included in your Vero trial and what happens when it ends. Thanks for checking us out! If you're interested in taking a deeper dive into Vero, you are able to start a 30-day trial which you can start here: [https://app.getvero.com/signup](https://app.getvero.com/signup). There are many awesome features to take advantage of during the trial, and it also gives you a great chance to poke around and get a feel for the product. During this time, you have access to all of Vero's features, including Newsletters, Workflows, Reports, and Push Notifications. There are absolutely no limitations during the trial, and you can add as many User accounts as you'd like. The only thing you are not able to send any live communications to customers until you upgrade over to one of our subscription plans. ## Features included Within the Vero trial, all of our features are included for you to get the most of the trial as possible. We're positive they will help make your messaging life easier! Check them out: * Newsletter (broadcast) campaigns * Customer segmentation * Automated workflows * Conversion tracking * Campaign reporting * Form builder * A/B testing * Design, branding & customization * Drag and drop template builder * Example email templates * Custom domain signing * Multi-language campaigns (internationalization) ## What happens after my trial? At the end of the trial (30 days from when it was created), if you decide to stick around, you will be prompted to upgrade to one of our subscription plans. The Admins can make the choice from the [Billing page](https://app.getvero.com/account/billing). You can also learn more about our pricing and plans on our [Pricing page](https://www.getvero.com/pricing). # Introducing Vero 2.0 Source: https://help.getvero.com/vero-1/account-billing-and-team/introducing-the-vero-2-preview Switch to the new Vero 2.0 interface and explore its features alongside Vero 1.0. ## The future of Vero You can now switch to a preview of the new Vero 2.0 interface from any existing Vero 1.0 (née Vero Cloud) project. This release is not just a glimpse into the future but a fully functional interface, allowing you to send messages right away. New Vero 2.0 UI One of the big benefits of the new UI is that it is compatible with all of the unique features available in Vero Connect. The result is a faster, cleaner, and more organized experience for all customers as Vero 2.0 has features from both Vero Cloud and Vero Connect, combined. On top of this, Vero 2.0 is designed with multi-channel capabilities at it's foundation. Starting in early 2024, we'll be releasing SMS and more channels, made possible thanks to the thoughtful design decisions leading up to this release. ## How to switch to and from Vero 2.0 Switching between the Vero Cloud UI you're familiar with and the new Vero 2.0 interface is easy. Open your Vero Cloud account, go to the "Project" menu, and select "Open in Vero 2.0 Preview." Open in Vero 2.0 preview You can seamlessly switch back using the "Return to Cloud UI" button in the project menu. Return to Vero Cloud ## What you can do in Vero 2.0 The new experience is **deliberately familiar** in lots of ways. We are taking the best of Vero and improving upon it. On top of this, the new UI brings several powerful new features, including: ### Load audiences from your data warehouse Import external audience Additionally, as Vero 2.0 inherits all functionality from Vero Connect, you are able to send single message campaigns to audiences loaded directly from external data warehouses. This means you can send single message campaigns to audiences loaded directly from Snowflake, Amazon Redshift or another data warehouse directly, without syncing and storing the data in Vero. Upon sending a campaign to an external audience, delivery, open, click, and other data seamlessly integrates with customer profiles in your Vero Cloud (Vero 1.0) account. This centralizes unsubscribes, enabling experimentation with direct data warehouse connections without setting up a new Vero Connect project. Read on to learn morea bout how this customer profile stitching works. ### Directly import CSV audiences Import CSV Another feature of Vero 2.0 allows you to send one-to-many campaigns by dragging in a CSV directly, eliminating the need for tagging users and creating segments. Direct import from a Google Sheet is also supported. ### SMS (beta) Campaigns in the new Vero 2.0 UI now support SMS. This feature is currently in private beta. Please reach out if you'd like access. We've partnered with CPaaS platforms like Twilio to deliver a robust SMS platform to our global customer-base. We'll be sharing more about SMS soon. ...and there's a lot more to come! ## Feature comparison We're adding new features all-the-time and our goal is that, in the not-too-distant future, **all customers will spend all of their time in the Vero 2.0 UI**. In the interim, here's a breakdown of each core Vero Cloud (Vero 1.0) feature and what is currently support in the new Vero 2.0 UI. * **Home.** New in Vero 2.0. * **Campaigns.** * **One-off and scheduled triggers**. Replaces "Newsletters" in Vero Cloud. * **Recurring triggers**. * **Event triggers**. Not supported in Vero 2.0 *at this time*. Coming soon. * **Templates.** Fully backwards compatible **except** for `vero-editable` templates. * **Drag-and-drop, HTML, plain text templates**. Can be in Vero 2.0 or Vero Cloud can be edited in either UI. * **`vero -editable` templates**. Not supported in Vero 2.0. Editing a `vero-editable` template in Vero 2.0 will convert it to a HTML template. * **Activity.** Previously known as "Logs". * **Message-related activity.** Vero 2.0 supports all message-related activity, e.g. sent, delivered, opened, clicked logs. * **Event-related activity.** Vero 2.0 does not yet support event-related activity, i.e. customer events you're tracking. * **Audiences.** Not supported in Vero 2.0 *at this time*. Coming soon. * **Data Sources.** New in Vero 2.0. * **Channels.** Replaces the "Email Providers" and "Push Providers" menus in the Vero Cloud "Settings" UI. * **Subscriptions.** Replaces the "Customers" menu. * **Customer profiles**. Fully backwards compatible. All customer records visible in Vero Cloud are visible in Vero Connect. * **Customer "properties"**. Not supported in Vero 2.0 *at this time*. * **Customer "events"**. Not supported in Vero 2.0 *at this time*. * **Settings.** Backwards compatible. Settings that are available in Vero 2.0 are all backwards compatible. More settings are being added. ## Understanding customer profile stitching ### How Vero Cloud stores customer data In Vero Cloud, customer records are stored in Vero's internal database. Whenever you add a customer record you can also add: * **Properties**. Attributes such as `first_name`, `last_name`, etc. added to the customer profile. * **Events**. Data tracking what users did and when they did it as `Signed up`, `Attended webinar`, etc. Whether added [via the API](/api-reference/overview#track-rest-api) or [via CSV](/vero-1/importexport/import-a-list-of-customers-via-csv), you must define an `email` and/or `id` field. The `id` must be a unique value representing that customer and can be the `email` value. When adding data about a customer in the future, using this `id` or `email` enables you to append data without creating new, duplicate customer records. This is called "identity stitching". Vero will also use this `id` and `email` to correctly "stitch" together all message delivery logs (sent, delivered, opened, clicked, etc.) ### Vero 2.0 external audiences feature The Vero 2.0 UI includes several new features. An exciting new feature is the ability to connect to **external** data sources such as AWS Redshift, Google BigQuery, Snowflake and beyond. When loading an audience from any of these **external** data sources, you manually import the fields you want. You must import both an `id` **and** an `email` field when importing an audience (the UI will not let you import and audience without these). When using external audiences **customer attributes are not stored in Vero's internal database.** The only data stored in Vero's internal database is: * The `id` and `email` values. * Message delivery logs (sent, delivered, opened, clicked, etc.) ### How data is stitched between the two UIs Whilst the new Vero 2.0 UI doesn't (yet) support viewing or updating customer **properties** and **events** (via the API or CSV) it **does** support viewing: * Subscription status (subscribed/unsubscribed). The Vero 2.0 UI will show these **for all customer records** , regardless of whether they were created in Vero 2.0 or Vero Cloud. * Message send logs (sent, delivered, opened, clicked, etc.). The Vero 2.0 UI will show these logs for campaigns sent with the Vero 2.0 UI (at this time). As a result, it's important that any audiences imported from an external data source **can be stitched together** with any customer records you have previously uploaded in the Vero Cloud UI. When building an external audience, you **must** provide an `id` field. This `id` field is used to find and stitch records based on ### An example, for clarity Imagine you've previously added two customer records using the Vero Cloud UI (added via API or CSV): 1. `id`: `a@yourdomain.com`, `email`: `a@yourdomain.com` 2. `id`: `1234`, `email`: `b@yourdomain.com` 3. `id`: `5678`, `email`: `c@yourdomain.com` You switch to the new Vero 2.0 UI and import **an external audience** from Snowflake. In your audience you have customer rows as follows: 4. `id`: `1234`, `email`: `d@yourdomain.com` 5. `id`: `9012`, `email`: `a@yourdomain.com` 6. `id`: `c@yourdomain.com`, `email`: `c@yourdomain.com` Based on this data, Vero will do the following: * \#4 will be stitched to #2. The `email` is **not** updated and will remain as `b@yourdomain.com`. * \#5 will create a new record. * \#6 will create a new record. It **will not** stitch to #3, even though the `email` values are the same. ### The future We are rolling out more features to simplify customer profile stitching in the new Vero 2.0 UI. This will make it easier to work with external data sources **and** with data stored in the internal Vero database. We can't wait to release them! # Setting up Two-Factor Authentication (2FA) Source: https://help.getvero.com/vero-1/account-billing-and-team/setting-up-two-factor-authentication Enable two-factor authentication to add an extra layer of security to your Vero account. Two-factor authentication (2FA) is a common way to add an extra layer of security on you account. If 2FA is enabled on your account, during login you will be asked to enter a generated code (one time code) to complete authentication. To use 2FA you will need a One Time Code generator such as Google Authenticator, Authy, or One Time Password. **How to setup 2FA** To enable 2FA on your account, navigate to the [security settings](https://app.getvero.com/account/security "Account security page in Vero") page and click on *Enable Two-Factor Authentication*. security page 1. Scan the QR code with your chosen one time code generator app. 2. Enter the generated code into the *One Time Passcode* box. 3. Enter your password and click *Confirm and Enable Two-Factor*. 2fa setup page In the next step, you will be shown a list of recovery codes. Keep a record of these recovery codes in a safe place, these codes can be used to gain access to your account in the case that you cannot use a One Time Code. Hit the *Return to security settings* button to continue. recovery codes 2fa page 2 Factor Authentication is now setup on your account. Next time you login, after you enter your email and password, you will be asked to enter a One Time Code, generated by your chosen app. Simply open your One Time Code generator app, enter the generated code before the timer ends and hit *Submit*. **Using 2FA with a Google login** If you login using a Google account, you can setup 2FA on your [Google account settings](https://support.google.com/accounts/answer/185839). # View your past invoices Source: https://help.getvero.com/vero-1/account-billing-and-team/view-past-invoices Access, download, and configure email delivery for your Vero invoices. To view a copy of your monthly invoices, select **Account > Invoices**. **Note:** to receive your invoices by email monthly, add a "Billing email address" in this section. Each of our invoices can be saved as a PDF document. If you add your physical address Vero will render this on all past and future invoices. # What happens if you elect to pay annually? Source: https://help.getvero.com/vero-1/account-billing-and-team/what-happens-if-you-elect-to-pay-annually Lock in your email volume and save with annual billing. You can choose to pay annually by locking in your email volume. Read more about [locking in your pricing](/vero-1/account-billing-and-team/annual-plan-discount). # Exceeding your usage limits Source: https://help.getvero.com/vero-1/account-billing-and-team/what-happens-if-you-exceed-your-subscription-limits Understand how overage charges work when you exceed your plan's user, message, or event limits. ## For customers who signed up prior to June 2020 Customers who signed up prior to June 2020 are grandfathered on the plans they chose when they first paid. Vero will send you an email when you cross the customer or message thresholds over a rolling 30 day window. You will automatically be upgraded to the next tier, based on your increased usage. As a result, invoices are charged in arrears. You are charged at the "high watermark" for a given month, as upgrades reflect usage that has already occurred. Once you lower your message volume or delete customer records you can downgrade your plan using our UI. You can view your usage and manage your plan under [Account > Billing](https://app.getvero.com/account/billing). ## For customers who signed up after June 2020 We currently offer four pricing plans, each containing different features and access levels. Our [pricing page](https://www.getvero.com/pricing) shows the different features available on each tier: As well as specific features, each plan includes a total number of user profiles, a monthly message limit and a monthly event tracking limit. You can manually choose the plan that best suits the features and team access you need. We will *not* automatically move you between our four pricing plans. If you exceed the included usage limits within a tier we will charge you overage for your extra usage, rounded to the nearest thousand users. To keep things simple, we charge overage based on the one, "customers", metric. See the [Overage](/vero-1/account-billing-and-team/what-happens-if-you-exceed-your-subscription-limits#overage) section below for more details. ## Overage Each of Vero’s plans defines an “overage rate” per thousand user records. Every thousand users also includes an extra 5,000 emails and 500,000 data points tracked. When you exceed one or multiple of the limits for these items included in your plan, we will charge you the overage at the relevant rate. For example, our "Starter" plan includes 2,000 users, 10,000 emails and 160,000 events tracked each month. Overage for the 'Starter plan' is charged at \$17 per 1,000 extra customers (which also includes 5,000 extra emails and 500,000 extra data points). If you selected the “Starter” plan, and in a given month: * Had 1,000 users in your account (under the limit), * Sent 12,000 emails (over the limit), and * Tracked 260,000 events (over the limit) ...we would calculate your invoice as follows: * You are over the message limit by 2,000, requiring an extra 1,000 users (each thousand users provides 5,000 emails you can send). * You are over the event limit by 100,000, requiring an extra 2,000 users (each thousand users provides 80,000 extra data points you can track). We would therefore charge you: * \$49/month for the Starter plan and included usage. * \$36 extra for that month, for an additional 2,000 users. If, in the next month, you only sent 8,000 messages and tracked 100,000 events, we would only charge you \$49/month, as your usage has dropped back within the limits. Note that when your usage reaches 80% of one of the usage limits (users, messages or data tracked) we will send you a notification email, to keep you informed. ## Paying Anually For each plan we offer an annual payment option. As annual payment allows us to plan our resources ahead of time, we pass these savings on to you: the price of each annual plan includes a 10% discount. If you exceed the included customer, messaging and subscriber limits on your plan, we will bill you overage at the normal, non-discounted, rate. ## Downgrading When you choose a plan you have access to extra features such as more users, multi-langauge campaigns, A/B tests and so on. If downgrading for usage reasons, because you are consistently using less than the included limits on your plan, be aware that some features may not be available on a lower plan. To downgrade your plan you can email us at [support@getvero.com](mailto:support@getvero.com) and we will action the downgrade for you. # What is a project? Source: https://help.getvero.com/vero-1/account-billing-and-team/what-is-a-project Separate your data into isolated environments for development, testing, and production. Vero projects are isolated environments. You can use them for different sites or products or environments. At Vero, we have a development, a Q\&A and a production project. Projects can be set to the following statuses by an Admin under [Settings>Project Details](https://app.getvero.com/settings/project): * **Live:** Emails will be sent to customers * **Test:** Emails will be sent to a single email address for testing * **Offline:** Emails will not be sent vero.cloud.projectstatus **Note:** You can copy data from one project to another. # Alias (reidentify) customers in Vero Source: https://help.getvero.com/vero-1/customers/alias-reidentify-customers-in-vero Update a customer's unique identifier using Vero's reidentify or alias endpoint. Before reading this article, we recommend you read [Identity stitching and resolution in Vero](/vero-1/customers/identity-stitching-and-resolution) to get a full understanding of how Vero manages customer IDs. Vero uses a unique `identifier` to record each customer in your Vero database. Vero's `reidentify`, or `alias`, endpoint allows you to update this unique identifier. A unique `identifier` must be assigned to a User when they are added to Vero. This is typically a custom string or an an email address. An example, typical use case for the `reidentify` method is when a customer is added to Vero from your public website *before* they have been assigned a unique identifier in your database (typically after a customer signs up). In this scenario, most people assign the new customer a random `identifier` or use their email as the `identifier`. Once a customer signs up, you will typically want to `reidentify` that customer so that they are identified using their database-assigned ID. Our [API reference](/api-reference/users/alias) has the full details of the `reidentify` endpoint. A quick example, using our Javascript library, is below: ``` _veroq.push(['reidentify', 'new_id', 'old_id']); ``` This will take the cookie that currently identifies a customer and reassign that cookie to use the `new_id` you've specified. It will also update the customer's record in your Vero database. Once `reidentified` you can safely refer to the customer using their new, assigned, ID with the standard `identify` and `track` endpoints. # Changing the email or ID of a customer using 'alias' Source: https://help.getvero.com/vero-1/customers/changing-the-email-or-id-of-a-customer-using-alias Use the re-identify or alias method to update a customer's ID or email address. *This only applies to customers using Vero's own Javascript API Library or Segment.com's Analytics.js Javascript library.* Sometimes you will track and cookie a customer using a random identifier, or their email address, and later you will want to update this value with a unique identifier (ID) from your own database or system. ## Re-indentify For example, if you had called the `identify` method and tracked a customer with the email **[tyrion.lannister@casterlyrock.com](mailto:tyrion.lannister@casterlyrock.com)** as a subscriber on your blog but, after they signed up for your free trial, wanted to identify them with your database identifier of **1285** , you can use Vero's `re-identify` method to update the customer's profile. To learn about the re-identify (or alias) method in detail, refer to our [API Reference Documentation](/api-reference/users/alias). An example of the re-identify method is below: ``` ``` ## Segments alias Segment's `alias` method works in the same way. Vero is the only email marketing platform that works with Segment and provides an `alias` method, giving you a lot of power and flexibility over how your customers are tracked. # How do I know if a customer is unsubscribed? Source: https://help.getvero.com/vero-1/customers/how-do-i-know-if-a-customer-is-unsubscribed Check a customer's subscription status on their profile page in Vero. When a customer is unsubscribed their profile and history will remain stored in Vero, however they will no longer receive any marketing emails. To check whether a customer is unsubscribed, visit their profile page. A grey button at the top of the profile page indicates that the contact is unsubscribed: vero.unsubscribed-button # How Vero cookies customers on your website using Javascript Source: https://help.getvero.com/vero-1/customers/how-vero-cookies-customers-on-your-website-using-javascript How Vero's JavaScript library uses cookies to track customers across sessions and devices. This only applies to customers using Vero's own Javascript API Library. Our backend libraries do not use cookies. When using Vero's Javascript API, you call the `identify` method whenever you get a customer's permission to email them (logged in customers, customers that opt in as they complete a checkout or customers that complete an explicit subscribe form). Having gotten your customers' permission to email them, they may not enter their email each time they return to your website. To help solve this potential information gap, when you call the following code: ``` _veroq.push(['user', {email: 'tyrion.lannister@casterlyrock.co'}]); ``` Vero adds a new customer to your Vero database and drops a cookie that identifies this customer on your website. This means that if the customer returns and does not enter their email, Vero is still able to track which pages they visit and actions they take. The cookie has an infinite expiration date. If a customer was to browse your website on another device (an iPad when they had previously used their laptop) then Vero would lose sight of that customer until they enter their email again. At that time, Vero will be able to see the customer on both devices. ## Advanced Vero automatically appends the following parameter to any link in an outgoing email. This enables the tracking of customers even if they don't provide their email address. ``` ?vero_id={{user.id}} ``` If the customer clicks on a link to your website (or any page on which you have Vero's main Javascript Library installed), the customer will be immediately identified via Vero, without you having to explicitly call the `identify` method. In this way you can track customers as they move between devices, or as you direct them to new landing pages. # How Vero handles bounces Source: https://help.getvero.com/vero-1/customers/how-vero-handles-bounces Learn how Vero manages hard bounces, soft bounces, complaints, and delayed bounces. Vero automatically handles the subscription status of customers whose emails have failed to be delivered or who have marked the message as spam. Customers are marked as 'Hard bounced' 'Soft bounced' or 'Complained' depending on the factors listed below. ## Hard bounce A hard bounce occurs when an email is rejected by the receiving mail server because the recipient’s email address is invalid, disabled, inactive or otherwise permanently unavailable. Vero automatically suppresses and marks users as "hard bounced" when we receive a `5xx` permanent failure message from the delivery provider. ## Soft bounce A soft bounce is a a temporary email delivery failure. They occur when the recipient's mail server returns that it cannot, at this time, receive emails on behalf of the recipient. A soft bounce can occur for a number of reasons: * The recipient's mailbox is full, * The receiving server is down or swamped with messages, * The message size is too large, * The recipient's settings do not allow for email from the sender, * Suspicious or spammy content has been detected. When an email address returns a soft bounce 10 times within a 30 day period, Vero automatically suppresses the customer and marks them as "Hard bounced". ## Complained A complained status happens when an email is marked as spam. Complaints have an impact on email deliverability so to maintain a good email delivery reputation future messages will not be sent to customers who mark a message as spam. ## Delayed Bounce A delayed bounce can occur when a recipient's mail server initially accepts the delivery of the email and then closes the connection with the sending server. Later (sometimes hours later), the recipient's mail server opens a new connection with the sending server and sends a failure message. These failures are to be treated as a bounce, however, often many of the expected fields in the bounce are missing and the bounce may not have all the typical details such as the message-id. In these cases, Vero does everything it can to properly suppress the email address in your project to prevent future sending to that address (and thus protect your sending reputation). # Adding (identifying) your customers Source: https://help.getvero.com/vero-1/customers/identifying-customers How to identify customers using Vero's JavaScript library to track their actions. Vero makes it easy to track your customers' lifecycle events. This could be signing up, viewing a product, adding a product to the shopping cart, using feature X, signing up for a paid subscription and so on. ## Why we need to identify customers Before you can track any events you need to identify your customers. When using our javascript library we make it easy: you simply identify the customer when they first sign up or login and we will store a cookie in order to track their actions from that point onward. For the sake of this help article we'll assume you're using our Javascript library. If you'd like more details on our API and more complex setup, refer to our [full API reference](/api-reference/overview#track-rest-api). ## When to identify customers You should identify a customer when they first subscribe to a newsletter or register for your service. To track a customer using the javascript library, you do the following: ``` _veroq.push(['user', { id: 'support@getvero.com', email: 'support@getvero.com' }]); ``` What this does is tell Vero to store a cookie for this customer with a unique identifier. It also prepares the library to track any future events against this particular email address. Customers are identified via their email address but you can also record specific attributes alongside this. These will show up in the customer's profile and common examples include the age, location and gender. Here's how you might record their age and location: ``` _veroq.push(['user', { id: 'support@getvero.com', email: 'support@getvero.com', age: 24, location: 'San Francisco' }]); ``` **Note** : You can override the current stored customer by simply re-identifying a customer. This will overwrite the cookie instantly. ## Capturing an email address We find that, generally, our customers are already handling their own newsletter subscription forms and logins. At this time the best way to technically capture the email address is to call the javascript code in the section above on a *thank you* page after a customer submits a newsletter subscription form or on a *welcome* page after a customer signs up. **Note** : It's best practice to re-identify a customer whenever they login. This ensures their cookie is up to date and that events are recorded against the correct customer, particularly if they share their computer with others. ## Platform-specific examples ### Magento When using Magento there are three places we'd recommend you identify a customer in order to maximise your ability to track their lifecycle events: After a customer submits your newsletter form, add the following javascript alongside the *thank you* notice on the homepage: ``` _veroq.push(['user', { id: 'customer@domain.com', email: 'customer@domain.com' }]); ``` When a customer signs up or logs into their account, add the above javascript on the *Dashboard* page. When a customer first enters their email as part of the checkout process. In most instances, stores collect their customers' details, including an email address, at step one of the checkout process. In this instance you should identify the customer by implementing the code above on the HTML page for step two. This way you can capture each step of a customer's progression through the checkout process. ### Facebook Connect If you use Facebook Connect to allow customers to sign up, you can easily identify the customer when the Facebook OAuth returns them to your site. Depending on your implementation, Facebook will generally redirect the customer back to your website in the following format: `YOUR_REDIRECT_URI#` In this instance you can use the Facebook `USER_ACCESS_TOKEN` to get more information about the customer. In order to get their email (which you need for email marketing!) you must request access to the 'email' scope. See the [Facebook Documentation](https://developers.facebook.com/docs/guides/web/) for further information. Once you have the customer's email, simply call the following code to identify them: ``` _veroq.push(['user', { id: 'customer@domain.com', email: 'customer@domain.com' }]); ``` # Identity stitching and resolution Source: https://help.getvero.com/vero-1/customers/identity-stitching-and-resolution Combine customer identifiers across devices and channels into unified profiles. **Identity stitching** (or identity resolution) is the process of combining customer identifiers across devices and channels into a single, unified profile in Vero. This ensures you can recognize a user across web, mobile, server, and third-party touchpoints — and message them without creating duplicates. In this help article we'll walk through the different ways you can "identify" a user (customer) and how you can stitch together data as customers move from device to device. ## **Identifiers and channel addresses** Each profile must have a single identifier: * **User Identifier`id`** – *required* ..and can have multiple channel addresses: * **Email address** `email` – optional, but required for sending email * **Phone number** `phone_number` – optional, required for sending SMS * **Device tokens (iOS/Android)** – optional, required for sending push notifications Learn more details about the makeup of a user profile ## **Stitching rules and configuration** Identity stitching rules determine **when Vero merges incoming data into an existing profile** and when it creates a new one. By default, Vero only stitches on the id. You can optionally enable different stitching options by going to **Settings** > **Advanced** in the Vero 2.0 UI. To understand how the different matching options work, lets look at two examples: ### **Example 1:** `id` + `email` In this example two profiles have been tracked with the same email address but two different `id`'s. ``` id, email 1234, support@getvero.com, first_name: Bob 5678, support@getvero.com, first_name: Robert ``` With this example, here’s how each configuration behaves: * **Default** * **Behaviour:** Profiles are matched only on id. If the id is new, a new profile is always created — even if the email matches another profile. * **Outcome:** Two profiles are created even though they share the same email. `id=1234, email=support@getvero.com, first_name=Bob` `id=5678, email=support@getvero.com, first_name=Robert` * **When to use:** Best if your id’s are stable. * **Option: Match customer via email and update the user’s profile** * **Behaviour:** Profiles are matched on `id` first, and if no match is found, Vero falls back to matching on `email`. When an email match occurs, the existing profile is updated with the latest properties. * **Outcome:** One profile is created, the second call merges on email. `id=1234, email=support@getvero.com, first_name=Robert` * **When to use:** Best when `email` is your most reliable user identifier. * **Option: Match customer via email and update the user’s profile and`id` is updated (Available on request - Contact support)** * **Behaviour:** Profiles are matched on `id`, then `email`. If an email match occurs, the profile is updated — and the id is replaced with the most recent one provided. * **Outcome:** One profile is created, because the last `id` wins when merging by email. `id=5678, email=support@getvero.com, first_name=Robert` * **When to use:** Use if `id`'s rotate/change. ### Example 2: `id` + Device token In this example two profiles have been tracked with the same device tokens but two different `id`'s. ``` id, device_token 1234, token1 5678, token1 ``` With this example, here’s how each configuration behaves: * **Default** * **Behaviour:** Profiles are matched only on `id`. Device tokens are ignored when deciding whether to merge. * **Outcome:** Two profiles are created even though they share the same device token. `id=1234, device_token=token1` `id=5678, device_token=token1` * **When to use:** Best if your id’s are stable and device tokens may be shared across multiple users. * **Option: Match customer via device token and update the user’s profile** * **Behaviour:** Profiles are matched on `id` first, and if no match is found, Vero falls back to matching on device tokens. When a token match occurs, the existing profile is updated with the latest properties. * **Outcome:** One profile is created, the second call merges on device token. `id=1234, device_token=token1` * **When to use:** Best when device tokens are the most reliable way to identify a user (e.g. mobile-first apps). * **Option: Match customer via device token and update the user’s profile and id is updated (Available on request – Contact support)** * **Behaviour:** Profiles are matched on `id`, then device tokens. If a token match occurs, the profile is updated — and the id is replaced with the most recent one provided. * **Outcome:** One profile is created, because the last id wins when merging by device token. `id=5678, device_token=token1` * **When to use:** Use if your system rotates or frequently changes `id` values, and you want the most recent id reflected in Vero. ### **Phone numbers** At this time you cannot configure Vero to use the `phone_number` as a field when stitching profiles together. However, when importing phone numbers, they will always respect the `id` and `email` fields when stitching as per the above descriptions. # Tracking customers across subdomains Source: https://help.getvero.com/vero-1/customers/tracking-customers-across-subdomains Configure Vero cookies to track customers across multiple subdomains. By default, Vero will cookie a customer on the current unique domain. If a customer is on `blog.getvero.com`, they will be cookied solely on this subdomain. If you choose, you can tell Vero to cookie the customer at the root domain. To do so, add the following line of code just before the `` tag on your website: ``` ``` This will ensure the cookie is stored at the root domain level. If you apply this code on all of your subdomians, your customers will be tracked between each of your subdomains. # What are customer properties? Source: https://help.getvero.com/vero-1/customers/what-are-customer-properties Store attributes like name, location, and custom data on customer profiles for segmentation. Customer properties are attributes that are attached as data to a user. A customer can have **multiple properties** which are located on their profile. You often get this data when a customer signs up to your site, fills out a survey or passes an order. These properties are key in Vero and let you segment your customer base with granularity. Vero has reserved some properties: | Attribute (type) | Description | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | id (String) | The unique identifier of the customer | | email (String) | The email address of the customer | | first\_name (String) | The first name of the customer | | last\_name (String) | The last name of the customer | | last\_name (String) | The last name of the customer | | gender (String) | The gender of the customer | | age (Number) | The age of the customer | | birthday (Date) | The birthdate of the customer. We recommend the ISO\_8601 format but also accept UNIX timestamps for convenience. | | phone (String) | The phone number of the customer | | description (String) | The description of the customer like their bio. | | title (String) | The title of the customer like "VP of Marketing" | | username (String) | The username of the customer | | website (String) | The customer’s website | | created\_at (Date) | The date the customer was first created. We recommend the ISO\_8601 format but also accept UNIX timestamps for convenience. Generated by Vero if not provided. It cannot be updated. | | tags (List) | List of the tags assigned to that customers, if any. | | locale (String) | The locale that define the customer’s language and country in the following format en\_AU for Australian English. | | city (String) | The city of the customer | | country\_code (String) | The country code of the customer | | country (String) | The country of the customer | | latitude (String) | The latitude of the customer | | longitude (String) | The longitude of the customer | | postal\_code (String) | The postal code of the customer | | region (String) | The region of the customer | | timezone (Integer) | The timezone of the customer | # What are tags? Source: https://help.getvero.com/vero-1/customers/what-are-tags Use tags to group customers by preferences, create static lists, and enhance segmentation. Each customer profile in Vero can have many tags. Tags are useful in situations where you want a customer profile to relate to many potential values. A good example would be customer preferences. For example, you might want customers to manually keep tabs on which customers are interseted in `shoes`, `skirts` and `trousers`. You could append tags to a customer's profile and use these tags to create segments. When creating your tags, they should contain no spaces or punctuation other than - and \_. Tags are a powerful way to enhance segmentation. They are useful for creating preference centres, emulating static lists or use Vero as a lightweight CRM, as tags can also be added inside Vero's user interface. ## Adding tags Tags can be added in three ways: 1. Using Vero's API. You can refer to our [API documentation](/api-reference/tags/edit) for more information. 2. Using CSV imports. See the section titled *Creating static lists with tags* below. 3. Via the UI. When browsing a customer's profile in Vero, browse to the *Tags* tab and select the **New Tag** button to add a tag. ## Removing tags Tags can be removed in two ways: 1. Using Vero's API. You can refer to our [API documentation](/api-reference/tags/edit) for more information. 2. Via the UI. When browsing a customer's profile in Vero, browse to the *Tags* tab and select the dropdown next to a tag and choose **Delete**. ## Creating static lists with tags A common usage of tags is to import and segment a **static group** of customers. You can import a CSV with a `tags` column, tagging each of the users with a tag, or tags, you specify. You can then create a segment using this tag and send out a newsletter. Adding multiple tags is possible by keeping one `tags` column and simply separating each tag with a semicolon. # Why is vero_id appended to links? Source: https://help.getvero.com/vero-1/customers/what-is-vero_id How Vero uses the vero_id parameter to enable cross-device tracking from email links. Vero automatically includes a parameter on each URL you add to an email campaign. When a customer clicks a link in a campaign, they are redirected to your site including this parameter. The parameter is named `vero_id` and includes the unique ID of the user who has clicked the link. This is the same ID value you have sent to Vero when adding them using a CSV or via the API. Adding this parameter enables Vero's Javascript library to automatically identify a user when they land on your site, even if they are not already identified. This enables cross-device tracking and ensures a more complete and accurate customer profile. ## Removing vero\_id from your links We can remove `vero_id` from the outgoing links in your emails at the click of a button. If you would like to remove `vero_id`, please email us at [support@getvero.com](mailto:support@getvero.com). When disabling appending `vero_id` to your campaigns, Vero's Javascript library will no longer automatically identify users when they click through from an email. If they have **already** been identified on the device they've used to click on the email, this will not have any impact, as they will already have a cookie stored. If they do not have a cookie already, this will mean they are not tracked for that session. # Adding a placeholder event Source: https://help.getvero.com/vero-1/event-tracking/adding-a-placeholder-event Create placeholder events to build campaigns before your tracking code is implemented. Sometimes when you are creating or planning email workflows you may not have the event you need tracked in your website or application yet. We don't think this should stop you from getting your campaigns set up correctly. It is possible to add events in Vero that act as placeholders for events that have not been tracked yet. This is useful for setting up and testing your email workflows before an engineer has added the Vero tracking code. ## Adding events in the events manager The [events manager](https://app.getvero.com/events) shows a list of events that have been tracked via the Vero API ([read about the Vero API here](/api-reference/overview#track-rest-api). This list also shows placeholder events created in Vero that have not been tracked yet. To create your own placeholder event, hit the **+ Add Event** button. vero.event-manager-add-event Give your event a name that has not already been used. You may also give this event a description to help other team members understand what this event is used for. vero.event-manager-add-event-module Hit the **Add event** confirmation button and your event will be created. You can now choose this event in your campaigns or segments. However, campaigns will not be fired and customers will not enter a segment based on this event until it has been tracked using the Vero library, read the [API documentation](/api-reference/events/track) to learn more about tracking events. **Bonus:** Each event in the events manager has a **Setup** tab which shows the code needed to track this event. ## Adding events in a campaign When designing a campaign, you can also type a new event name and quickly create an event by hitting 'create new event' straight from the trigger select box. vero.event-manager-new-campaign-event Similar to creating events in the events manager, these events are placeholders. Campaigns will not be triggered until the selected event has been tracked using the Vero library, [read the API documentation](/api-reference/events/track) to learn more about tracking events. # Testing an event with the events manager Source: https://help.getvero.com/vero-1/event-tracking/testing-an-event Manually fire test events in the events manager to verify your campaigns and segments. Vero is designed to send automated campaigns when a customers trigger a specific event. Usually these events are fired from your website or application using the Vero Javascript API or one of the many other methods you can read about in the [Vero developers guide](/developer-docs/overview). The best way to test an automated email workflow is to fire an event, which in turn triggers a campaign or results in a customer entering or exiting a specific segment. You can do this using our API, emulating a customer using your website or application **or** you can use the event manager to manually fire an event inside Vero. The benefit of this approach is that this can be used before or after you have installed the Vero library. ## Testing an event In the [events manager](/vero-1/event-tracking/testing-an-event), choose the event you would like to test. You can see which events have campaigns associated with them in the list or event details view. 1. Click on the **Test** button in the details view of the chosen event. 2. Choose a customer you would like to test this event for by searching for their customer ID or email address. You can also fire a test event for a new customer by choosing **New customer**. 3. Add event properties (optional) - If you want to pass a particular event property to populate dynamic merge tags you can add those properties by selecting the ‘Include event properties’ option. 4. Hit the **Send** button to send the test event. ## *Warning* *Remember that even though you are manually triggering the event, typically for testing, the event will show up in the logs for the chosen customer, and will affect the actual campaigns and segments you have setup. If you are testing this event on a project in**Live mode** , this may result in real customers receiving emails.* *We recommend you test events in a project set to**Test mode** to avoid accidentally sending emails to customers. Note that when testing in a test mode project, the customer may receive emails when the project is later changed to live mode, typically when these events trigger campaigns with large delays and emails are queued up well into the future.* # How to track pageviews in Vero Source: https://help.getvero.com/vero-1/event-tracking/track-pageviews-with-veros-api Enable pageview tracking with Vero's JavaScript library for advanced segmentation. *This article applies to users of Vero's Javascript library.* By default, Vero does not track anonymous users or pageviews. Vero's customers find pageview tracking is typically overwhelming, as is tracking anonymous users. As such, a user is added to your Vero database once they have been `identified` with the Vero Javascript library. At this point the user's activity is tracked. If you would prefer to track pageviews, it is as simple as initializing Vero's Javascript library with this functionality enabled. Once enabled, Vero will track an event called `Viewed page` with a property `url` equal to the full path the user visited. This allows you to use pageviews for segmentation. To turn pageview tracking on, add the following line to the main Vero Javascript library snippet (typically inserted just before the `` tag on your HTML pages). ``` ``` Once installed correctly you will start seeing the `Viewed page` event in the *Logs* section of your Vero dashboard. You can get a full copy of the Vero Javascript Library code from our [API reference](/developer-docs/sdk#javascript-sdk). # What are events? Source: https://help.getvero.com/vero-1/event-tracking/what-are-events Track customer actions like signups, purchases, and page views to trigger campaigns. Vero defines **events** as all the actions a customer is taking on your site. It could be everything from signing up to checking out, viewing a page to clicking a button, etc.. Vero lets you collect **event properties** along with any of these events. These are then used to provide more context and customize your email even more. vero.event-properties # Creating an HTML subscribe form Source: https://help.getvero.com/vero-1/forms/creating-a-html-subscribe-form Build HTML subscribe forms to capture customer details and trigger events in Vero. If you are coming from an email or messaging service provider such as Mailchimp, you will be familiar with the concept of HTML forms as a way to capture subscriber and customer details. These forms allow you to collect a subscriber or customer's email address, name, and other details easily using a little HTML on your website. ## Vero subscribe forms Vero also supports HTML forms, with one key difference. Traditionally, when a contact fills out an email form, they are added to a list. In Vero, rather than being added to a list, a customer that fills out a web form triggers an event. That event could be as simple as `Subscribes to blog`. You can then use this event to create a segment or [trigger a workflow](/vero-1/workflows/creating-a-new-workflow) to automatically send email and/or push messages: so you get twice the power from a single web form! ## Step 1. Create a form To generate a HTML form, head to *[Forms](https://app.getvero.com/tools/forms)* and you'll be shown Vero's point-and-click interface to create a form: vero.subscribe-form-properties Vero forms always collect the customer's `email address` by default, but you can collect any fields you want. You can view the fields you've used in previously, on the left-hand side. You must then define the event that will be triggered when the customer fills out this particular form. The final part of our form builder allows you to define what your customers see after completing the form: vero.subscribe-form-event-trigger ## Step 2: Copy and paste your new form Select 'Generate form' to generate the HTML for your new form: vero.subscribe-form-code Select **copy to clipboard** and paste this code in your CMS or website and you are good to go! You can define a screen/landing page to direct contacts to if they fail to complete the form successfully (i.e., enter an invalid email) or when they do complete the form successfully. Generally, this would be a custom "Thanks for subscribing" page. # Securing HTML subscribe forms Source: https://help.getvero.com/vero-1/forms/securing-html-subscribe-forms Protect your subscribe forms from bots and spam with Cloudflare Turnstile and other techniques. Whether you use Vero Forms or create your own, your HTML forms are exposed to the web, allowing any bad actor to attempt to submit data through them. Bad actors can use these forms maliciously in several ways: * To add spammy email addresses to your customer database. This can harm your deliverability, bloat your customer database, and cause you to email people you did not intend. * To use the inputs in your form to send spam or harmful content to real email addresses, leveraging your sending domain in order to make the emails look legitimate. This second attack is particularly malicious, and can damage your reputation both with email clients and your customers. Suppose you have an HTML form for email signups that includes a field for the email address, and the person's first name. This HTML looks something like: ```
``` And the form itself is simple: html form example This form also triggers an event called `subscriber_signed_up`. Because you care about keeping a clean email list and follow a double-opt in process, you have a workflow set up that is triggered by this event and sends an email to the signup ensuring that the user wants to continue receiving emails from you. This is a great practice to follow. Imagine the content for this email: > Hello `{{ user.firstName }}`, Thank you for signing up for our newsletter content. Please click this link to opt-in to continue receiving emails from us. Sincerly, Our Team The malicious actor can write a script that takes a bunch of email addresses they want to target and have a bot fill out your form hundreds or thousands of times. Imagine that instead of putting an actual first name into the firstName input in the form, they instead put the text: > ! You have won \$10 million dollars. Please visit [http://example.com/steal\_all\_your\_information](http://example.com/steal_all_your_information) to claim your prize. When the form is submitted, and the event is triggered you will now send out an email to whoever they have filled in your form with and it will begin with: > Hello! You have won \$10 million dollars. Please visit [http://example.com/steal\_all\_your\_information](http://example.com/steal_all_your_information) to claim your prize. It will be sent via your sending domain, using your from addresses and look completely legitimate to email clients and the people receiving the email. ## Automatic traffic filtering Any time someone submits a HTML form created in Vero, Vero will automatically detect if the submission is from a real person or a bot. To do this we are leveraging [Cloudflare Turnstile](https://www.cloudflare.com/en-au/products/turnstile/), an alternative to [Google’s reCAPTCHA](https://www.google.com/recaptcha/about/) that does not require interaction. Cloudflare Turnstile is build on the [Cloudflare Challenge](https://developers.cloudflare.com/waf/reference/cloudflare-challenges/) platform and uses several heuristics to determine if the traffic is from a human or a bot. These include IP addresses, browser fingerprinting, etc. We chose Turnstile so as not to introduce an extra step requiring manual interaction when forms are submitted, as every step matters for conversions. Users will be presented with an intermediate page, as per the screenshot below, which will automatically forward the user on if they’re determined to be a human and will deliver a failure message if the traffic is considered to be from a bot. Cloudflare may also present an interactive confirmation if at first the user is not automatically determined to be a human. Vero HTML form protection with Cloudflare This process should effectively protect forms from malicious traffic and is automatically built into Vero and every form submittal. You can disable Cloudflare Turnstile in your forms by choosing to edit the form, scrolling to the bottom and unchecking the box which says "Enable Cloudflare Turnstile". Enable Cloudflare Turnstile Checkbox ## Other ways to mitigate these issues There are several things you can do to help mitigate these issues: * When an email is directly triggered via an HTML form on your website, avoid using Liquid to personalize that email. If the email doesn't reference any user or event properties, the intended victim will instead receive a fairly harmless opt-in email. * Add a [honeypot](https://www.getvero.com/resources/add-a-honeypot-to-website-forms-to-reduce-spam/). The previous link goes into more detail, but bots largely process forms in an automated way and will not be able to tell which inputs in the form are hidden and which are visible. By adding an invisible input to the form, and then filtering those users out from your campaigns, you can prevent emailing addresses added by bots. * While a honeypot is good, [reCaptcha](https://developers.google.com/recaptcha) is better. reCaptcha does an amazing job at detecting bots attempting to use your sign up forms. Implementing reCaptcha is beyond the scope of this article, but it is highly recommened. * Add field validations. At it's simplest, this might be something like adding `maxlength='30'` to each input in your form. While bad actors can still work around this by altering the HTML on the page, it may catch some bots and prevent them from adding large amounts of text or long links. You can go further with javascript, and further still if you add a validation step on your own servers before sending that data to Vero. * If you use one of Vero's forms, leave the Enable Cloudflare Turnstile box checked when editing your form to enable [Cloudflare Turnstile](https://www.cloudflare.com/products/turnstile/) and help ensure the person submitting the form is a real human and not a bot. We strongly recommend taking every possible step to secure your web forms and prevent bad actors from abusing it. # Getting started guide Source: https://help.getvero.com/vero-1/getting-started/getting-started-guide A complete checklist for setting up your Vero account, from verification to your first campaign. Welcome to Vero! We're thrilled you've chosen to send marketing campaigns with us. We created this checklist to ensure you have the best experience using Vero. Since this is a team effort, we have added a flag 🚩 next to the tasks that may require you to call up your favorite IT guru for help. Ready to go from zero to email marketing hero? Follow our Getting Started Guide! **Use this guide to:** * **Verify your account** *You’ve tested us out and now you’re ready to dive in. We’re ready to verify you!* * **Set up your project** *Still need to do additional testing on some workflows? Ready to go live with newsletters? Have a subsidiary and a parent company? Set up multiple live, test, or offline projects so you can manage it all.* * **Add team members** *Add your team members to various projects with different access levels. Add an engineer or your entire marketing team, as Vero doesn’t put a limit on user logins.* * **Set up Domain Authentication** *We take deliverability seriously at Vero. Add your domain and verify your DNS records so we can send your emails with the highest levels of success.* * **Integrate with Vero's API** *Curious what your customers are up to? Install the Vero Javascript library to track data about your customers and their activities in your application or website, in real-time.* * **Import your data** *Have access to all your customer’s data history with a quick CSV import.* * **Import and create your first templates** *Creating new email designs takes a lot of effort, so we’ve made it easy for you to upload your existing templates into Vero and can start sending emails quickly.* * **Set up webhooks and integrations** *Gather data about your customers from day one by setting up webhooks or by using a simple Zapier integration.* ## Verify your account You’ve enjoyed setting up campaigns, segments, and templates and now you’re ready to start sending out some emails. Your next step is to be verified! We manually verify all new accounts to ensure that only reputable senders use our infrastructure, which is beneficial to all of our customers. It also gives us a chance to connect with you. Simply click the **Verify your account** button in the upper right-hand corner of your screen. We will manually verify your account within a few hours. vero.verification ## Set up your project vero.project-settings By default, your Vero account will have a project already created with the same name as your company. You can add as many projects alongside this as you’d like. Each project is its own siloed environment with its respective API Keys and user database. [Learn more about what a project is in Vero](/vero-1/account-billing-and-team/what-is-a-project). Projects are useful for testing as you can set them to different send modes: * **Live** All emails are triggered and sent normally. * **Test** Send all emails triggered by customers to a single email address (for testing). For newsletters, only a single email is sent to your test address. * **Offline** Data is still captured and emails are ‘triggered’, just not sent, so you can see them in the logs. By default, your project is set to **Test** as denoted by the orange color of the project in the sidebar. We recommend keeping your project in **Test** mode while you get set up, and until you want to send live emails to your customers. Once you have finished setting up your project by **Integrating with Vero's API** and **Importing your data** you can flip your project to **Live** mode to start sending real emails to your customers. **Tips:** * You can have as many projects as you like. For example, you can have a ‘Sandbox’ project (Test mode) linked to your test environment as well as a ‘Production’ project (Live mode) linked to your live environment. * You can also clone campaigns between projects by selecting '[Clone](/vero-1/newsletters/cloning-a-campaign)' in the dropdown menu. However, please note that customer data is isolated to each project and can not be cloned across to other projects. ## Add team members vero.team-page The creator of a Vero account is the primary administrator. Additional users can be invited to your Vero account by visiting the *[Account> Team](https://app.getvero.com/account/team)* (bottom left circle icon) page. Team members are sent an invitation email by an administrator, and invited to create their own password. For each team member, access can be granted to each individual project within Vero. vero.invite-access There are five levels of account access in Vero: * **Administrator** – users with this access level can manage your subscription, add other users, and have full access to data and campaigns. * **View / Edit** – users with this access level can create, delete, and otherwise manage all of your campaigns. They cannot manage your Vero subscription or add other team members. * **Deny customer data** – users will have the same access as "View and Edit but removes access to customer data. * **Deny customer data and deny publish** – users have the same access as "Deny customer data" but further removes ability to publish/unpublish all campaign types. * **View only** – users with this access level can view campaigns and campaign results, but cannot make changes. ## Set up Domain Authentication vero.delivery Deliverability, the process of getting emails into the inbox, is super important and we take it very seriously at Vero. By default, Vero works with [Mailgun](http://mailgun.com/) to help ensure we send your emails with the highest levels of success. **What Vero will do:** Vero will do the heavy lifting when it comes to allocating dedicated IPs and advising you on IP warm-up standards if your setup and scale demands this. Otherwise, this process is handled by Vero. 🚩 **What you will do:** Possibly the most important step is setting up domain authentication. Have your team administrator add the domain you want to send your emails from in *[Settings> Project details > Email Delivery](https://app.getvero.com/settings/project)*. Domain setup is per project, so make sure you configure your domain in the correct project. You have two options when adding a domain in Vero: **1.** Use Vero’s Managed Infrastructure to send your emails via your domain. **2.** Choose an existing provider (Sendgrid, MG, Mandrill) you already have an account with. vero.delivery-options If you would like to use Vero’s Managed Infrastructure, you can request the DNS records once you’ve added your domain. You can find this by clicking the *Request DNS Records* button. vero.requestdns These DNS records can be found by clicking **View DNS.** vero.verifydns Once you have added the DNS records to your domain you will be able to select the **Verify** button. Each verified record will present a green checkmark. vero.dnsverifiedcheck Once verified you're ready to start sending emails via your domain! **Recommendations:** * You may receive a yellow error sign next to your MX records. While MX records are not mandatory, we highly recommend adding them as they can affect delivery. *Please note that you can bring your own MX records or use those provided by Mailgun. However, you cannot use both on your domain.* * As a best practice, we also strongly advise that you configure DMARC. You can find more on this setup [here](https://help.returnpath.com/hc/en-us/articles/222480908-How-to-set-up-a-DMARC-record). You can also [read a detailed guide to domain authentication in Vero](/vero-1/settings/how-to-setup-a-custom-sending-domain). ## Integrate with Vero's API One of the reasons Vero is so powerful is its ability to track customer data and how they are interacting in your application or website, in real-time. Traditional email tools typically synchronize with databases or static lists at set intervals, however, tracking customer properties and customer events with Vero is where you’ll see the biggest wins. To get the most out of Vero, we recommend integrating with our API. Most customers install our Javascript library on their website, which automatically manages cookie tracking and other benefits, such as automatically managing API call failures You can find the Javascript library and installation instructions as part of our [API library documentation](/developer-docs/sdk). Our library is built so that it loads after your pages with redundancy in mind, so it will not slow down your site in any way. Many people also track extra customer properties or events using our backend API libraries, in Python, Ruby, PHP, Java, Perl and iOS. These can all be found in our [API library documentation](/developer-docs/sdk). You may use both the front-end Javascript library and extra API calls in tandem. **Tip:** The key to using our API is to identify customers using a unique identifier or ID (interchangeable terminology in the world of Vero). If you do not have a unique ID per customer, you can use the email address as the ID itself. 🚩 **What you will do:** 1. [Install the Vero Javascript library](https://www.getvero.com/api/javascript/) on your website. This includes making a Vero identify call whenever a customer signs up, fills out a form, or otherwise gives you permission to email them. 2. Determine whether you want to [automatically track pageviews](/vero-1/event-tracking/track-pageviews-with-veros-api) for customers that have been identified (by default, Vero does not). 3. Track specific events using our Javascript library. Focus on key lifecycle events such as Signed\_up, Viewed\_product, Used\_feature\_X. Events can be named **however you want** and are one of the keys to using Vero with power. 4. Track any extra events via our API on your backend using one of our backend libraries. ## Import your data After determining what data you are going to track on the front end, you’ll want to ensure that your data history is available in Vero. The easiest way to import data into Vero is to use a CSV. To do this, navigate to the [Import/Export](https://app.getvero.com/imports) section from the sidebar. vero.import-csv **Customers via CSV** You can import [customer CSV data](https://app.getvero.com/customers/csv/import) for each user, which includes both user properties and tags. Each column in your CSV can be imported to create a custom user property in Vero. Ensure that any properties you’re tracking via the API are the same nomenclature as those you are backfilling via CSV, and vice versa. ``` id, email, first_name, last_name, tags 54321, jon.snow@got.com, Jon, Snow, silver member 12345, tyrion.lanister@got.com, Tyrion, Lanister, gold member ``` **Events via CSV** You can also import past events (i.e. the interaction a user has with your application or website). To do this, you can [import a new event CSV](https://app.getvero.com/logs/csv/import). An Event CSV includes one line item for each event triggered by a customer, as well as the unique identifier (ID), and the time the event was triggered (in [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601)). Ensure you import data using event names that match the ones you are capturing via the API. ``` id, email, event_name, time 54321, jon.snow@got.com, signed_up, 2019-10-15 13:05+10 12345, tyrion.lanister@got.com, signed_up, 2019-10-15 13:05+10 ``` **Tips:** * We accept manual CSV imports up to 2GB. To import larger datasets, we recommend splitting them into separate files or contacting [support@getvero.com](mailto:support@getvero.com) for recommendations and assistance. * Make sure that you save your CSV with UTF-8 encoding. Often we see files being saved with a Latin character set (ex: ISO-8859-1). At this time, Vero only accepts files with UTF-8 encoding. **What you will do:** 1. Import any customers and their properties via CSV to backfill Vero and prime your segments. You can do this via the **[Import Customers](https://app.getvero.com/customers/csv/import)** page or by contacting support for larger data sets. 2. Import any customer **activity data** via CSV to backfill Vero and prime your segments. You can do this via the **[Import Events](https://app.getvero.com/logs/csv/import)** page. ## Import and create your first templates **Import existing templates** We know how much effort is required to create and maintain awesome email designs, so we've made it easy to upload your existing templates into Vero. Setting up templates correctly at the outset will enable you and your team to move quickly in Vero. The best place to start learning about how Vero handles templates is to read our extensive [Using HTML templates in Vero](/vero-1/newsletters/using-html-templates-in-vero) help article. When you import templates, Vero will parse them and give you warning messages regarding errors you may have made that can cause conflicts. This ensures that everything is set for your marketing team to use your templates seamlessly. As a helpful summary, here are the key points to understand about Vero’s templates: * You can find your templates under *[Settings> Templates](https://app.getvero.com/templates)*. * Once a template is uploaded, you can then select this template when creating any type of campaign in Vero. vero.choosetemplate **Note** : If using our legacy templates with vero-editables to edit predefined sections of the template, you can use Vero’s WYSIWYG point-and-click template editing interface to amend the content specifically for that campaign. [Read why this feature is being deprecated.](https://www.getvero.com/resources/introducing-drag-and-drop-email-content/) vero.pointandclick If you have questions regarding setting up your templates, or need assistance importing them from other email platforms, please get in touch with our support team at [support@getvero.com](mailto:support@getvero.com). **Create new templates with Vero's Drag and Drop editor** If you’d prefer a ‘no code’ solution, our drag and drop content editor is an accessible tool that your whole team can use to create responsive and compatible email templates. vero.d&dtemplate You can find more on using our drag and drop editor [here.](/vero-1/newsletters/using-the-drag-and-drop-editor) **What you will do:** 1. Export your custom templates from another email platform or as created by your design team. 2. [Upload](https://app.getvero.com/templates) your templates into Vero. 3. Create new templates using our drag and drop editor. ## Set up webhooks and integrations Collecting data about your customers is important, and we want you to have access to this information from the start. Which is why we’ve provided two different options to our customers: 1. **Webhooks** : For our more technical customers, our webhooks setup is easy-peasy. 2. **Zapier Integration** : If you don’t speak “code,” don’t worry. You can easily obtain this data through a simple integration. **Webhook Setup** vero.integrations-page Vero provides webhooks for the following events: * Sent (email has been sent by Vero) * Delivered (email has been delivered to the recipient email server) * Opened * Clicked * Bounced (hard and soft) * Converted * Unsubscribed * Resubscribed * User Created * User Updated Each of Vero's webhooks can be sent to a different notification address. To enable the webhooks, go to *[Settings>Integrations>Webhooks](https://app.getvero.com/settings/integrations/webhooks)* and enter the URL that you wish to receive each of the webhooks. vero.webhooks-urls Still have questions? You can find more on webhooks [here](/vero-1/integrations/setting-up-webhooks) or learn what they are by reading [our blog post on them.](https://www.getvero.com/resources/webhooks/) **Integration Setup** Zapier makes it easy to add customers and their properties as well as tracking events. In Zapier, an action is triggered by an event. For example, you can create the following Zap: vero.creatingazap You can then select the trigger event in Vero, and add the application you want to integrate with and the action event you want next. Currently, Vero offers several options for trigger events: * New User * Unsubscribe User * Update User * Email Delivered * Resubscribe User * Email Sent * Email Opened * Email Clicked * Email Bounced Interested in integrating with Segment or Google Analytics? Check out our integration guides: * [Segment](/vero-1/integrations/integrate-vero-and-segment) * [Google Analytics](/vero-1/integrations/integrate-google-analytics-utm-tags) # Creating a static list from a CSV import Source: https://help.getvero.com/vero-1/importexport/creating-a-static-list Create a static list of customers using CSV imports and tags for targeted campaigns. In Vero Cloud, Newsletters are sent to a segment of customers. You may occassionally want to send to a static list of customers. You can do this by using tags. To create a static list you can follow the following steps: 1. Create a CSV import with columns *id* , *email* , *tags.* 2. The *tags* column can contain any randomised name (ie. static\_list\_oct\_22). 3. Import CSV. 4. Create a segment with the condition "has tags with xx." 5. Include segment as audience on your Newsletter campaign. # CSV import FAQs Source: https://help.getvero.com/vero-1/importexport/csv-import-faqs Troubleshoot common CSV import issues like duplicate entries and encoding errors. ### My segment is showing a lower count than the count of my import This issue is likely due to one of the following. #### Duplicates Vero will still try and process every line of a CSV, even if there are duplicates, it will also display the number of rows processed on the import page. The best way to determine if you have duplicate users in your CSV is by using a tool in the spreadsheet application you are using. For example, Excel has a "remove duplicates" tool that will automatically do this for you. ### Users without an email address By default, the id or "identifier" is the key field to identify a user in Vero. If users are imported with id and no email, those user profiles will be updated. However, if your user does not have an email property they will not display in a segment. You can't segment on profiles that have no identifiable way to message them (email or push token). ## Receiving a 500 error after selecting a file for import This issue occurs when attempting to import a CSV that is not encoded in UTF-8. Often we see files being saved with a Latin character set (ex: ISO-8859-1). At this time, Vero only accepts files with UTF-8 encoding. # Exporting your campaign results Source: https://help.getvero.com/vero-1/importexport/exporting-your-campaign-results Export campaign performance data as CSV for single or multiple campaigns. A report can be exported through the main [Campaigns](https://app.getvero.com/campaigns) page for a single or multiple campaigns. After selecting campaigns, different date options can be chosen. vero.export-campaign-results These exports will provide a CSV file with raw campaign data. # How to export customer data Source: https://help.getvero.com/vero-1/importexport/how-to-export-customer-data Export customer lists from segments and campaign reports as CSV files. You can only export files up to 50,000 rows from the Vero UI. If you want to export more data, or data that you can't see how to export in the UI, please email [our support](mailto:support@getvero.com) and we'll do our best to do it for you as quickly as possible. ## Export customers You can export a list of customers and their properties that belong to any segment. To do this, select a segment and then click **Export** in the top right of the screen. The output file includes the ID, email address and all other properties of each customer in CSV format. vero.export-segment-button ## Export reports You can export the results of an email campaign. To do this, visit the [*Reports*](https://app.getvero.com/reports) menu and filter down to the campaign data you want to export. Click **Export** in the Engagement section. vero.export-campaign-report In both cases, a CSV file will be generated that you can download from the menu [*Import/Export*](https://app.getvero.com/exports) menu of the sidebar. # How to trigger an event via CSV Source: https://help.getvero.com/vero-1/importexport/import-a-list-of-contacts-actions-via-csv Backfill historical customer events by importing them via CSV. Vero tracks not only your contacts but also the **events** they perform in your application. To learn more about events, read [What is an Event?](/vero-1/event-tracking/what-are-events). There are times when you will want to backfill or manually add customer events. An example would be importing all of your contacts' past orders. When importing a list of past events, Vero supports three colums: * **email** (who did the event). * **name** (the name of the event, e.g. `Completes checkout`), and * **date and time** of the event (e.g. `2021-01-15 01:15+10`). You can also include event properties that are tracked along with the event as separate column titles. Here's an example of a CSV file that would update the contact profile of `tyrion.lannister@casterlyrock.com` with records of three checkout events and their item\_type properties in January 2022. ``` email, event_name, time, item_type tyrion.lannister@casterlyrock.com, Completes checkout, 2022-01-02 13:05+10, yellow_shirt tyrion.lannister@casterlyrock.com, Completes checkout, 2022-01-15 02:00+10, green_shirt tyrion.lannister@casterlyrock.com, Completes checkout, 2022-01-25 04:20+10, red_hat ``` To import a CSV select the '[**Import/Export**](https://app.getvero.com/imports)' menu item in the left sidebar. Select *Import Events* under the green Import button: vero.cloud.importbutton You'll then select the *Upload CSV* option to import your CSV file: vero.import-events You can only import `.csv` files. If you are using Microsoft Excel or Mac Sheets, select File > Save as... > CSV to export your data in the correct format. `.xls`, `.xlsx` and other formats will *not* be accepted when you try to upload your file. Before finalising the import, Vero will ask you if you want these events to *trigger emails in Vero*. By default, importing CSV files with a list of events is passive a these events will *not* trigger your automated campaigns. If you want to have these events act as triggers, simply tick the appropriate box as part of your import: vero.event-csv-checkbox ### Past and future dates If you had an automated behavioral campaign that went out 10 days after a customer triggers Completes checkout, and you import an event with a date of nine days ago and tick this box, they'll get the email one day from now. If they had taken the event 10 or more days ago, the user will *not* continue through the workflow and will be discarded immediately. It is not possible to trigger for a future date and time. You will receive an email once your CSV has been successfully imported, or if your CSV import fails. **You will always receive a confirmation email**. For unsuccessful imports, Vero lists the rows of the CSV that were affected. You should review these rows, export them to a new CSV and import them again. # Import a list of customers via CSV Source: https://help.getvero.com/vero-1/importexport/import-a-list-of-customers-via-csv Add or update customer profiles in bulk by importing CSV files. You can add or update customers in Vero using CSV. You can only import CSV files up to 50,000 rows. For files larger than this, please email [support@getvero.com](mailto:support@getvero.com) and we will help you import your data. Note: power users can run the following commands in a shell terminal (on Unix-based systems): `sed -n "1, 50000p" path/first/file > path/first_portion/file` to get the first 50,000 rows, then `sed -n "50001, 100000p" path/first/file > path/second_portion/file`, etc. to break your list up for import. ## Required data and user stitching To successfully import a CSV, it must contain at least an `id` or `email` column. ❗️ *Note: If you do not have the[**Match customer via email and update the users profile**](https://app.getvero.com/settings/labs) setting turned on, you **must** include an `id` column to avoid creating duplicate user profiles.* You can also include other columns for customer **properties**. An example would be a `first_name` column, or a `location` column. Vero will store these properties against the customer's profile. Here's an example of a CSV file that can be successfully imported: ``` id, email, first_name, last_name, location 1859, tyrion.lannister@casterlyrock.com, Tyrion, Lannister, Casterly Rock ``` CSV imports respect the "identity stitching" rules that are setup on your account. By default Vero will stitch (de-duplicate) user records based on the following rules: * Users are matched on `id` where provided. * When no `id` is provided, `email` is used as the `id` value and users are then matched based on the `id` value. You can configure your "identity stitching" rules under *Settings > Labs*. For example, you can set Vero to match directly on the `email` value. ## How to import a CSV To import a CSV click on [*Import/Export*](https://app.getvero.com/imports) menu at the left of the Vero dashboard. vero.csv-import In Vero, after import, this data would look like this on the profile of this customer: vero.profile-properties You can only import `.csv` files. If you are using Microsoft Excel or Mac Sheets, select *File > Save as... > CSV* to export your data in the correct format. `.xls`, `.xlsx` and other formats will not be accepted when you try to upload your file. After uploading your CSV file you'll be asked to check Vero has correctly detected each of your columns. If you have imported a CSV before, or connected Vero's API, we'll also ask you to map your columns to any properties that you have already stored in Vero. vero.csv-match When importing, Vero will use the `email` column to match customers' profiles and will update all other properties with the latest values from your spreadsheet. You will receive an email once your CSV has been successfully imported, or if your CSV import fails. **You will always receive a confirmation email**. For unsuccessful imports, Vero lists the rows of the CSV that were affected. You should review these rows, export them to a new CSV and import them again. # Import a list of unsubscribed customers via CSV into Vero 1.0 Source: https://help.getvero.com/vero-1/importexport/import-a-list-of-unsubscribed-customers-via-csv Bulk unsubscribe customers by importing a CSV with the unsubscribed tag. To learn the full process to import customers via CSV, read [Import a list of customers via CSV](/vero-1/importexport/import-a-list-of-customers-via-csv). If you are importing a significant number of customers the best way to unsubscribe them is to upload a CSV via the [*Import/Export*](https://app.getvero.com/imports) page. To do this create a CSV with the list of emails you want to unsubscribe in one column and in a second column with the header *tags* and the word `unsubscribed` in that column. ``` email,tags chris@example.com,unsubscribed james@example.com,unsubscribed rory@example.com,unsubscribed ``` Once imported, all of the customers that have the tag 'unsubscribed' will be marked as unsubscribed. # Install the Vero tracking script Source: https://help.getvero.com/vero-1/integrations/install-the-vero-tracking-script Add the Vero JavaScript library to your website to track users and events in real time. The recommended way to get your data into Vero is to use one of our API libraries to track **users** and **events** (users' actions or activity) in real time. You can then use all of this tracked data to automate and send targeted emails. Most businesses use our Javascript library because it is fast and simple to install on your website or application. If you don't want to use a Javascript tracking, we also have libraries for Ruby, PHP, iOS and more. Get all the details at [our developer documentation](/developer-docs/sdk). Its also possible to track customer data and events to Vero using our [Segment.com integration](/vero-1/integrations/integrate-vero-and-segment) or by using [Google tag manager](/vero-1/integrations/install-vero-with-google-tag-manager). For this article we'll assume that javascript is the easiest way to get data from your website or application into Vero. ### 1. Install the Vero Javascript library Get started by adding the main Vero Javascript snippet into your website above the `` tag on every page. Note that you're welcome to do this using [Google tag manager](/vero-1/integrations/install-vero-with-google-tag-manager), Vero's Javascript Library fully supports this. ``` var _veroq = _veroq || []; _veroq.push(['init', { api_key: '[your api key here]'} ]); (function() {var ve = document.createElement('script'); ve.type = 'text/javascript'; ve.async = true; ve.src = '//d3qxef4rp70elm.cloudfront.net/m.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ve, s);})(); ``` Log into your Vero account and visit the settings to obtain your tracking key. ### 2. Identify a customer Add users to your Vero account by calling this snippet on pages where the user is logged in, replacing the properties with your users data. You should also call this when users submit subscribe forms or otherwise give you permission to email them. This code will also update existing users data. [Learn more about identifying users](/api-reference/overview#track-rest-api) ``` _veroq.push(['user', { id: '123', email: 'damienb@getvero.com', first_name: 'Damien', last_name: 'Brzoska', subscription: 'medium' }]); ``` ### 3. Track an event Track your users actions anywhere on your website by calling this snippet of Javascript. This can go anywhere on any page and the name you give your events is up to you. Along with these events, you can track event properties (meta data) that become very useful when personalising your emails. We encourage you to track as many events as you can: it gives you more power. [Learn more about tracking events](/api-reference/events/track) ``` _veroq.push(['track', 'viewed product', { product_name: 'Red T-shirt', product_url: 'http://www.yourdomain.com/products/red-t-shirt' }]); ``` ### 4. View your data in Vero Once you've started tracking customer and their event data into Vero. You can view this data in the **Customers** , **Events** and **Logs** sections. # Install Vero with Google Tag Manager Source: https://help.getvero.com/vero-1/integrations/install-vero-with-google-tag-manager Set up Vero tracking using Google Tag Manager to identify customers and track events. Google Tag Manager is a fantastic product. It also makes it incredibly easy to get going with Vero. ## Step 1 Grab the following tag code below ``` ``` *Don't forget to change your API Key which you can find in the app under Settings > Project* ### Step 2 Head over to [Google Tag manager](https://tagmanager.google.com/) and click **New Tag**. Configure your options so that it looks like this vero.wf.gtmconfigure ## Step 3 Now that our library is setup you need to configure Vero to track your customers. In Google Tag Manager, create a new tag that loads on every page. Copy and paste this code: ``` ``` When setting up this code you need to tell us the current logged-in customer's ID and email address. The most common way to do this is to use a Macro in Google Tag Manager. *You may need your developer's help if they have not already configured a Macro.* Here's an example: vero.wf.gtmmacro Once that is configured you can ensure your tag looks like this: vero.wfgtmfinalscript ## Step 4 You're virtually setup and good to go! The final step is tracking events that are important to your business. This may take a series of tags, depending what you want to achieve. Here is an example that an eCommerce site could use. This tag is loaded on the first page of the checkout and tracks when a customer begins the checkout process! You can grab the example tracking code from vero.wf.gtmevent ## Conclusion And that's it! Now Vero will track your customers, events and get you well on your way. To ensure everything is working, check your [logs in the app](https://app.getvero.com/logs) - you should be able to see data flowing. # Integrate Google Analytics' UTM tags Source: https://help.getvero.com/vero-1/integrations/integrate-google-analytics-utm-tags Automatically add UTM parameters to email links for Google Analytics tracking. You can automatically append UTM parameters to outbound links in your email campaigns. Google Analytics, along with most analytics tools, use this data to attribute conversions to their correct source. To enable appending of UTM tags, visit the [*Settings > Integrations*](https://app.getvero.com/settings/integrations) menu. Click **View** next to the Google Analytics Integration. vero-google-integration Click **Add Google Analytics Integration** to turn this feature on. vero.google-analytics-view ## Editing the UTM tags Vero will append UTM tags in the following manner: * `utm_source` is, by default, set to `vero`. * `utm_medium` is, by default, set to `email`. * `utm_campaign` is populated with the name of the campaign being sent. * `utm_term` is populated with one of `Newsletter`, `Transactional` or `Behavioural`. * `utm_content` is populated with either the variation being sent. If you do not have an A/B test running, this will be `control`, otherwise it'll be the variation of your campaign (for example, `a` or `b`). You can edit the `utm_source` and `utm_medium` values appended by Vero on the *Settings > Integrations* menu page. ## Customising tags in an individual email campaign If you add your own UTM tags to any link, these will take precedence and override the default UTM tags that Vero will append above. For example, if you added a link as follows: ``` http://www.yoursite.com?utm_campaign=some_campaign_name ``` Then Vero would only append the `utm_source`, `utm_term` and `utm_medium` tags. It would not overwrite your custom `utm_campaign` value on this link. ## Disabling tags on an individual link You can also prevent a particular link from appending UTM tags by adding `data-vero="ignore"`. This will ensure that all other links are unaffected and still maintain their UTM tags. For example, add the setting to your link as follows: ``` Log into my Vero account ``` # Integrate Vero and Freshpaint Source: https://help.getvero.com/vero-1/integrations/integrate-vero-and-freshpaint Connect Freshpaint to send customer data and events to Vero for campaign targeting. Freshpaint is a customer data platform that standardizes customer data across your analytics and marketing tools. You can track data from Freshpaint into Vero to customize your segments and personalize your campaigns. To set up Freshpaint visit their Quickstart Guide. We suggest setting up events, identify and properties to get the most out of the platform. To integrate follow the steps below: 1. Login to your Freshpaint account. 2. Configure destination (to Vero). * Navigate to the destinations > apps page and scroll down to the Vero destination: vero.cloud.freshpaintverodesintation * Configure the “API Key and Auth Token”. These can be found in Vero’s project settings. vero.cloud.freshpaintapikeyauth 3. Verify data is flowing into Vero. Once you’ve clicked save, you can verify the integration by accessing Vero’s logs page. Here you’ll be able to view events that are streaming into Vero from Freshpaint. vero.cloud.freshpaintlogs # Integrate Vero and Segment Source: https://help.getvero.com/vero-1/integrations/integrate-vero-and-segment Send data between Segment and Vero for unified customer tracking and email analytics. Segment is a customer data platform that connects over 200 sources and destinations to empower your team to use their favorite tools to personalize campaigns, analyze customer engagement/ product usage, and more. You can integrate Segment and Vero in one of two ways, or both! 1. You can use Segment to collect data from multiple sources, including mobile apps, websites, servers, and cloud apps and send it to Vero to trigger personalized customer messages. 2. Vero can send email events including delivered, opens, clicks and unsubscribes to Segment and on to your other integrations or/and data warehouses. **Find out how to:** * Send data from **Vero to Segment** * Send data from **Segment to Vero** ## Send data from Vero to Segment 1. Login into [your Segment account](https://segment.com/login), and select a workspace 2. Add a new source, search for 'Vero' and click **Connect** **Add Vero as a Source in Segment** vero.integrations.segment.connect vero 3. Give your Vero source a name **Give your Segment Source a name** vero.integrations.segment.source setup 4. Select the Configuration drop-down and copy the **Write Key**. **Copy your Segment Write Key** vero.integrations.segment.config segment writekey 5. Log in to Vero and go to [Settings > Integrations](https://app.getvero.com/settings/integrations) 6. Select **View** next to the Segment integration 7. Paste or enter your Segment Write Key. You can find your segment write Key in your source configuration details. 8. Save. And your Vero events will now start sending to Segment! In Segment, select your **Vero** Source and from there you’ll be able to add Destinations for where you want to send Vero events. By sending Vero events via Segment to your data warehouse (such as Amazon Redshift or Google BigQuery) you can analyze your customer email engagement with the rest of your customer data using a BI or analytics tool. ## Send data from Segment to Vero Once you’ve tracked data in Segment, you can easily send it to Vero. **In your Segment workspace:** 1. Navigate to Destinations and select **Add Destination** 2. Search 'Vero' 3. Select ***Vero > Configure Vero*** 4. Add your Vero API Key and Auth Token You can find your unique API key and Auth token by logging in to your Vero account and navigating to [Settings > Project Details](https://app.getvero.com/settings/project). **Add Vero API Key and Auth Token in Segment** vero.integrations.segment.destination settings **Enter Vero API Key in Segment** vero.integrations.segment.enter vero apikey **Enter Vero Auth Token in Segment** vero.integrations.segment.enter vero authtoken 5. Turn on the Integration. Turn on your Vero integration by clicking the **Enable Integration** toggle. Any events or users that you track with Segment will then be available inside Vero automatically. **Turn on integration in Segment** vero.integrations.segment.turn on integration 6. Test your integration To make sure you are receiving data from Segment, check your Logs in Vero. 7. Voilà! You can now start sending emails and push notifications to your customers with the data sent to Vero via Segment. You can read more about this integration in [Segment's help documentation](https://segment.com/docs/integrations/vero/). # Integrate Vero and Snowplow Source: https://help.getvero.com/vero-1/integrations/integrate-vero-and-snowplow Send Vero email events to Snowplow for data warehousing and analytics. **This integration is officially supported by Snowplow.** You can read their integration guide [here](https://snowplowanalytics.com/blog/2018/07/17/snowplow-r107-trypillia-released/). # Integrate Vero and Snowplow [Snowplow](https://snowplowanalytics.com/) collects event data from multiple platforms, including web and mobile, and process it in real-time or batch configurations, at any scale. Snowplow then delivers your data to your data warehouse, so you can ask any question of your data and perform any analysis with your preferred analytics tool. Vero’s integration with Snowplow allows you to capture and process all email and push message events generated by Vero (including, deliveries, opens, clicks and conversions) inside the Snowplow platform, alongside your data from other sources, such as Zendesk and Stripe. ## Connecting Vero to Snowplow for data warehousing 1. Sign in to Vero and select the Vero Project from which you want to send data to Snowplow. 2. Click **Settings** at the bottom of the navigation menu. 3. Go to the [Integrations](https://app.getvero.com/settings/integrations) tab. 4. Click **View** next to the Custom Integration (Webhooks) option. 5. Select **Add Webhooks** Integration. 6. In the *Notification URL* field, you will need to provide the URI to your Snowplow Collector. The URL format for the Snowplow Collector endpoint is: `http:///com.getvero/v1` 7. **Save** 8. Once the webhook has been saved, you can select the individual events you want to track. Use the checkboxes to select events. We recommended selecting all events so that all events are tracked from the same point in time. **Vero Webhooks Overview** vero.integrations.webhooks.detail 9. **Save** and you’re ready to go! From now on, Vero will send all of the events it generates over to Snowplow. ## Creating Vero events tables for Amazon Redshift If you are running the Snowplow batch flow with Amazon Redshift, then you should deploy the relevant event tables into your Amazon Redshift. You can find the table definitions here: * [com\_getvero\_bounced\_1.sql](https://github.com/snowplow/iglu-central/blob/master/sql/com.getvero/bounced_1.sql) * [com\_getvero\_clicked\_1.sql](https://github.com/snowplow/iglu-central/blob/master/sql/com.getvero/clicked_1.sql) * [com\_getvero\_created\_1.sql](https://github.com/snowplow/iglu-central/blob/master/sql/com.getvero/created_1.sql) * [com\_getvero\_delivered\_1.sql](https://github.com/snowplow/iglu-central/blob/master/sql/com.getvero/delivered_1.sql) * [com\_getvero\_opened\_1.sql](https://github.com/snowplow/iglu-central/blob/master/sql/com.getvero/opened_1.sql) * [com\_getvero\_sent\_1.sql](https://github.com/snowplow/iglu-central/blob/master/sql/com.getvero/sent_1.sql) * [com\_getvero\_unsubscribed\_1.sql](https://github.com/snowplow/iglu-central/blob/master/sql/com.getvero/unsubscribed_1.sql) * [com\_getvero\_updated\_1.sql](https://github.com/snowplow/iglu-central/blob/master/sql/com.getvero/updated_1.sql) Make sure to deploy this table into the same schema as your events table. And, that's it - with these tables deployed, your Vero events should automatically flow through into Redshift. **Note** Vero data is sent to Snowplow in real-time. Snowplow isn’t able to load historical data from Vero. # Integrate Vero and Stitch Data Source: https://help.getvero.com/vero-1/integrations/integrate-vero-and-stitch-data Push Vero email events to your data warehouse via Stitch ETL. This integration is officially supported by Stitch. You can read their integration guide [here](https://www.stitchdata.com/docs/integrations/webhooks/vero). # Integrate Vero and Stitch Stitch is a modern extract, transform and load (ETL) platform for rapidly moving data from it's origin source to data warehouses such as Amazon Redshift, Google BigQuery, Snowflake and others. Follow the steps in this guide to push Vero data to your data warehouses via Stitch. ## Connecting Vero to Stitch ### 1. Add Vero as a Stitch Data Source To add Vero as an integration in Stitch: * Sign into your Stitch account and select **Add Integration** from your *Dashboard*. * Select **Vero**. * Name your integration. This name will display on the integration but, most importantly, it will be used to create the schema in your destination. We use something like `vero_production` for our *Vero Production* Vero project. In Stitch, using this example, you'd name the integration `Vero Production`. **Note:** Schema names cannot be changed after you save the integration. * Click **Save Integration**. ### 2. Generate a Vero Webhook URL Once you've saved the integration, Stitch will redirect you to a page that displays your Vero webhook URL and token. This will look something like this: **Generate a Stitch Data URL for Vero** vero.integrations.stitch.generate url This URL is to be **kept secret**. With this URL, data can be written to your data warehouse. As Stitch say, similar to an API key, keep this URL secret, and keep it safe. Note that you can generate a second URL at any time should it be required. Copy your new URL, click **Continue** and head over to Vero. ### 3. Set up Webhooks in Vero The last step is to setup webhooks in your Vero account with your new URL. To do this: 1. Sign in to Vero and go to the correct Vero Project. 2. Click **Settings** at the bottom of the navigation menu. 3. Go to the **Integrations** tab. 4. Click **View** next to the *Custom Integration (Webhooks)* option. 5. Click on **Add Webhooks Integration**. 6. In the *Notification URL* field, paste the Stitch-generated URL from the section above. 7. Click **Save**. 8. After the webhook has been saved, you can select the individual events you want to track. Use the checkboxes to select events. Our advice is to tick every box. **Vero Webhooks Detail** vero.integrations.webhooks.detail 9. Hit **Save** and you're ready to go! ## Replication Now that you've successfully connected your Vero and Stitch integration, Stitch will continuously replicate your webhook data into your data warehouse. Because Vero data is sent to Stitch in real-time, Stitch isn't able to load historical data from Vero. As such, Stitch's Vero integration uses *Append-Only Replication* , a type of replication where new data is appended to the end of your data warehouse tables. Existing rows are **not** updated – updates are simply added to the end of the table as new rows. Data stored this way can provide insights and historical details about how those rows have changed over time. You can read more about Stitch's replication approaches in their [documentation](https://www.stitchdata.com/docs/integrations/webhooks/vero). ## More information For more information regarding the schema created by Stitch when replicating Vero data, how to query for the latest data, and URL and webhook security, refer to Stitch's own help documentation regarding the [Vero to Stitch](https://www.stitchdata.com/docs/integrations/webhooks/vero) integration. # Integrate Zapier with Vero Source: https://help.getvero.com/vero-1/integrations/integrate-zapier-and-vero Connect Vero with thousands of apps using Zapier to sync customers and track events. **Note: We have now released our official Vero + Zapier integration. This version has been fully approved by Zapier. You can access the latest Zap[here](https://zapier.com/apps/vero/integrations).** **For those customers using a previous version of our Zap, there is unfortunately no way to automatically migrate to the new version. The old version will be kept running but will no longer be added to. In order to use new functionality and remove usage limits, please migrate to the latest version.** Zapier makes it easy to add customers and their properties as well as tracking events. One of the things that distinguishes Vero as a platform for communicating effectively with your customers is that it is a central data store of all of your customer interactions. By tracking who your customers are and what they do, Vero enables you to trigger automated campaigns, send more segmented one-off emails and get a better understanding of your customer base. This guide will explain how you can use the [Vero Zap](https://zapier.com/apps/vero/integrations). ## Zapier "Actions" In Zapier, an action is trigger by an event. For example, if you created the following Zap: Zapier and Vero ...the Action is the right hand side – it is the adding of a customer profile in Vero. The Vero Zapier plugin has the following actions available: Vero Actions in Zapier ### The basics Every action of the Vero Zapier plugin requires that you provide at least a unique customer ID. Some also allow you to provide an email. **Note:** the customer's ID must be unique and many Vero customers simply use the customer's email for the ID field. These are used to identify and update the customer’s profile in Vero. Mapping email in Zapier: Map Vero User ID in Zapier Result in Vero: vero.customerproperties ### Create or Update a User This action adds or updates a user's profile in Vero. After providing a customer ID and email (as above) you can provide custom user properties using the fields provided by Zapier. Properties are either added to a customer's profile or updated, if they already exist. Vero User Properties in Zapier ### Track an Event This is possibly the most powerful action available with the Vero Zapier integration. This action allows you to track an event in Vero. This signifies that a customer has done something. An example might be to trigger the event Help ticket received when a customer emails your help desk in Help Scout. To do this, you’d name the event you want to capture as so: Vero Event Name in Zapier You can also capture event properties when you track an event. Event properties can be inserted into emails or used for further segmentation. To do this, you can add the properties you want to track with the event using the Zapier form. Here’s an example: Vero Event Properties in Zapier ### Unsubscribe User or Resubscribe User This simple action allows you to unsubscribe or resubscribe a user in Vero. Simply provide their ID and the user will be unsubscribed or resubscribed as soon as this action is triggered. ### Update User's Tags This action allows you to add or remove tags from an individual user profile in Vero. Each user in Vero can have multiple tags. Tags are often used to give you the power to create manual segments or to record a customer’s preferences. To add or remove tags, simply use the Zapier form to record the tags you want. You can add and remove as many tags as you wish. **Note:** If a user does not have a tag and you remove it, nothing will happen. This is totally fine! Add Vero Tag in Zapier ## Zapier "Triggers" Vero currently provides nine triggers that you can use to drive actions in other Zapier plugins. If you wish the Vero Zapier plugin had extra triggers, drop us a line at [support@getvero.com](mailto:support@getvero.com). Vero Triggers in Zapier ### Update User Whenever a customer profile in Vero is updated (via CSV, via our API, via the update and tags calls, etc.) this trigger is called. You have access to the full customer and every customer property you have captured in Vero to date. ### Email Sent, Delivered, Bounced, Opened and Clicked These are triggered whenever an email is sent, delivered, bounced, opened or clicked in Vero. ### Unsubscribe User or Resubscribe User Triggered when a user unsubscribes or resubscribes in Vero, whether via an unsubscribe link, the Vero UI or the Vero API. We provide access to the email of the user along with this trigger. # Setting up and installing Vero Source: https://help.getvero.com/vero-1/integrations/setting-up-and-installing-vero Install Vero's API to track users and events, then set up your first campaign. Vero makes it easy to create email campaigns that target users based on what they've done (e.g. `Viewed a product`) or haven't done (e.g. `Checked out`) as well as segmenting based on user specific variables (e.g. their `country` or `age`). The basis for this segmentation is tracking real time data about each of your users, including their demographic data and what they do in your mobile or web application. There are two key steps to getting setup with Vero: 1. Tracking your users and what they are doing, and 2. Writing and sending your first email campaign ## Plug and play solutions Two ways you can quickly get data into Vero include [Segment](https://segment.com/) and [Zapier](https://zapier.com/) (in beta, please [email us](mailto:support@getvero.com) for instant access). If you're already setup on these platforms you'll find them a quick way to get going, without installing Vero's API directly on your website. ## Installing Vero on your site or in your app To get the most value out of Vero you should install our API and track what users do on your website or in your application in real time. You need some knowledge of either Javascript or another coding language in order to to integrate Vero's API. To understand how to set Vero up in detail read our [API documentation](/api-reference/overview#track-rest-api) or our [guide on installing Vero's javascript tracking script](/vero-1/integrations/install-the-vero-tracking-script). In summary, the Vero API has two key functions. The first is adding or updating a user in your Vero database. We call this `identifying` a user. The second is tracking what `events` a user takes. Events are defined by you and typical examples would be things like `Views a product`, `Begins checkout`, `Logs in`, `Subscribes to blog`, etc. ### Supported libraries You can use [Vero's API](https://www.getvero.com/api/) with any coding language. Recommended library: * [Javascript](/developer-docs/sdk#javascript-sdk) Other helper libraries: * [Ruby](https://www.getvero.com/api/ruby/) * [Python](https://www.getvero.com/api/python/) * [PHP](https://www.getvero.com/api/php/) * [Perl](https://www.getvero.com/api/perl/) * [iOS](https://www.getvero.com/api/ios/) For more help setting up our javascript library, read our ## Setting up your first campaign To get the most value out of Vero you should setup a triggered campaign. These are automated emails that are triggered when a customer takes a certain action, so they work whilst you sleep. There are three types of emails you can send in Vero: * **Newsletters** are emails that are sent at a specific time, to a specific group of users. * **Behavioral** emails are marketing emails that are sent when a user does or does not do a certain action. * **Transactional** emails are sent every time a user does something, such as `Resets their password`. To get the most out of Vero, try setting up each of these campaign types. # Setting up webhooks Source: https://help.getvero.com/vero-1/integrations/setting-up-webhooks Receive real-time notifications for email events like sends, opens, clicks, and bounces. ## Webhook Types Vero provides webhooks for the following events: * Sent (email has been sent by Vero) * Delivered (email has been delivered to the recipient email server) * Opened * Clicked * Failed * Bounced (hard and soft) * Converted * Unsubscribed * Resubscribed * User created * User updated * Complained ## Webhook Setup All of Vero's webhooks are sent to a single notification address. To enable the webhooks, go to *Settings > Integrations > Webhooks* and enter the URL at which you wish to receive the webhooks. vero.settings.integrations.webhooks For testing, you should check out [Request Bin](https://requestbin.com/) - it's a fantastic way to see the webhooks Vero (or any service) sends. You can click the **Test URL** button and Vero will send an example of a webhook to the URL you've entered. This ensures Vero has registered the URL correctly and data arrives. Once you have entered the URL you can choose which webhook events you want to track. ## Webhook format ### Webhooks structure for email events The follow list outlines each of the `type` values: * `sent` – When an email has been sent by Vero * `delivered` – When an email has been delivered to the ISP server * `opened` – When a customer has opened an email * `clicked` – When a customer has clicked an email * `failed` - When an email could not send due to an error (such as a bad Fusion response) * `bounced` – When an email has not been delivered to the ISP server * `converted` – When a customer has converted on an email campaign * `resubscribed`– When a customer has resubscribed * `unsubscribed` – When a customer has unsubscribed * `complained` – When a customer complains through their email client **Sent:** ``` { "sent_at":1435016238, "type":"sent", "user": { "id":123, "email":"steve@getvero.com" }, "campaign": { "id":987, "type":"transactional", "name":"Order confirmation", "group": "Order confirmation - Email 6", "channel": "email", "subject":"Your order is being processed!", "trigger-event":"purchased item", "permalink":"http://app.getvero.com/view/1/341d64944577ac1f70f560e37db54a25", "sent_to":"user@example.com", "variation":"Variation A", "locale":"en-US" }, "message_id": "20190730123456.1.1B72E094173067F0F@veromail.com" } ``` **Delivered:** ``` { "delivered_at":1435016238, "type":"delivered", "user": { "id":123, "email":"steve@getvero.com" }, "campaign": { "id":987, "type":"transactional", "name":"Order confirmation", "group": "Order confirmation - Email 6", "channel": "email", "subject":"Your order is being processed!", "trigger-event":"purchased item", "permalink":"http://app.getvero.com/view/1/341d64944577ac1f70f560e37db54a25", "sent_to":"user@example.com", "variation":"Variation A", "locale":"en-US" }, "message_id": "20190730123456.1.1B72E094173067F0F@veromail.com" } ``` **Opened:** ``` { "opened_at":1435016238, "user_agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", "type":"opened", "user": { "id":123, "email":"steve@getvero.com" }, "campaign": { "id":987, "type":"transactional", "name":"Order confirmation", "group": "Order confirmation - Email 6", "channel": "email", "subject":"Your order is being processed!", "trigger-event":"purchased item", "permalink":"http://app.getvero.com/view/1/341d64944577ac1f70f560e37db54a25", "sent_to":"user@example.com", "variation":"Variation A", "locale":"en-US" }, "message_id": "20190730123456.1.1B72E094173067F0F@veromail.com" } ``` **Clicked:** ``` { "clicked_at":1435016238, "user_agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", "type":"clicked", "user": { "id":123, "email":"steve@getvero.com" }, "campaign": { "id":987, "type":"transactional", "name":"Order confirmation", "group": "Order confirmation - Email 6", "channel": "email", "subject":"Your order is being processed!", "trigger-event":"purchased item", "permalink":"http://app.getvero.com/view/1/341d64944577ac1f70f560e37db54a25", "sent_to":"user@example.com", "variation":"Variation A", "locale":"en-US" }, "message_id": "20190730123456.1.1B72E094173067F0F@veromail.com" } ``` **Failed:** ``` { "type":"failed", "bounce_code":500, "bounce_message": "FusionBadResponse", "user": { "id":123, "email":"steve@getvero.com" }, "campaign": { "id":987, "type":"transactional", "name":"Order confirmation", "group": "Order confirmation - Email 6", "channel": "email", "subject":"Your order is being processed!", "trigger-event":"purchased item", "permalink":"http://app.getvero.com/view/1/341d64944577ac1f70f560e37db54a25", "sent_to":"user@example.com", "variation":"Variation A", "locale":"en-US" } } ``` **Bounced:** ``` { "bounced_at":1435016238, "bounce_type":"hard", "bounce_code":550, "bounce_message":"5.5.1 The email account that you tried to reach does not exist.", "type":"bounced", "user": { "id":123, "email":"steve@getvero.com" }, "campaign": { "id":987, "type":"transactional", "name":"Order confirmation", "group": "Order confirmation - Email 6", "channel": "email", "subject":"Your order is being processed!", "trigger-event":"purchased item", "permalink":"http://app.getvero.com/view/1/341d64944577ac1f70f560e37db54a25", "sent_to":"user@example.com", "variation":"Variation A", "locale":"en-US" }, "message_id": "20190730123456.1.1B72E094173067F0F@veromail.com" } ``` **Converted:** ``` { "type":"converted", "user": { "id":123, "email":"steve@getvero.com" }, "campaign": { "id":987, "type":"transactional", "name":"Order confirmation", "group": "Order confirmation - Email 6", "channel": "email", "subject":"Your order is being processed!", "trigger-event":"purchased item", "permalink":"http://app.getvero.com/view/1/341d64944577ac1f70f560e37db54a25", "sent_to":"user@example.com", "variation":"Variation A", "locale":"en-US" }, "message_id": "20190730123456.1.1B72E094173067F0F@veromail.com" } ``` **Resubscribed:** ``` { "type": "resubscribed", "user": { "id": 123, "email": "steve@getvero.com" } } ``` **Unsubscribed:** ``` { "unsubscribed_at":1435016238, "type":"unsubscribed", "user": { "id":123, "email":"steve@getvero.com" }, "campaign": { "campaign_title": "Order confirmation", "series_title": "Order Tracking", "channel": "email", "message_id": "20190730123456.1.1B72E094173067F0F@veromail.com", "email_subject": "Your order is being processed!", "variation_name": "Control", "template": "Order Template" }, } ``` Key things to note: * The `trigger-event` value will be present for Transactional and Behavioral campaigns and represents the event that triggered the campaign. *Note: Due to the sheer volume of webhooks we process daily, and our inability to guarantee the availability of external endpoints, Vero is unable to retry failed webhooks at this time.* ### Webhook structure for customer updates The webhook sent when a customer is created or updated shows the details of that customer or the changes made to that customer's properties or their tags. This allows you to update customer details in other systems, based on changes sent to Vero, keeping everything in sync. **User created:** ``` { "type":"user_created", "user": { "firstname":"Steve", "company":"Vero", "role":"Bot", "id":123, "email":"steve@getvero.com" } } ``` **User updated:** ``` { "action": "user_updated", "type":"user_updated", "user": { "id":123, "email":"steve@getvero.com" }, "id": "123", "email": "steve@getvero.com", "changes": { "_tags": { "add": ["active-customer"], "remove":["unactive-180-days"] } } } ``` If you have any other questions regarding setting up webhooks, please write us an email. We're here to help. # Determine why a triggered email was or was not sent Source: https://help.getvero.com/vero-1/logs/determine-why-a-triggered-email-was-or-was-not-sent Use logs to diagnose why a triggered email was sent or discarded for a customer. In Vero, behavioral and transactional emails are triggered by an `event`. Events are customer actions, tracked using Vero's API. [Learn more about events](/vero-1/event-tracking/what-are-events). vero.triggered-email-example As you can see in the above example, triggered emails can be sent immediately or with a delay. It is important to note that the conditions of a campaign are always evaluated **just before an email is sent**. ## Why a campaign was or was not sent The *Logs* menu in Vero is a complete, real time history of ever customer that is identified, every action a customer triggers and ever campaign a customer receives. As all transactional and behavioral emails are triggered by an `event`, Vero records whether a campaign was or was not sent as part of the logs for the trigger `event`. To view the emails triggered by an `event`, select *View logs* on the campaign page. vero.view-campaign-logs Every email that was triggered by the customer triggering a specific `event` is recorded in the trigger log and its status (`sent` or `discarded`). vero.event-data-example If marked as `discarded`, Vero will also detail why that particular email was discarded. ### Viewing the discard reason When an email is discarded in Vero, you can typically find the reason behind the discard in the **Logs**. This can be found at the bottom of each `event` log for a customer by waving your mouse over the question mark icon. vero.cloud.discardreason ### Diagnosing a log with no discard reason Occasionally, you may run into a log that doesn't offer a discard reason. vero.cloud.nodiscard This generally occurs in the following circumstances: * You are using a dynamic TO or FROM `email address`. You may use a dynamic email address on your campaign (ex: `{{user.billing_address}}` or `{{event.secondary_email}}`) in which upon sending the campaign the system finds that this user or event property is empty. * You are using a dynamic attachment. You may also use a dynamic attachment on your campaign which, just like the TO or FROM address may come up empty upon sending the campaign and will cause the email to be discarded for that customer. # Reporting on all campaigns Source: https://help.getvero.com/vero-1/logs/reports-overview-for-all-campaigns View aggregated engagement metrics and trends across all your campaigns. When you navigate to **Reports** you'll be directed to an overview that defaults to display statistics for **All Campaigns** within a custom date range. This overview will comprise two reports: ## 1. Engagement You can track total send volume of your entire project over time and compare movements in customer engagement. Three different views will be displayed: * **Overview:** a summary of email engagement for all your campaigns within the selected date range vero.reportingoverviewengagement * **Graph:** to visualise daily email engagement and map trends vero.reportingchart * **Historical breakdown:** to review daily email engagement vero.reportingbreakdown ## 2. Recent Campaigns You can compare the email performance of your five most recent newsletters sent. vero.report-recent # Troubleshooting reports Source: https://help.getvero.com/vero-1/logs/troubleshooting-reports Common reasons why delivered and opened metrics may appear incorrect. ## My campaign results don't seem right If your campaign metrics do not appear to be correct here are some things to consider: * Delivered: Emails can sometimes take some time to be accepted by the ISP. This means that your delivered metric can not update until we receive confirmation. * Opened: Opens are tracked by a small pixel inserted into the email. This can only be recorded if the customer has images enabled in their email account. # Understanding campaign metrics Source: https://help.getvero.com/vero-1/logs/understanding-campaign-metrics What each campaign metric means: delivered, opened, clicked, converted, and unsubscribed. Vero reports on several key metrics with every campaign. **Customers:** The number of customers sent your email. **Delivered:** The number of customers that your email was successfully delivered to. This statistic is a percentage of the total customers who were sent the email. **Opened:** The number of customers who open your email. This statistic is a percentage of the total number of customers who were delivered the email. *This is tracked by an invisible image that is loaded into each email sent. If a customer has images disabled then the open can not be recorded.* **Clicked:** The number of customers who click any link in your email. This statistic is a percentage of the total number of customers who were delivered the email. *We also report the number of clicks on individual links in your email.* **Converted:** The number of customers who carry out the intended action after receiving your email. This statistic is a percentage of the total number of customers who were delivered the email. *Take a look at[how conversions are defined](/vero-1/reports/conversion-tracking).* **Unsubscribed:** The number of customers who opt out of receiving further emails from you. This statistic is a percentage of the total number of customers who were delivered the email. # Why has a specific email bounced? Source: https://help.getvero.com/vero-1/logs/why-a-specific-email-has-bounced View bounce details and SMTP error codes in the email logs. When an email bounces, Vero records the details as part of the Logs, including the SMTP error returned by the recipients ISP/ESP, the number of times Vero attempted delivery and when this occurred. To see this data, select an email in the logs and choose *View email data* from the options dropdown. An example is below: vero.email-logs-bounce You can then view a more detailed reason for the error [here](http://www.serversmtp.com/en/smtp-error). SMTP error documentation is widely available online and there a many forums for digging into errors. If you ever have any questions about a bounced email please [email support](mailto:support@getvero.com) and we'll help you dig deeper! # A/B testing newsletter campaigns Source: https://help.getvero.com/vero-1/newsletters/a-b-testing-newsletter-campaigns Test subject lines, content, and from addresses to optimize your email performance. Vero makes A/B testing easy to manage while providing the level of accuracy required to ensure your tests are robust, so you can rapidly test new ideas and optimize the performance of your campaigns. You can A/B test: * Subject lines * From addresses * Body content * Templates Configuring your first A/B test is a simple process, however, features vary between type of campaign, read about the types of A/B testing below. ## Newsletter A/B Testing To create an A/B test on an existing newsletter: 1. Select the 'Enable A/B Testing' option below the 'Audience' section. vero.ab test.new-test 2. Use the 'Add variation' button to create the variation(s) for your test. vero.ab test.add-variation 3. To edit the content of each email variation open the variation with the 'show/hide' toggle. Each variation can have a separate *from address* , *subject* , and *content*. To delete a variation simply click the 'bin icon' next to the 'Edit' button . If you'd like to completely remove an A/B test from a newsletter, simply delete each variation and select 'Disable AB Testing'. Once you have added the email newsletter variations for your test, You can select from two testing modes: *Manual* or *Pick a winner*. ### Manual This is the default mode for testing. It allows you to input the percentage of users you'd like each email variation to be sent to. By default, Vero sets an equal split between all the variations but you can simply change it before sending. Vero uses a randomisation mechanism to split the recipients into the percentages selected for each variation and sends the emails. *Sending a manual test* To send a manual A/B test, schedule the newsletter as you would normally. All variations will be sent out at the scheduled time. *Reporting on a manual test* To view the report on a manual A/B test head to the Reports section in Vero and choose the campaign, this will show you detailed performance metrics for each variation and the winner of the test will be highlighted. Alternatively, you can go to the main menu and navigate to *Campaigns* > *Newsletters* and use the drop down menu to select ‘View full report’. ### Pick a winner This mode allows you to determine the percentage of customers you'd like to send the A/B test, and the percentage of customers who will receive the winning email, after a set period of time. vero.ab test.pick-a-winner To enable **Pick a winner** mode for your test: 1. Toggle the ‘Pick a winner’ button 'on' 2. Use the Distribution slider to select the percentage of customers you would like to send the A/B test. 3. Enter the number of hours you would like the test to run before sending the winner. 4. Select the metric that you want to use to determine the winner of the variations. You have choose from one of the following: * Deliveries * Opens * Clicks * Unsubscribes (the variant with more unsubscribes will be discarded) * Conversions (the number of users that took an action after receiving the campaign, such as a purchase). 5. Select 'Show advanced settings' to select the type of calculation you would like to use to determine the winner of your test. By default, tests will use a calculation that ensures the result is **statistically significant** to a 95% confidence level. If you would like to use the **bigger number wins** calculation, you can select this from the drop down menu and the winner will simply be determined by the email with the highest number. 6. Save your settings. *Sending a 'Pick a winner' test* When you schedule a newsletter campaign with ‘Pick a winner’ test mode, the scheduled time is the time that the initial test will run. After the defined test period has past, the winning email will be determined from the results of the test and then sent to the remaining recipients. If there is no clear winner (no statistically significant difference is observed) the control email will be sent to the remaining recipients. *Reporting on a 'Pick a winner' test* Once the test has completed, you can view the results of the chosen metric on the A/B testing page. For more detailed reporting, head to the *Reports* section in your account. **Note:** Due to the testing period required to determine a winner, sending emails in the users timezone, and batch sending are not available when using A/B testing. ## Behavioural & Transactional A/B Testing An A/B test can be set up at any time on a behavioural or transactional campaign, even for campaigns that have already been launched. vero.ab test.behavioural-and-transactional-tests To create a new A/B test for a behavioural or transactional campaign: 1. Select the 'Enable AB Testing' button inside your campaign. 2. Use the 'Add variation' button to create some variation(s) for your test. 3. (Optional) By using the ‘Add negative variation’ button you can create a 'hold out' control group. Recipients in this group will not receive any email. This is useful for testing to see if sending no email performs better than sending an email. 4. To edit the content of each email variation open the variation with the 'show/hide' toggle button. Each variation can have a separate *from address* , *subject line* , and *content*. We would generally recommend to only test a single hypothesis with each variation. You can delete a variation, by selecting the 'trash' icon for that variation. Email variations are sent out based on split percentage. By default, Vero sets an equal split between all the variations but you can simply change it before launching your test. At this point in time you should ensure you have a conversion event configured so you can track which variation is the best performing. You should then remove other variations from the sending cycle. This allows you to rapidly test new ideas and determine a winner. *Launching a behavioural or Transactional A/B test* Once all of your variations are setup and you are happy with the split percentages, you can select 'Start A/B test'. To stop the test once it's started you can select 'Stop A/B test'. *Reporting on a behavioural or Transactional A/B test* Results are reported individually for each variation. To see which variations performed best or to see a detailed report on each variation, visit the *Reports* section and select the appropriate campaign. #### Note: When running an A/B test on a Behavioural or Transactional email campaign which has more than one email (a Series campaign), A/B tests run across the entire series. The split is decided with the first email in the series and the remaining emails follow suit. For example, if a customer receives Variation B for the first email, they will receive Variation B throughout. This allows you to test entirely different templates or from addresses without your customers receiving inconsistent communications. When adding variations, note that when you add a variation on one series email, an equivalent variation will be created on each email in the series. # Adding custom HTML to a drag and drop email template Source: https://help.getvero.com/vero-1/newsletters/add-custom-html-to-drag-and-drop-templates Add custom HTML and CSS code blocks to drag and drop templates for advanced designs. Vero's [Drag and Drop email editor](/vero-1/newsletters/using-the-drag-and-drop-editor) is an easy to use WYSIWYG email template designer that can help you [achieve a lot of layouts and styles](/vero-1/newsletters/using-the-drag-and-drop-editor). However, sometimes you need something custom that goes beyond what is possible with the supplied design controls. To help give you the flexibility to add non standard design elements to your template, Vero supports adding custom markup and styles using the *HTML block*. ## How to add custom HTML to your template To add custom HTML and CSS to your template, simply drag an HTML block into your template. *HTML* blocks can be added to any *Section* block and will create a new containing section if dragged between existing *sections*. Add html to drag and drop Once dragged into your template, you can select the HTML block and add your own code into the code editor provided. You can add any HTML and CSS styles into a HTML block, however please note that **this is an advanced feature and does require knowledge of email templates design and best practices** to ensure your designs look as intended on all platforms. See our note on compatibility below. The changes you make to your HTML code will immediately display in the preview on the right. ## Styling your custom HTML Styling your HTML is possible using CSS styles, this can be done in two ways: 1. Adding a style tag above or below your content. ```

Hello World

``` 2. Adding inline styles. ```

Hello world

``` Vero's drag and drop email editor is designed to make sure that however a template is designed, it will appear as intended in all modern clients and devices. To ensure that the compatibility of the overall template design is not easily impacted by custom HTML and CSS, any styles included will be scoped to the currently selected block. This means any using selectors for elements such as p, h1, h2, div etc that would normally affect any instance of those elements on the page, will only affect those elements *inside* the current html block, and will not affect other elements in the template as a whole. ## Email compatibility Due to the flexible nature of HTML and CSS, when adding custom markup and styles using the new HTML block we cannot 100% guarantee that the template will look as intended in every email client and device. We recommend testing your email on multiple devices and email clients using a service such as [litmus](https://www.litmus.com/) or [email on acid](https://www.emailonacid.com/) for the best results. When adding custom HTML and CSS we also recommend referring to [https://www.caniemail.com](https://www.caniemail.com/) for more information about which elements and styles are compatible with the various email clients and devices. ## Validation and code sanitization When using the HTML block, you may notice that your code is reformatted after being entered. This is because it is being validated and sanitized to ensure that invalid HTML is removed and that all necessary ending tags are in place. This must be done to ensure the integrity of the template as a whole and to make sure all content outside the custom HTML block will render correctly. Please make sure all code added to the template is valid. ## Liquid personalization inside an HTML block The custom *HTML block* supports using Liquid syntax to include object variables to your template using double curly brackets, such as: ```
{{ user.first_name }}
``` Due to how HTML is validated we recommend wrapping liquid logic tags such as `if`, `unless`, `for` in comments to ensure they are not removed for being invalid HTML. For example the following logic tags must be wrapped in comments because it is invalid to include content directly inside the `` tag. ```
{{i}}
``` # Adding To and From email addresses Source: https://help.getvero.com/vero-1/newsletters/adding-to-and-from-email-addresses Configure sender addresses, reply-to addresses, and dynamic email fields using Liquid. ## Adding and customizing 'To' and 'From' email addresses You can add and define as many customer 'From' email addresses as you want in Vero under the [Email Addresses](https://app.getvero.com/settings/emails) section in Settings. You can also use these emails addresses to direct behavioral and transactional email campaigns internally (rather than emailing the user that triggers those campaigns). ## Adding an email address vero.email-addresses You can manage the email addresses in each Project by visiting the *Settings > Email Addresses* menu. When you add a new email address there are three fields you must include: 1. Email: The email address itself. For example, `email@getvero.com`. 2. From name: The name you want the email to come from. For example, `Chris from Vero`. 3. Reply-to (optional): The email address you want the replies to go to. For example, `support@getvero.com`. ## Using an email address vero.email-addresses-campaign Saved email addresses can be selected from the dropdown menu when creating a new campaign. You can select saved email addresses as either a 'To' or 'From' address when creating behavioral or transactional email campaigns. ## Complex, dynamic addresses using Liquid You can insert dynamic merge tags into any of the fields used to define an email address, enabling you to dynamically populate the 'To' or 'From' addresses of any newsletter, behavioral or transactional campaign. For example, you might store a property on each of your customers' profiles called `secondary_email`. You can dynamically merge this property into any email address *From name* , *Email* or *Reply-to email* field. As an example, you might set the *Email* field to be `{{user.secondary_email}}` and the *From name* to be `{{user.secondary_email_from_name}}`. When an email is built to be sent, Vero will pick up these values and use them to send the email. # Cloning a campaign Source: https://help.getvero.com/vero-1/newsletters/cloning-a-campaign Duplicate campaigns within a project or copy them to another project. To clone an email in Vero simply select *Clone* from the options menu of the email campaign you'd like to duplicate. vero.clone-email After selecting *Clone* you will be asked to confirm your action and have the option to clone from the current project to another project if desired. Cloning a campaign will copy everything except the result data of the original campaign. # Create a multi-language campaign Source: https://help.getvero.com/vero-1/newsletters/create-a-multi-language-campaign Send localized email content to customers based on their locale property. It is possible to send multi-language campaigns in Vero. Using the multi-language feature of Vero you can create multiple language versions of an email which include localised content for each language you want to send your campaign in. This feature is best suited if you have already translated your content to multiple languages. In order to tell which language version of an email to send to your customers, Vero reserves the `locale` property for each customer. **For example:** If a customer has the property `locale` set to `es` then Vero will assign the user to receive the `es` language variation you set up. [Learn more about customer properties](/vero-1/customers/what-are-customer-properties). *Note: Vero does not offer a translation service, multi-language campaigns are best suited for campaigns that have already been translated. For translation services, check out:[Transifex](https://www.transifex.com/) or [Smartling](https://www.smartling.com/)* ## Creating a new multi-language campaign To create a new multi-langauge campaign follow these steps: 1. Create a new campaign (mutli-language emails are available on any type of campaign). 2. Setup your campaign as you normally would, with your entire list of users to begin with. 3. This first variation will be your "default language". This is essentially the control email and will contain the conditions with which the language variations are built from. If most of your users are english speaking, we recommend using the first (default) language version as english. This means that if a customer doesn’t have a locale set then they will still receive the english version. 4. Click on the 'Enable Languages' option. vero.enable-languages 5. Add a language version to this campaign by hitting '+ Add Languages'. vero.add-language 6. Choose the language you want this content version to be sent to. Any customer with the corresponding locale will be sent that version of the email. vero.add-language-locale ## Adding languages to an existing campaign If you are adding language variations to an existing workflow or behavioural campaign, please be aware that if the campaign has been launched, any changes woulc automatically be live for your customers. To edit an existing campaign you can pause the campaign, edit as above and then un-pause the campaign. Or alternately you can add a condition to your default content that will ensure no users receive the language variations until they are completed. Typically we recommend adding the locale property of the default language. So if your default language is English add the condition "has property locale equal to en". This will ensure only English users receive the content and this content will be your default variation. When you are ready to go live with your language variations, remove this condition and users will start being sent the correct content. ### For working with dates and timestamps We provide a `with_locale` filter that will format the date in the language of the locale passed to the filter. ``` purchase_date = "2015-04-01 11:33" {{ purchase_date | with_locale: '%Y %b %H:%M', 'es-MX' }} => 2024 abr 11:33 ``` You can also pass it a user property. ``` purchase_date = "2015-04-01 11:33" user.locale = "es-MX" {{ purchase_date | with_locale: '%Y %b %H:%M', user.locale }} => 2024 abr 11:33 ``` ### Allow partial matching of locale codes By default, Vero will use an "exact match" for locale codes. If you want to allow for a partial match, for example, any user who has the property 'locale' that contains 'es'- such as 'es-MX' or 'es-US', you can switch this feature on in *Settings >Labs*. Partial matching local codes setting ### Language Codes Listed below are the codes that should be used on the `locale` customer property: | Language | Code | | --------------------------------------------- | ----------- | | Afrikaans (Namibia) | af-NA | | Afrikaans (South Africa) | af-ZA | | Afrikaans | af | | Akan (Ghana) | ak-GH | | Akan | ak | | Albanian (Albania) | sq-AL | | Albanian | sq | | Amharic (Ethiopia) | am-ET | | Amharic | am | | Arabic (Algeria) | ar-DZ | | Arabic (Bahrain) | ar-BH | | Arabic (Egypt) | ar-EG | | Arabic (Iraq) | ar-IQ | | Arabic (Jordan) | ar-JO | | Arabic (Kuwait) | ar-KW | | Arabic (Lebanon) | ar-LB | | Arabic (Libya) | ar-LY | | Arabic (Morocco) | ar-MA | | Arabic (Oman) | ar-OM | | Arabic (Qatar) | ar-QA | | Arabic (Saudi Arabia) | ar-SA | | Arabic (Sudan) | ar-SD | | Arabic (Syria) | ar-SY | | Arabic (Tunisia) | ar-TN | | Arabic (United Arab Emirates) | ar-AE | | Arabic (Yemen) | ar-YE | | Arabic | ar | | Armenian (Armenia) | hy-AM | | Armenian | hy | | Assamese (India) | as-IN | | Assamese | as | | Asu (Tanzania) | asa-TZ | | Asu | asa | | Azerbaijani | az | | Bambara (Mali) | bm-ML | | Bambara | bm | | Basque (Spain) | eu-ES | | Basque | eu | | Belarusian (Belarus) | be-BY | | Belarusian | be | | Bemba (Zambia) | bem-ZM | | Bemba | bem | | Bena (Tanzania) | bez-TZ | | Bena | bez | | Bengali (Bangladesh) | bn-BD | | Bengali (India) | bn-IN | | Bengali | bn | | Bosnian (Bosnia and Herzegovina) | bs-BA | | Bosnian | bs | | Bulgarian (Bulgaria) | bg-BG | | Bulgarian | bg | | Burmese (Myanmar \[Burma]) | my-MM | | Burmese | my | | Catalan (Spain) | ca-ES | | Catalan | ca | | Central Morocco Tamazight | tzm | | Cherokee (United States) | chr-US | | Cherokee | chr | | Chiga (Uganda) | cgg-UG | | Chiga | cgg | | Chinese (Simplified Han) | zh-Hans | | Chinese (Simplified Han China) | zh-Hans-CN | | Chinese (Simplified Han Hong Kong SAR China) | zh-Hans-HK | | Chinese (Simplified Han Macau SAR China) | zh-Hans-MO | | Chinese (Simplified Han Singapore) | zh-Hans-SG | | Chinese (Traditional Han) | zh-Hant | | Chinese (Traditional Han Hong Kong SAR China) | zh-Hant-HK | | Chinese (Traditional Han Macau SAR China) | zh-Hant-MO | | Chinese (Traditional Han Taiwan) | zh-Hant-TW | | Chinese | zh | | Cornish (United Kingdom) | kw-GB | | Cornish | kw | | Croatian (Croatia) | hr-HR | | Croatian | hr | | Czech (Czech Republic) | cs-CZ | | Czech | cs | | Danish (Denmark) | da-DK | | Danish | da | | Dutch (Belgium) | nl-BE | | Dutch (Netherlands) | nl-NL | | Dutch | nl | | Embu (Kenya) | ebu-KE | | Embu | ebu | | English (American Samoa) | en-AS | | English (Australia) | en-AU | | English (Belgium) | en-BE | | English (Belize) | en-BZ | | English (Botswana) | en-BW | | English (Canada) | en-CA | | English (France) | en-FR | | English (Guam) | en-GU | | English (Germany) | en-DE | | English (Hong Kong SAR China) | en-HK | | English (India) | en-IN | | English (Ireland) | en-IE | | English (Jamaica) | en-JM | | English (Malta) | en-MT | | English (Marshall Islands) | en-MH | | English (Mauritius) | en-MU | | English (Namibia) | en-NA | | English (Netherlands) | en-NL | | English (New Zealand) | en-NZ | | English (Northern Mariana Islands) | en-MP | | English (Pakistan) | en-PK | | English (Philippines) | en-PH | | English (Singapore) | en-SG | | English (South Africa) | en-ZA | | English (Trinidad and Tobago) | en-TT | | English (U.S. Minor Outlying Islands) | en-UM | | English (U.S. Virgin Islands) | en-VI | | English (United Kingdom) | en-GB | | English (United States) | en-US | | English (Zimbabwe) | en-ZW | | English | en | | Esperanto | eo | | Estonian (Estonia) | et-EE | | Estonian | et | | Ewe (Ghana) | ee-GH | | Ewe (Togo) | ee-TG | | Ewe | ee | | Faroese (Faroe Islands) | fo-FO | | Faroese | fo | | Filipino (Philippines) | fil-PH | | Filipino | fil | | Finnish (Finland) | fi-FI | | Finnish | fi | | French (Belgium) | fr-BE | | French (Benin) | fr-BJ | | French (Burkina Faso) | fr-BF | | French (Burundi) | fr-BI | | French (Cameroon) | fr-CM | | French (Canada) | fr-CA | | French (Central African Republic) | fr-CF | | French (Chad) | fr-TD | | French (Comoros) | fr-KM | | French (Congo - Brazzaville) | fr-CG | | French (Congo - Kinshasa) | fr-CD | | French (Côte d’Ivoire) | fr-CI | | French (Djibouti) | fr-DJ | | French (Equatorial Guinea) | fr-GQ | | French (France) | fr-FR | | French (Gabon) | fr-GA | | French (Guadeloupe) | fr-GP | | French (Guinea) | fr-GN | | French (Luxembourg) | fr-LU | | French (Madagascar) | fr-MG | | French (Mali) | fr-ML | | French (Martinique) | fr-MQ | | French (Monaco) | fr-MC | | French (Niger) | fr-NE | | French (Rwanda) | fr-RW | | French (Réunion) | fr-RE | | French (Saint Barthélemy) | fr-BL | | French (Saint Martin) | fr-MF | | French (Senegal) | fr-SN | | French (Switzerland) | fr-CH | | French (Togo) | fr-TG | | French | fr | | Fulah (Senegal) | ff-SN | | Fulah | ff | | Galician (Spain) | gl-ES | | Galician | gl | | Ganda (Uganda) | lg-UG | | Ganda | lg | | Georgian (Georgia) | ka-GE | | Georgian | ka | | German (Austria) | de-AT | | German (Belgium) | de-BE | | German (Germany) | de-DE | | German (Liechtenstein) | de-LI | | German (Luxembourg) | de-LU | | German (Switzerland) | de-CH | | German | de | | Greek (Cyprus) | el-CY | | Greek (Greece) | el-GR | | Greek | el | | Gujarati (India) | gu-IN | | Gujarati | gu | | Gusii (Kenya) | guz-KE | | Gusii | guz | | Hausa | ha | | Hawaiian (United States) | haw-US | | Hawaiian | haw | | Hebrew (Israel) | he-IL | | Hebrew | he | | Hindi (India) | hi-IN | | Hindi | hi | | Hungarian (Hungary) | hu-HU | | Hungarian | hu | | Icelandic (Iceland) | is-IS | | Icelandic | is | | Igbo (Nigeria) | ig-NG | | Igbo | ig | | Indonesian (Indonesia) | id-ID | | Indonesian | id | | Irish (Ireland) | ga-IE | | Irish | ga | | Italian (Italy) | it-IT | | Italian (Switzerland) | it-CH | | Italian | it | | Japanese (Japan) | ja-JP | | Japanese | ja | | Kabuverdianu (Cape Verde) | kea-CV | | Kabuverdianu | kea | | Kabyle (Algeria) | kab-DZ | | Kabyle | kab | | Kalaallisut (Greenland) | kl-GL | | Kalaallisut | kl | | Kalenjin (Kenya) | kln-KE | | Kalenjin | kln | | Kamba (Kenya) | kam-KE | | Kamba | kam | | Kannada (India) | kn-IN | | Kannada | kn | | Kazakh | kk | | Khmer (Cambodia) | km-KH | | Khmer | km | | Kikuyu (Kenya) | ki-KE | | Kikuyu | ki | | Kinyarwanda (Rwanda) | rw-RW | | Kinyarwanda | rw | | Konkani (India) | kok-IN | | Konkani | kok | | Korean (South Korea) | ko-KR | | Korean | ko | | Koyra Chiini (Mali) | khq-ML | | Koyra Chiini | khq | | Koyraboro Senni (Mali) | ses-ML | | Koyraboro Senni | ses | | Langi (Tanzania) | lag-TZ | | Langi | lag | | Latvian (Latvia) | lv-LV | | Latvian | lv | | Lithuanian (Lithuania) | lt-LT | | Lithuanian | lt | | Luo (Kenya) | luo-KE | | Luo | luo | | Luyia (Kenya) | luy-KE | | Luyia | luy | | Macedonian (Macedonia) | mk-MK | | Macedonian | mk | | Machame (Tanzania) | jmc-TZ | | Machame | jmc | | Makonde (Tanzania) | kde-TZ | | Makonde | kde | | Malagasy (Madagascar) | mg-MG | | Malagasy | mg | | Malay (Brunei) | ms-BN | | Malay (Malaysia) | ms-MY | | Malay | ms | | Malayalam (India) | ml-IN | | Malayalam | ml | | Maltese (Malta) | mt-MT | | Maltese | mt | | Manx (United Kingdom) | gv-GB | | Manx | gv | | Marathi (India) | mr-IN | | Marathi | mr | | Masai (Kenya) | mas-KE | | Masai (Tanzania) | mas-TZ | | Masai | mas | | Meru (Kenya) | mer-KE | | Meru | mer | | Morisyen (Mauritius) | mfe-MU | | Morisyen | mfe | | Nama (Namibia) | naq-NA | | Nama | naq | | Nepali (India) | ne-IN | | Nepali (Nepal) | ne-NP | | Nepali | ne | | North Ndebele (Zimbabwe) | nd-ZW | | North Ndebele | nd | | Norwegian Bokmål (Norway) | nb-NO | | Norwegian Bokmål | nb | | Norwegian Nynorsk (Norway) | nn-NO | | Norwegian Nynorsk | nn | | Nyankole (Uganda) | nyn-UG | | Nyankole | nyn | | Oriya (India) | or-IN | | Oriya | or | | Oromo (Ethiopia) | om-ET | | Oromo (Kenya) | om-KE | | Oromo | om | | Pashto (Afghanistan) | ps-AF | | Pashto | ps | | Persian (Afghanistan) | fa-AF | | Persian (Iran) | fa-IR | | Persian | fa | | Polish (Poland) | pl-PL | | Polish | pl | | Portuguese (Brazil) | pt-BR | | Portuguese (Guinea-Bissau) | pt-GW | | Portuguese (Mozambique) | pt-MZ | | Portuguese (Portugal) | pt-PT | | Portuguese | pt | | Punjabi (Arabic) | pa-Arab | | Punjabi (Arabic Pakistan) | pa-Arab-PK | | Punjabi (Gurmukhi) | pa-Guru | | Punjabi (Gurmukhi India) | pa-Guru-IN | | Punjabi | pa | | Romanian (Moldova) | ro-MD | | Romanian (Romania) | ro-RO | | Romanian | ro | | Romansh (Switzerland) | rm-CH | | Romansh | rm | | Rombo (Tanzania) | rof-TZ | | Rombo | rof | | Russian (Moldova) | ru-MD | | Russian (Russia) | ru-RU | | Russian (Ukraine) | ru-UA | | Russian | ru | | Rwa (Tanzania) | rwk-TZ | | Rwa | rwk | | Samburu (Kenya) | saq-KE | | Samburu | saq | | Sango (Central African Republic) | sg-CF | | Sango | sg | | Sena (Mozambique) | seh-MZ | | Sena | seh | | Serbian | sr | | Shona (Zimbabwe) | sn-ZW | | Shona | sn | | Sichuan Yi (China) | ii-CN | | Sichuan Yi | ii | | Sinhala (Sri Lanka) | si-LK | | Sinhala | si | | Slovak (Slovakia) | sk-SK | | Slovak | sk | | Slovenian (Slovenia) | sl-SI | | Slovenian | sl | | Soga (Uganda) | xog-UG | | Soga | xog | | Somali (Djibouti) | so-DJ | | Somali (Ethiopia) | so-ET | | Somali (Kenya) | so-KE | | Somali (Somalia) | so-SO | | Somali | so | | Spanish (Argentina) | es-AR | | Spanish (Bolivia) | es-BO | | Spanish (Chile) | es-CL | | Spanish (Colombia) | es-CO | | Spanish (Costa Rica) | es-CR | | Spanish (Dominican Republic) | es-DO | | Spanish (Ecuador) | es-EC | | Spanish (El Salvador) | es-SV | | Spanish (Equatorial Guinea) | es-GQ | | Spanish (Guatemala) | es-GT | | Spanish (Honduras) | es-HN | | Spanish (Latin America) | es-419 | | Spanish (Mexico) | es-MX | | Spanish (Nicaragua) | es-NI | | Spanish (Panama) | es-PA | | Spanish (Paraguay) | es-PY | | Spanish (Peru) | es-PE | | Spanish (Puerto Rico) | es-PR | | Spanish (Spain) | es-ES | | Spanish (United States) | es-US | | Spanish (Uruguay) | es-UY | | Spanish (Venezuela) | es-VE | | Spanish | es | | Swahili (Kenya) | sw-KE | | Swahili (Tanzania) | sw-TZ | | Swahili | sw | | Swedish (Finland) | sv-FI | | Swedish (Sweden) | sv-SE | | Swedish | sv | | Swiss German (Switzerland) | gsw-CH | | Swiss German | gsw | | Tachelhit (Tifinagh) | shi-Tfng | | Tachelhit (Tifinagh Morocco) | shi-Tfng-MA | | Tachelhit | shi | | Taita (Kenya) | dav-KE | | Taita | dav | | Tamil (India) | ta-IN | | Tamil (Sri Lanka) | ta-LK | | Tamil | ta | | Telugu (India) | te-IN | | Telugu | te | | Teso (Kenya) | teo-KE | | Teso (Uganda) | teo-UG | | Teso | teo | | Thai (Thailand) | th-TH | | Thai | th | | Tibetan (China) | bo-CN | | Tibetan (India) | bo-IN | | Tibetan | bo | | Tigrinya (Eritrea) | ti-ER | | Tigrinya (Ethiopia) | ti | | Tigrinya | ti | | Tonga (Tonga) | to-TO | | Tonga | to | | Turkish (Turkey) | tr-TR | | Turkish | tr | | Ukrainian (Ukraine) | uk-UA | | Ukrainian | uk | | Urdu (India) | ur-IN | | Urdu (Pakistan) | ur-PK | | Urdu | ur | | Uzbek (Arabic) | uz-Arab | | Uzbek (Arabic Afghanistan) | uz-Arab-AF | | Uzbek | uz | | Vietnamese (Vietnam) | vi-VN | | Vietnamese | vi | | Vunjo (Tanzania) | vun-TZ | | Vunjo | vun | | Welsh (United Kingdom) | cy-GB | | Welsh | cy | | Yoruba (Nigeria) | yo-NG | | Yoruba | yo | | Zulu (South Africa) | zu-ZA | | Zulu | zu | # Adding content to an email campaign Source: https://help.getvero.com/vero-1/newsletters/creating-email-content Choose from drag and drop, HTML, rich text, or plain text content types for your emails. The content your customers see when they open their inbox is arguably the most important aspect of any email campaign. Vero has multiple ways for you to add, create or edit email content, giving you flexibility to choose the best content for the job, and adapting to the way your team works. *Read on to learn about all the content types in Vero:* ## Drag and Drop vero.content-type.drag-and-drop This is our 'no code' solution for creating visually-interesting email templates. Simply drag and drop content blocks into the canvas, edit your content in place or start from one of our example templates. With drag and drop, you can focus on the visual design and content of your email and let Vero do all the hard work to make sure your email is compatible with all the major email clients and devices. Drag and Drop content can also be saved as a template in Vero and used as the starting point for any campaign. [Learn more about using Drag and Drop content in Vero](/vero-1/newsletters/using-the-drag-and-drop-editor) ## HTML vero.content-type.html Perfect for when you have existing HTML that you want to use and are comfortable making content changes directly in the code. The HTML editor lets you import code, edit the code directly, and see a live preview all in the same place. HTML content can also be saved as a template in Vero and used as the starting point for any campaign. [Learn more about using HTML content in Vero](/vero-1/newsletters/using-html-templates-in-vero) ## Rich Text vero.content-type.rich-text Send a simple, no fuss text-based email with a more personal feel (similar to how you would in Gmail, etc). If you don't need a complex layout for your email content and want to send a message that has the personal touch of a real person, use the Rich text content editor. [Learn more about using Rich Text content in Vero](/vero-1/newsletters/rich-text-content) ## Plain Text vero.content-type.plain-text For those times you need zero styling and simply want to send some text. Plain text is the most basic of all content types, it has zero styling, not even bold or italics. Vero automatically sends an accompanying plain text version of your content with every email for compatibility, but selecting the plain text content type means you will be sending the plain text version only. [Learn more about using Plain Text content in Vero](/vero-1/newsletters/plain-text-email-content) # Creating mobile push messages Source: https://help.getvero.com/vero-1/newsletters/creating-push-notifications Set up and send mobile push notifications as campaigns or workflow steps. ## Creating a push message To send your customers mobile push notifications you will need to [configure push notifications](/vero-1/settings/mobile-push-notification-integration-guide) in your Vero account. Mobile push notifications can be sent as a newsletter campaign or added as an action step in a workflow. Setting up a push notification as a newsletter campaign allows you to send one push message to a segment(s), at a specified time. Whereas, adding a push notification to an automated workflow sends a push message based on an action or event, as part of a customer journey. To **create a push newsletter campaign** : navigate to *Campaigns > Newsletters > New Campaign* and select ‘Push’ as the channel. To **add a push notification to a workflow** : navigate to *Campaigns > Workflows > New Workflow* and select ‘Push’ as an action step. Read more about [setting up a Workflow](/vero-1/workflows/creating-a-new-workflow) for email and push messages. Whether you're creating a newsletter campaign or a workflow, for both campaign types you will be given the option to select a Provider and Platform(s). vero.push.push-options.workflows vero.push.push-options.newsletters ### Provider Vero supports push notification delivery providers Amazon SNS and Twilio Notify. If you haven’t already set up a Provider in your Vero account, please read our [Mobile Push Notifications - Integration guide](/vero-1/settings/mobile-push-notification-integration-guide). ### Platform You will have the option to select which Platforms your push messages will be delivered to. You can choose to send to iOS, Android or both. ### Adding content The Content Editor for push notifications is the same for both Newsletter and Workflow campaign types. The basic editor enables you to easily add text, a link and an image (maximum file size 10mb) to your message. The advanced editor is available for those who wish to edit the full JSON payloads. Using the toggle in the top-right you can preview your message on both iOS and Android devices. vero.push.push-editor **Inserting dynamic user and event properties/attributes** Using the Advanced editor, you can add [Liquid syntax](/vero-1/newsletters/inserting-merge-tags-using-liquid-in-my-emails) to the Payloads to create personalized messages for your customers. Similar to the email content editor, select **Data** to open the Data Inspector and copy and paste user and event properties into the iOS and Android Payloads. vero.push.push-liquid **Maximum payload size for push notifications** 4KB (4096 bytes) is the maximum payload size for both Apple Push Notification service (APNs) and Android’s Firebase Cloud Messaging (FCM). This is for the entire payload- the text message and any other custom data that is sent with the notification. ## Testing push notifications ### a. Create a test profile Sending iOS and Android push messages requires a "device token". This device token is generated programmatically by Apple and Google when requested by your mobile application. Device tokens are specific to the combination of your device and the current installation of your mobile application. As such, there isn’t an easy way to find this device token using your mobile – it needs to be generated programmatically. As part of [Configuring Mobile Push Notifications in Vero](/vero-1/settings/mobile-push-notification-integration-guide), device tokens will be sent across to customer profiles in Vero. Assuming that you can install and use your mobile app on your own phone, if the integration is successful, then registering your own test customer profile by using your application should add your profile to Vero. You can confirm this by searching for your profile in Vero and checking if you have a device token present on your profile. vero.push.push-user-devices If so, you can use this profile to send and receive test messages on your own device. ### b. Send a test push notification Navigate to the push notification campaign that you want to test and select **'Test Push'**. Using the preview modal, search for and **select your test profile**. Note that Vero will search for `device_tokens` that match the platform(s) selected for a given campaign. For example, if you create a new push campaign and select iOS as the platform to target, we will search for users that have an iOS `device_token` set. vero.push.campaigns.preview Once you've selected your test profile, hit *Send* and Vero will then deliver a test version of the push message to your device. # Disabling Click And/Or Open Tracking per Individual Source: https://help.getvero.com/vero-1/newsletters/disabling-click-and-or-open-tracking-per-individual While click and open tracking is generally handled at the campaign level, it may be necessary to disable this tracking for a specific individual profile. You can do this by tracking one of two user properties. To disable open tracking, track in a property of `preference_tracking_open_disabled` set to `true`. To disable click tracking, track in a property of `preference_tracking_click_disabled` set to `true`. When these properties are set to true, Vero will no longer track opens or clicks for any messages sent to that individual profile. With some Email Service Providers, it is only possible to disable BOTH opens and clicks or neither. This includes Vero's sending partner for our shared infrastructure. Vero does allow configuring an external provider such as Sendgrid, Mailgun and Mailjet, and many of these do allow disabling these independently. # Event properties vs. Customer properties Source: https://help.getvero.com/vero-1/newsletters/event-properties-customer-properties Understand the difference between customer attributes and event-specific data. # Event properties vs. Customer properties Event properties and Customer properties are not automatically linked. Customer properties describe who the customer is, and event properties log what the customer does. **Customer properties = who they are.** Describe the customer, their name, email address, language, location or other details that you may want to update over time. vero.customerproperties **Event properties = what they do.** Event properties are tracked along with events. Events are actions such as "registered" or "completed-checkout". These events also have their own properties about them, and are often used to scope details about that event. For example, you might trigger "completed-checkout" and track "total\_cost" and "product\_details" as associated event properties. vero.eventdata The way that these details are tracked via the API is also separate. If a customer triggers an event with properties and you would like to update them as customer properties, your technical team would want to configure tracking to also tell Vero to update these details via an "identify" call. More details on this can be found in the [API reference](/api-reference/overview#track-rest-api). We have more details about Customer properties [here](/vero-1/customers/what-are-customer-properties) and Events [here](/vero-1/event-tracking/what-are-events). # How do email previews and live emails differ? Source: https://help.getvero.com/vero-1/newsletters/how-do-email-previews-and-live-emails-differ Key differences between preview emails and live sends, including tracking and links. Campaign email previews offer an accurate glimpse of what a recipient will receive once the campaign is set live. However, there are a few small differences to keep in mind. ### Unsubscribe If you're using Vero's automated unsubscribe option in your campaign, if clicked on in a preview, this will not function the same as it would in a live email and will **not** unsubscribe the recipient of the preview if clicked. ### Click tracking on links In a preview email, Vero does not append **vero\_conv** or **vero\_id** params to links. This means two things: * Clicked links will not be tracked. * Upon a 'live' send Vero will append **vero\_conv** or **vero\_id** params to links and therefore differences in url length will be magnified. ### Size When testing the size of your email campaign compared to a live email campaign, you'll want to take into account that with added vero\_id and vero\_conv params for your links, the more links you have, the larger the HTML weight of the campaign. *Note: Many email clients begin clipping campaigns more than 102kb of HTML content* # HTML vs Plain Text Source: https://help.getvero.com/vero-1/newsletters/html-vs-plain-text-emails Include both HTML and plain text versions for maximum email client compatibility. When sending emails you can include both a HTML and plain text version of the content. By including both versions you leave it up to the customer and their email client to decide which format is to be displayed. This helps ensure two things: * Complete compatibility - certain mobile devices and other, older, email clients prefer plain text. * Customer friendliness - leave it up to your customers to turn off HTML formatting if they desire. At least they will still receive the quality emails you are sending! [Learn more about using plain text in Vero](/vero-1/newsletters/plain-text-email-content) # Inlining CSS styles Source: https://help.getvero.com/vero-1/newsletters/inlining-css-styles Learn how to use Vero's Inline CSS option to ensure your email styles render correctly across all email clients. When using HTML in Vero, you will see an option labeled **Inline CSS** : vero.html.inline-css When enabling the Inline CSS option, Vero will convert all css styles inside the ` ``` ## Background Acheiving visual consistency across email clients is an ongoing challenge for marketers. It can, however, be significantly improved by scoping styles to the exact element they apply to. This is also known as element-level CSS specificity. Unfortunately, this approach does make managing your styles difficult and ultimately defeats the purpose of CSS itself. To get around this problem, it has become standard practice for mail platforms to offer to inline CSS contained within the header of an email (styles in between the `` elements) to the style tag of the element they apply to (`style=""`). This approach makes marketer's lives easier as they can style using CSS classes, and email makes email rendering more consistent between clients (Gmail, Outlook, Mail etc.) as every style is hardcoded on the element itself. In Vero, with the [Inline CSS option](/vero-1/newsletters/inlining-css-styles) turned on, our pre-mail processes automatically convert the markup to use inline styles betweeen the time you click schedule and the time an email leaves our mail servers. ## Ensuring your media queries are not inlined Naturally, if your media queries are stripped out of the header styles, they will no longer work. To avoid this happening, you must wrap all media queries in a separate `