# Integrations Connect Airship to analytics platforms, CRMs, CDPs, and marketing tools. Use when a user asks about connecting Airship to a third-party platform — each page covers one integration partner. Check the requirements section of each page before confirming that an integration is supported or available. # Acoustic > Export and target audiences aggregated across marketing platforms. Acoustic (formally IBM UBX) is a marketing cloud and analytics platform. With this integration you can send audience lists and [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) from Acoustic to Airship. You can design personalized Airship [Sequences](https://www.airship.com/docs/reference/glossary/#sequence) and [[Automations](https://www.airship.com/docs/reference/glossary/#automation)](https://www.airship.com/docs/guides/messaging/messages/sequences/about/) based on the custom events. ## Acoustic Integration Requirements * **Accounts** 1. Acoustic 1. Airship — Must include messaging * **Airship project** * [Named User](https://www.airship.com/docs/reference/glossary/#named_user) must be enabled for your project. ### Named Users and Acoustic Audiences To use the Acoustic integration, you must enable named users in Airship. The `named_user_id` for your named users must be an audience identifier (type) in your Acoustic environment so that Airship can associate your Acoustic shared audience — exported from Acoustic as custom events or static lists — with named users. If your `named_user_id` and Acoustic identifier types do not match, Airship will not be able to associate custom events or static lists with named users, preventing you from effectively issuing automated messages or performing other operations based on your Acoustic audience. See the [Named Users feature guide](https://www.airship.com/docs/guides/audience/named-users/) or the [Named Users API](https://www.airship.com/docs/developer/rest-api/ua/operations/named-users/) for more information about configuring named users. ## Understanding Acoustic Deployment Types When configuring the integration, you will create an endpoint in Acoustic and determine whether you want to export your Acoustic audience as a series of custom events or as a static list. This is the **Deployment Type**. The **Custom Events** deployment type sends your Acoustic audience to Airship as custom events associated with your named users. This deployment type lends itself to [Automation](https://www.airship.com/docs/reference/glossary/#automation) using the Acoustic-generated custom event as a triggering event. The **Static Lists** deployment type sends your Acoustic audience to Airship as a static list. You can schedule the deployment of the static list. If you do not rename the list in Acoustic between scheduled intervals, the contents of the list are overwritten during the scheduled interval. For example, if you have a list called `abandoned_cart`, and you deploy it every Tuesday, the contents of the list will change every Tuesday; members of the list will only remain the same if they abandoned their carts for two straight weeks. [Learn more about static lists and audience selection](https://www.airship.com/docs/guides/audience/segmentation/audience-lists/uploaded/). ## Configuring the Acoustic Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Acoustic**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create an authentication token for your project. Acoustic uses the token to communicate with your project in Airship * Register an endpoint in Acoustic. ## Syncing Identifiers for Users To take advantage of Acoustic, you have to determine the Acoustic identifier that you want to associate with named users in your app's audience. Your Acoustic identifier should be the same type of value as your `named_user_id` in Airship. For example, if your named users are organized by an account or username for your service, you must select the Acoustic Identifier type that corresponds the account or username value. 1. Select the options menu next to your new endpoint and select **Edit Endpoint Details**. 1. Go to the **Identifiers** tab and select **Edit** for the `named_user` identifier. > **Note:** You can only edit identifiers once. 1. Set the Identifier type to the identifier that corresponds to the`named_user_id` values for your named users. 1. Select **Save**. You are now ready to share your Acoustic audience with your app. ## Sharing Your Audience with Airship After you configure your endpoint, you have to determine when and how often to share your Acoustic audience with your Airship app. Your source audience is unique to your Acoustic environment and use case. 1. Go to the **Audiences** tab in the Acoustic dashboard and select **Share audiences and identifiers**. 1. Select **Share an audience**, then **Next**. 1. Select the Acoustic Source Audience that you want to share with your Airship app, and then select your Airship endpoint as the Destination Audience. 1. In **Create New Audience**, enter a name without spaces for this audience, then select **Next**. The audience name becomes the `name` of your custom event or static list in Airship. > **Note:** If sharing an audience as custom events, the event name must be entirely lowercase. If the name contains uppercase characters, Airship will not receive the event. 1. Under **Map audience identifiers**, select the **Source identifier** for your audience. This is the value mapped to your named users in Airship. 1. For **Destination identifier**, enter `named_user`, and then select **Next**. ![Mapping audience identifiers in Acoustic](https://www.airship.com/docs/images/acoustic-map-audience_hu_7d6ae8b9660f936c.webp) *Mapping audience identifiers in Acoustic* 1. For **Share audiences and identifiers**, determine the frequency, and then select **Next**. By default, Acoustic shares custom events with Airship as they occur. ![Configuring audience sharing frequency in Acoustic](https://www.airship.com/docs/images/acoustic-share-audiences_hu_b2fa273bc0e09a80.webp) *Configuring audience sharing frequency in Acoustic* 1. To provide destination options, select **Add New Records**, then specify a minimum number of records to share. * If you opt to share immediately, Acoustic will share an audience as soon as it meets the minimum threshold. * If you share the audience on a schedule, and you do not reach the minimum number of records before the scheduled interval, Acoustic will wait to share audiences and identifiers until the next scheduled interval. 1. Select **Share** to initiate audience sharing with Airship. ## Using Acoustic Custom Events as Automation Triggers You can use your Acoustic audience as a trigger in Automations and Sequences. As Acoustic shares custom events with your app, your app will trigger sending messages to associated named users, providing a powerful, automated way to stay in touch with your audience. In the *Setup* step in an automation or *Trigger* step in a sequence: 1. Select the **Custom Event** trigger, and specify the name of your custom event. The custom event name is the same as the *Audience name* in the Acoustic dashboard. 1. Configure the message that you want to send when Airship receives the corresponding audience of custom events from Acoustic. See also: * [Configure Triggers: Custom Event](https://www.airship.com/docs/guides/messaging/messages/sequences/triggers/#custom-event) * [Automation composer tutorial](https://www.airship.com/docs/guides/messaging/messages/sequences/create-automation/) * [Create a sequence](https://www.airship.com/docs/guides/messaging/messages/sequences/create/create/) ## Sending a Message to your Acoustic Audience List If you deploy your Acoustic audience as a static list, you can target that list in the Audience step when sending a message. The name of your list in Airship is the same as the name of your audience set in Acoustic under *Audiences*. Follow the steps in the [Audience step](https://www.airship.com/docs/guides/messaging/messages/create/#audience) of *Create a Message*. Using the **Target by conditions** or **Target specific users** option, search for and select your list. # Adjust > Set attributes and trigger automations from Adjust. Adjust provides mobile measurement capabilities, helping you learn about your audience. This integration helps you take advantage of your audience data from Adjust in Airship, either to segment your audience or to trigger automated messages. * Set attributes on your Airship audience, using information from Adjust to personalize messages and refine your audience. You must set up attributes in Airship to receive this information before you can set attributes from Adjust. * Send custom events from Adjust into Airship, utilizing your audience information from Adjust to personalize and trigger automations and [Sequences](https://www.airship.com/docs/reference/glossary/#sequence). ## Adjust Integration Requirements * **Accounts** 1. Adjust 1. Airship — Must include messaging * **Airship project** * The Airship SDK must use the same user identity as the Adjust SDK. ## Configuring the Adjust Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Adjust**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Attributes](https://www.airship.com/docs/reference/glossary/#attributes), [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event), and an authentication token for your project. Adjust uses the token to communicate with your project in Airship * Add Airship as a partner in Adjust. ## SDK Setup To use the Adjust integration, you must add Adjust dependencies and associate Airship Channel IDs with Adjust's `airship_channel_id` callback parameter. ### Android Setup For more information, see the [Adjust Android SDK Docs](https://github.com/adjust/android_sdk#quick-start-1). 1. **Add dependencies to `build.gradle`** ```gradle implementation 'com.adjust.sdk:adjust-android:4.22.0' implementation 'com.android.installreferrer:installreferrer:1.1.2' ``` 1. **Associate channel IDs with Adjust `airship_channel_id`** ```java String channelId = Airship.getChannel().getId(); Adjust.addSessionPartnerParameter("airship_channel_id", channelId); ``` ### iOS Setup For iOS, you must add the Adjust dependency to your `Podfile` and then associate channel IDs with Adjust's `airship_channel_id` callback parameter. For more information, see the [Adjust iOS SDK Docs](https://github.com/adjust/ios_sdk#basic-integration). **Add dependency to `Podfile`** 1. If this is your first time using CocoaPods, Install CocoaPods using `gem install cocoapods`. Otherwise, continue to Step 3. 1. Run `pod setup` to create a local CocoaPods spec mirror. 1. Create a `Podfile` in your Xcode project directory by running `pod init` in your terminal, edit the `Podfile` generated and add the dependency `pod 'Adjust', '~> 4.22.1'`. 1. Run `pod install` in your Xcode project directory. CocoaPods should download and install the added library, and create a new Xcode workspace. Open up this workspace in Xcode or typing `open *.xcworkspace` in your terminal. **Swift: Associate channel IDs with Adjust `airship_channel_id`** ```swift let channelId = UAirship.channel()?.identifier if (channelId != nil) { Adjust.addSessionPartnerParameter("airship_channel_id", value: channelId!) } ``` **Objective-C: Associate channel IDs with Adjust `airship_channel_id`** ```objc NSString *channelId = [UAirship channel].identifier; [Adjust addSessionPartnerParameter:@"airship_channel_id" value:channelId]; ``` ## List of Attributes Received from Adjust | Attribute Name | Adjust parameter | Attribute ID | Type | |---|---|---|---| | Adjust Device ID | `adid` |`adjust_device_id` | Text | | Adjust Device City | `city` |`adjust_device_city` | Text | | Adjust Device Country Subdivision | `country_subdivision` | `adjust_device_country_subdivision` | Text | | Adjust Device Country Code | `country` | `adjust_device_country_code` | Text | | Adjust Device Currency Code | `currency` | `adjust_currency_code` | Text | | Adjust Device Model Number | `device_name` | `adjust_device_model_number` | Text | | Adjust Google Play Store Store Ad ID MD5 Hash | `gps_adid_md5` | `adjust_gps_ad_id_md5` | Text | | Adjust Google Play Store Ad ID | `gps_adid` | `adjust_gps_ad_id` | Text | | Adjust Device IP Address | `ip_address` | `adjust_device_ip_address` | Text | | Adjust Is Reattributed | `is_reattributed` | `adjust_is_reattributed` | Number1 | | Adjust Device ISP | `isp` | `adjust_device_isp` | Text | | Adjust Device Language Code | `language` | `adjust_device_language_code` | Text | | Adjust Last Session Time in Seconds | `last_time_spent` | `adjust_last_time_spent` | Number | | Adjust Lifetime Session Count | `lifetime_session_count` |`adjust_lifetime_session_count` | Number | | Adjust Attribution Method | `match_type` | `adjust_attribution_method` | Text | | Adjust OAID Device ID MD5 Hash | `oaid_md5` | `adjust_oaid_device_id_md5` | Text | | Adjust OAID Device ID | `oaid` | `adjust_oaid_device_id` | Text | | Adjust Device Postal Code | `postal_code` | `adjust_device_postal_code` | Text | | Adjust Random Device Reference Tag | `reftag` | `adjust_reftag` | Text | | Adjust Device Region Code | `region` | `adjust_device_region_code` | Text | | Adjust Reporting Currency | `reporting_currency` | `adjust_reporting_currency` | Text | | Adjust SDK Version | `sdk_version` | `adjust_sdk_version` | Text | | Adjust Session Count | `session_count` | `adjust_session_count` | Number | | Adjust Current Session Time in Seconds | `time_spent` | `adjust_time_spent` | Number | | Adjust Tracking Enabled | `tracking_enabled` | `adjust_tracking_enabled` | Number1 | | Adjust Tracking Limited | `tracking_limited` | `adjust_tracking_limited` | Number1 | | Adjust Web Unique ID | `web_uuid` | `adjust_web_uuid` | Text | | Adjust Network Name | `network_name` | `adjust_network_name` | Text | | Adjust Campaign Name | `campaign_name` | `adjust_campaign_name` | Text | 1 Value is either 0 (false) or 1 (true/enabled). ### Airship Channel Example with Adjust Attributes Attributes appear in an `attributes` object on the channel. Attributes won't appear on channels until set from Adjust. **Airship channel example** ```json { "channel_id": "516a818b-b57e-4a35-b7ad-41c6ef447364", "device_type": "android", "installed": true, "opt_in": true, "background": true, "push_address": "", "created": "2019-07-31T00:10:34", "last_registration": "2020-08-17T08:11:46", "alias": null, "tags": [], "tag_groups": { "group": [ "tags" ] }, "device_attributes": { "ua_device_os": "10", "ua_country": "US", "ua_device_model": "SM-G973U", "ua_local_tz": "America/Los_Angeles", "ua_app_version": "", "ua_location_settings": "true", "ua_language": "en", "ua_sdk_version": "13.2.0", "ua_carrier": "Verizon " }, "attributes": { "adjust_lifetime_session_count": 45, "adjust_device_postal_code": "97209", "adjust_device_region_code": "US", } } ``` ## Custom Event Properties from Adjust Events from Adjust are of the `Custom` type, with the `body.name` of the event representing the Adjust event type — `install`, `rejected install`, `session`, `in-app event`, `reattribution`, or `rejected reattribution`. Properties from Adjust appear in the `body.properties` object. | Custom Event Property | Description | |---|---| | `adjust_attribution_method` | Attribution method | | `partner_parameters` | Custom partner parameters collected by the Adjust SDK or S2S request and transmitted to third party providers via postbacks | | `reporting_revenue` | Revenue, as reported in the Adjust Dashboard, in whole currency units | | `revenue_float` | Revenue, as sent from Adjust SDK, in whole currency units | | `revenue_usd_cents` | Revenue, in US cents | | `revenue_usd` | Revenue, in US dollars | | `revenue` | Revenue, as sent from Adjust SDK in cents | | `adjust_network_name` | Network name | | `adjust_campaign_name` | Campaign name | **Sample Adjust Custom Event** ```json { "id": "aae70da5-a276-4dd4-a11e-f5b5796a52f1", "offset": "1000000000780", "occurred": "2020-08-17T22:37:53.000Z", "processed": "2020-08-17T22:40:35.337Z", "device": { "ios_channel": "c014a2ed-4c30-4f6d-a9b3-e2ba7a01b45c", "channel": "c014a2ed-4c30-4f6d-a9b3-e2ba7a01b45c", "device_type": "IOS", "attributes": { "locale_variant": "", "app_version": "1.0", "device_model": "x86_64", "app_package_name": "com.urbanairship.partner.adjust", "iana_timezone": "America/Los_Angeles", "push_opt_in": "false", "locale_country_code": "US", "device_os": "13.0", "locale_timezone": "-25200", "locale_language_code": "en", "location_enabled": "false", "background_push_enabled": "false", "ua_sdk_version": "13.2.0", "location_permission": "UNPROMPTED" } }, "body": { "name": "session", "session_id": "c014a2ed-4c30-4f6d-a9b3-e2ba7a01b45c", "source": "API", "properties": { "adjust_attribution_method": "", "partner_parameters": "", "reporting_revenue": 25, "revenue_float": 25.00, "revenue_usd_cents": 2500, "revenue_usd": 25, "revenue": 2500, "adjust_network_name": "meta", "adjust_campaign_name": "Spring 2020" } }, "type": "CUSTOM" } ``` # Adobe Analytics > Complement your Adobe Analytics data with real-time mobile and web engagement events. ## Overview Adobe Analytics provides behavioral analytics and content performance measurement for websites and mobile apps. Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) (RTDS) provides a live view into your application, adding the "messaging perspective" to your Adobe Analytics information. This integration enables a complete view of the user experience by combining Adobe Analytics data with user-specific interactions such as push sends, direct and indirect opens, web notification clicks, and uninstalls. Additionally, Airship augments Adobe's device reporting with information on in-app behavior defined by the Airship SDK. Airship events can tell you when a Message Center message was delivered, read, and deleted. They can also describe what happened to an in-app notification — whether it was displayed or expired, and what happened to it after it was displayed. Did the user dismiss it, interact with it, or allow it to resolve itself? --- There are three major steps to setting up this integration. You will need help from your developers (iOS and Android) and your Adobe Analytics and Airship administrators to: 1. **Add client code** (Developers) — This code associates the user IDs between the two systems, tying events captured from the Airship SDK (iOS, Android, or Web) to events captured from the Adobe Analytics SDK. 1. **Configure an outbound integration for Adobe Analytics** (Airship administrator) — The RTDS integration sends Airship events to an Adobe Analytics report suite. 1. **Set up Adobe Analytics processing rules** (Adobe Analytics administrator) — These rules map Airship events to your Adobe variables and events. ## Adobe Analytics Integration Requirements This integration requires these accounts: 1. Adobe Analytics 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Adding Client Code Fetch the Adobe Analytics visitor ID for your user, then associate it with the Airship [Channel ID](https://www.airship.com/docs/reference/glossary/#channel_id). See [Android](https://www.airship.com/docs/developer/sdk-integration/android/analytics/#associated-identifiers), [iOS](https://www.airship.com/docs/developer/sdk-integration/apple/analytics/#associated-identifiers), and [Web](https://www.airship.com/docs/developer/sdk-integration/web/analytics-and-reporting/#custom-identifiers) custom identifiers documentation. #### iOS Swift ```swift // Get the Adobe visitor ID let visitorID = ADBMobile.visitorMarketingCloudID() // Add the visitor ID to the current associated identifiers let identifiers = Airship.analytics.currentAssociatedDeviceIdentifiers() identifiers.set(identifier: visitorID, key:"AA_visitorID") // Associate the identifiers Airship.analytics.associateDeviceIdentifiers(identifiers) ``` ```obj-c // Get the Adobe visitor ID NSString *visitorID = [ADBMobile visitorMarketingCloudID]; // Add the visitor ID to the current associated identifiers UAAssociatedIdentifiers *identifiers = [UAirship.analytics currentAssociatedDeviceIdentifiers]; [identifiers setIdentifier:visitorID forKey:@"AA_visitorID"]; // Associate the identifiers [UAirship.analytics associateDeviceIdentifiers:identifiers]; ``` #### Android Java ```java // Get the Adobe visitor ID String visitorId = Visitor.getMarketingCloudId(); // Add the visitor ID to the current associated identifiers Airship.getAnalytics() .editAssociatedIdentifiers() .addIdentifier("AA_visitorID", visitorId) .apply(); ``` #### Web The Adobe Experience Cloud Identity Service (ECID) JavaScript library retrieves the visitor ID asynchronously. Initialize both SDKs before associating the identifier. ```javascript const sdk = await UA; // Adobe ECID provides the visitor ID via callback Visitor.getInstance(adobeOrgId).getMarketingCloudVisitorID(async (visitorId) => { if (visitorId) { await sdk.analytics.associatedIdentifiers.edit() .add("AA_visitorID", visitorId) .apply(); } }); ``` > **Note:** The `analytics` feature must be enabled in your Web SDK configuration. This is controlled by the `enabledFeatures` list. Ensure `analytics` is included. See [Data Collection for the Web SDK](https://www.airship.com/docs/developer/sdk-integration/web/data-collection/).

Once set, all associated identifiers are returned in RTDS under the "identifiers" key:

```json { "ios_channel": "a6b392d6-3b0d-4c00-98ef-5cb91d51268a", "named_user_id": "albert", "identifiers": { "foo": "bar", "verycustomid": "123554" }, "attributes": { "package_name": "com.company_name.app_name", "version": "1.0.0", "ua_library": "7.0.2" } } ```

See also: RTDS API: Device Information.

## Configuring the Outbound Integration > **Warning:** Airship sends events to Adobe with timestamps. If your Adobe Analytics Report Suite has timestamps disabled, Adobe will drop Airship events. See [Timestamps Optional](https://docs.adobe.com/content/help/en/analytics/admin/admin-tools/timestamp-optional.html) for more information. You will need your Adobe Analytics Report Suite ID and Tracking Server URL. If you do not have these, contact your iOS, Android, or Web developer. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Adobe Analytics**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Enter your Report Suite ID * Enter your Tracking Server URL * Select the Airship events to send to your Report Suite After configuring your app and your integration, you can create event-based Segments in Adobe Analytics. See [Recommended Attribute Mapping](#connect-aa-mapping) for recommended mapping of Data Streaming events to Adobe Analytics events. ### Recommended Property Mapping {#connect-aa-mapping} > **Important:** If you set up your integration before March 11, 2020, your event fields will not belong to a global `airship` object. You must create a new integration to use the `airship.` namespace. In Adobe Analytics, you capture the data that is valuable to you using context data and processing rules. Airship uses Adobe's [Data Insertion API](https://helpx.adobe.com/analytics/kb/data-insertion-api-post-method-adobe-analytics.html) to send data to Adobe Analytics. Airship uses the `contextData` field so that you can include every piece of relevant data from an Airship event without consuming the limited number of variables and properties that Adobe Analytics supports. You can set the Adobe Analytics processing rules so that every field in an Airship event maps to an Adobe Analytics concept. After your Adobe Analytics administrator sets up your processing rules, you can view Airship event data in your Adobe Analytics dashboard. We derive `contextData` keys from the original Data Streaming events using JSON notation, and use `airship` to represent the global parent for all Airship event properties. For example, this is the push identifier of a notification that caused an event: ```json { "body": { "triggering_push": { "push_id": "d99bd842-f816-4560-bc59-b057f7c0e164" } } } ``` This field would be available for mapping as `airship.body.triggering_push.push_id`. When mapped to an sProp, eVar, event, or other Adobe Analytics concept, the variable's value would be `d99bd842-f816-4560-bc59-b057f7c0e164`. > **Note:** The above JSON represents a partial event object. Actual JSON objects coming from the > Real-Time Data Streaming API are more complex. To see all the available fields, read the [Data Streaming API Reference](https://www.airship.com/docs/developer/rest-api/connect/). ## Setting Up Adobe Analytics Processing Rules You or your Adobe administrator must set up processing rules in the Adobe Analytics Admin Console to enable Adobe Analytics to capture events from Airship. These processing rules assign `contextData` variables to Adobe Analytics variables or increment events (counters) accordingly. 1. In the Adobe Analytics interface, select **Admin Console** and navigate to **Report Suites**. 1. Select the Report Suite that Airship is sending data to, and then go to **Edit Settings**, then **General**, then **Processing Rules**. 1. Select **Add Rule**. 1. Enter a title for the rule. For example, "Airship to Adobe Analytics Integration." 1. Select **Add Action**. 1. If you need to setup an sProp or eVar to capture a dimension (e.g., Event Type), select **Overwrite Value Of** and then select the sProp or eVar that you want to set. After the **With** label, select the `contextData` variable that you want to set the sProp or eVar with. 1. If you need to set up an Event to capture the number of times something occurred, e.g., the number of Opens, select **Set Event** and then select the Adobe Analytics Event you want to set. Select **Custom Value** and set the value to 1. Then set a condition for when you want to set the event. Continuing with the *Opens* example, you would set up a condition where the *If* is for the same *type* `contextData` variable, and the condition would be *equals OPEN*. This will increment the Open Event each time the Data Streaming Event Type is set to *OPEN*. This is just one example of how you can set up a variable and an event. The same concept applies for each Airship event type and dimension that you want to capture in Adobe. ### Recommended Concept Mappings Below are some recommendations on different ways that you can get started mapping the Airship concepts to Adobe Analytics concepts. This table provides example `contextData` variable keys and the recommended Adobe Analytics variable type to capture information from incoming Airship event information. See our [Real-Time Data Streaming documentation](https://www.airship.com/docs/developer/rest-api/connect/) for information on events and fields that aren't listed below. Use JSON object notation to reach nested properties (in the format `airship.property.sub-property`). In Adobe analytics, all variables are preceded by `airship.`. | Airship Concept | Recommended Adobe Analytics Mapping Context | Data Variable | | --- | --- | --- | | Data Streaming event type (e.g., send, direct open, indirect open, web notification click) | Custom event (one for each type), and an sProp for segmentation (all the people who received a message, or opened, etc.) | `type` | | Unique push ID, group ID, or variant | eVar | `airship.body.push_id`, `airship.body.group_id`, `airship.body.variant`, `airship.body.triggering_push.push_id`, `airship.body.triggering_push.group_id`, `airship.body.triggering_push.variant`, `airship.body.last_delivered.push_id`, `airship.body.last_delivered.group_id`, `airship.body.last_delivered.variant`, `airship.body.replacing_push.push_id`, `airship.body.replacing_push.group_id`, `airship.body.replacing_push.variant` | | Device Identifiers — mobile (e.g., Named User, Airship Channel ID) | eVar | `airship.device.ios_channel`, `airship.device.android_channel`, `airship.device.named_user`, `airship.device.identifiers.com.urbanairship.idfa` | | Device Identifiers — web (Airship Channel ID) | eVar | `airship.device.channel` | | Web browser context | sProp | `airship.device.attributes.web_browser_name`, `airship.device.attributes.web_browser_type`, `airship.device.attributes.web_browser_version`, `airship.device.attributes.web_user_agent_string` | | In-App Message Resolution Type | sProp AND eVar | `airship.body.type`
(and type is `IN_APP_MESSAGE_RESOLUTION`) | | In-App Message Expiration Type | sProp AND eVar | `airship.body.type` (and type is `IN_APP_MESSAGE_EXPIRATION`) | | In-App Message Button identifiers | sProp | `airship.body.button_id`, `button.button_description` | | Adobe visitorId (via associated identifiers) | eVar | `airship.device.identifiers.AA_visitorID` | | Other Data Streaming information | Varies | You can determine what the context variable name will be based on the Data Streaming event data. Inner properties are joined with outer properties via a period. | `contextData` can take a long time to appear in the Adobe Analytics dashboard. Please allow at least one hour before contacting Airship Support. > **Important:** **Known issue:** If no processing rules have been defined, no `contextData` > variables will be available for mapping. > > As a workaround until Adobe Analytics fixes this issue, add a trivial rule > that does nothing, then proceed establishing your mapping as normal. ## Sample Data Sent to Adobe ```xml your-report-suite-id 1.0 OPEN-ios 2016-05-19T22:42:36.946Z 03f13497-1e13-11e6-bc8d-001018948f58 444449 2016-05-19T22:42:36.946Z 2016-05-19T22:42:51.511Z ec2816a3-72c7-4b9b-9ee6-ae31229f28bd mtr1234 true 72153D08-B6A2-4900-9045-6776734B183B E51089C4-DD2D-44AA-BCD0-092DD6A16085 DFEF1B87-2253-423C-97D4-003AA36F5C25 215 iPhone6,1 com.urbanairship.internalsampleapp America/Los_Angeles true US 9.3.2 -25200 en false true 7.1.0 UNPROMPTED 787bf679-4732-4722-b761-bcd9b1e7a1eb 685783c0-68b1-4d05-bc94-98e90d943fd1 1 2016-05-19T18:04:40.049Z OPEN ec2816a372c74b9b9ee6ae31229f28bd ``` # Adobe Experience Platform CDP > Send Airship data into Adobe Experience Platform CDP. ## Overview Adobe Experience Platform (AEP) CDP creates a unified profiling system by capturing and passing data to Adobe native cloud solutions and third-party tools, like Airship. This integration supports passing Adobe segments and profile attributes to Airship, and sending Airship events to customer profiles within Adobe. ## Adobe Experience Platform Integration Requirements * **Accounts** 1. Adobe Experience Platform 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for source/outbound integration only* * **Airship project** * [Named User](https://www.airship.com/docs/reference/glossary/#named_user) must be enabled for your project. ## Destination Integration To send Adobe profile data to Airship, we have [Destination](https://experienceleague.adobe.com/docs/audience-manager/user-guide/features/destinations/destinations.html?lang=en#destinations) integrations for ingesting [Tags](https://www.airship.com/docs/reference/glossary/#tag) and [Attributes](https://www.airship.com/docs/reference/glossary/#attributes) to support message targeting and personalization on Airship channels and named users. > **Example Attributes Use Case**: Leverage Experience Platform profile data to set location attributes within Airship, enabling a hotel brand to display an image for the nearest hotel location for each user. > **Example Tags Use Case**: Retailers or entertainment platforms can create user profiles on their loyalty customers, and pass those segments into Airship for message targeting on mobile campaigns. Documentation for our destination integrations is hosted on the Adobe site: * [Airship Attributes Destination](https://experienceleague.adobe.com/docs/experience-platform/rtcdp/destinations/destinations-cat/mobile-engagement-destinations/airship-attributes-destination.html#destinations) * [Airship Tags Destination](https://experienceleague.adobe.com/docs/experience-platform/rtcdp/destinations/destinations-cat/mobile-engagement-destinations/airship-tags-destination.html#destinations) ### Configuring the Destination Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Adobe Experience Platform**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create a [Tag Group](https://www.airship.com/docs/reference/glossary/#tag_group), [Attributes](https://www.airship.com/docs/reference/glossary/#attributes), and an authentication token. Adobe uses the token to communicate with your project in Airship. * Configure Airship as a new destination in AEP. ## Source Integration This section describes an Airship [Source](https://experienceleague.adobe.com/docs/experience-platform/rtcdp/sources/sources-overview.html?lang=en#sources) integration for Adobe, meaning that Airship is the source of the data. Our source integration uses [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) to send Airship event data, e.g., Opens, Tag change events, etc., to a cloud storage bucket. You map these events to Adobe profiles in the AEP dashboard. > **Example Use Case**: Enrich your Adobe dataset with Airship-generated information gleaned from tags and events, e.g., *Predicted to Churn*, *Uninstall*, purchase events, etc. This data can then be used for further segmentation, triggering of campaigns in other Adobe tools, and profile enrichment. ### Configure Storage Bucket This connection point takes Airship event data and sends it to a storage bucket in either [Google Cloud Storage](https://cloud.google.com/storage/) (GCS) or [Amazon S3](https://aws.amazon.com/s3/). Before you can set up your connection point, you must create a storage bucket. See our [Google Cloud Storage](https://www.airship.com/docs/integrations/gcs/) or [Amazon S3](https://www.airship.com/docs/integrations/aws/#amazon-s3) documentation to create the bucket, and then proceed to the next section. ### Airship Outbound Integration Steps You will need the following, depending on which bucket you created: * **Google Cloud Storage:** Private key and bucket name * **Amazon S3:** Bucket name In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Adobe Experience Cloud**. 1. Follow the onscreen instructions to configure the integration. It may take several minutes to begin populating events in AEP. ### AEP Mapping Now you are ready to create your schema in the Adobe Experience Platform. See [Create a schema using the Schema Editor](https://experienceleague.adobe.com/docs/experience-platform/xdm/tutorials/create-schema-ui.html#tutorials) on the Adobe documentation site to get started using the Airship Event mixin. # Amazon Web Services > Store, analyze, and customize your mobile data. Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) supports two integrations with Amazon Web Services: S3 and Kinesis. This document walks through the process of connecting to each service, as well as the S3 inbound integration. ## AWS Integration Requirements * Accounts 1. AWS S3 or Kinesis 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) *Required for outbound integration only* ## Amazon S3 S3 is a cloud storage service. Once you have integrated Real-Time Data Streaming with S3, your event stream data should begin funnelling into a bucket. From there, how you use the data is up to you, but some potential ideas are: * Output CSV files with user-level send and open information, and import these files into your CRM system. * Output your data in JSON format, and use that data along with [Amazon Redshift](https://aws.amazon.com/redshift/) to perform detailed analysis of your users. * Export Attribute data from your Data Warehouse and import it into Airship > **Tip:** Be sure to regularly audit your event stream S3 bucket. Real-Time Data Streaming outputs large > amounts of data, which can lead to expensive AWS bills if not managed > appropriately. ### Configure an inbound integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Amazon Web Services (AWS)**. 1. ![Configuring an inbound S3 integration](https://www.airship.com/docs/images/integrations/s3-configure-connection_hu_63d4c93be9a99178.webp) *Configuring an inbound S3 integration* Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create a new connection. * Select a data type: Attributes or Static Lists. * Enter your credentials. * Specify your region. * Provide a path to a storage folder. * Set a retrieval frequency. Each configured integration appears in a table row. Select the pause icon () or pencil icon () to pause or edit the integration. Select the report icon () to view the sync details. ![Viewing the sync details for an S3 inbound integration](https://www.airship.com/docs/images/integrations/s3-sync-details_hu_c6dcbec4b04796a6.webp) *Viewing the sync details for an S3 inbound integration* Airship tracks which files have been processed, so only new files uploaded after the last sync will be processed. You are responsible for managing processed files in your bucket, such as setting a time to live (TTL) policy to automatically delete old files. ### Configure an outbound integration First, create an S3 bucket, then grant permissions. 1. Log in to [Amazon Web Services](https://aws.amazon.com/). 1. Select **Services**, then **S3**. 1. Create an S3 bucket, selecting the appropriate S3 Region for your project. For more information on S3 regions, see [AWS service endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region). 1. Go to **Permissions**, then **Access Control List**. 1. Select **Add Account**. 1. In the canonical ID / account field, enter Airship’s ID: `7e7585ea39ccec40d8297a9038ba7f211b1c4a48994c2c702298aca8732f9f0e` 1. Select **List objects** and **Write objects**. You can select additional permissions, but your bucket must have these permissions to support an Airship integration. 1. Select **Save**. Next, configure the integration in Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Amazon S3**. 1. Follow the onscreen instructions to configure the integration.

You can select JSON or CSV as the output format and have the option to encrypt your data using [server-side encryption](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html) or export as a compressed gzip file. Tag changes are not supported by CSV because their dynamic nature cannot be easily represented in a single row column structure. ### Output Structure and Files Your S3 bucket's directory structure and files will be named using the following patterns: CSV : appKey + "/" + integrationId + "/S3_CSV/" + eventType + "/" + year + "\_" + month + "\_" + day + "/" + year + "\_" + month + "\_" + day + "\_" + hour + "\_" + minute + "\_" + second + ".csv" For a list of headers for each supported event type, see [S3 CSV Headers](#s3-csv-headers) below. JSON : appKey + "/" + integrationId + "/S3_JSON/" + year + "\_" + month + "\_" + day + "/" + year + "\_" + month + "\_" + day + "\_" + hour + "\_" + minute + "\_" + second + ".json" There will be one file generated per hour, assuming the relevant event occurred during that hour. > **Note:** File size maximum is 15 GB. If the volume of events for an app results in a > file exceeding 15 GB, you may instead see multiple files. #### Sample File Here are a few lines from a sample CSV file for `LOCATION` events: ```text Nonet.id,event.type,event.occurred,device.platform,device.channel_id,device.named_user_id,LOCATION.latitude,LOCATION.longitude,LOCATION.foreground,LOCATION.session_id 00000000-0000-0000-0000-000000000000,LOCATION,2015-11-18T01:21:33.180Z,IOS,90823094-1234-94b2-sb39-099s9018gx55,,14.5224123,-22.1236212,false, 00000000-0000-0000-0000-000000000000,LOCATION,2015-11-18T01:21:33.171Z,IOS,90823094-1234-94b2-sb39-099s9018gx55,,14.5224123,-22.1236212,false, 00000000-0000-0000-0000-000000000000,LOCATION,2015-11-18T01:21:33.162Z,IOS,90823094-1234-94b2-sb39-099s9018gx55,,14.5224123,-22.1236212,false, ... ``` If you choose to output your data as JSON, the files will follow the schemas in [Data Formats](https://www.airship.com/docs/developer/rest-api/connect/schemas/) for the RTDS API. ## Amazon Kinesis Kinesis is AWS's conduit for streaming data. Once you have integrated Real-Time Data Streaming with Kinesis, you will be able to load and analyze mobile events in real time. Once you have Airship data running through a functioning Kinesis stream, you will likely want to begin analyzing and processing that data. To that end, [AWS Lambda](https://aws.amazon.com/documentation/lambda/) is a backend compute service that can process events in real time. Lambda responds to events that occur on other AWS products, such as a Kinesis stream. As an example, let's say you have built out a mapping between Named User IDs and associated email addresses, and you would like to send an email to any user that chooses to uninstall your app. Here's a typical app uninstall event: ```json { "id" : "ff76bb85-74bc-4511-a3bf-11b6117784db", "type": "UNINSTALL", "offset": 1235, "occurred": "2015-05-03T02:32:12.088Z", "processed": "2015-05-03T12:12:43.180Z", "device": {"named_user_id": "named-user-id-123"} } ``` You would then use Lambda to create a function associated with your Airship-Kinesis stream. The function should search for `UNINSTALL` type events that occurred on devices with associated Named User IDs and then send those devices an email: ```python def uninstall_email(event, context): if (event['type'] == 'UNINSTALL' and 'named_user_id' in event['device']): send_email(event['device']['named_user_id']) ``` The above pseudo-code finds events that fit the parameters and then uses the `send_email` function to send an email to the appropriate Named User. There are thousands of ways to process and analyze your Airship data with Kinesis and Lambda, e.g., editing your CRM database when certain events come in, writing streams into Redshift or Dynamo DB, monitoring tag changes. The possibilities are endless. ### Setting up AWS Kinesis {#aws-kinesis} First, create a Kinesis stream: 1. Log in to the AWS Console. 1. Go to **Kinesis**. 1. Select **Create Data Stream**, and follow the steps. When complete, copy the **ARN**. You will need it when creating a policy. Next, create a policy. The following represents the minimum policy to support Airship Real-Time Data Streaming: 1. Go to **Services**, then search for and select "IAM" (Identity and Access Management). 1. Go to **Policies** and select **Create Policy**. 1. For the **Service**, select **Kinesis**. 1. Assign actions for the policy. At a minimum, you should assign `DescribeStream`, `GetRecords`, `GetShardIterator`, `PutRecord`, and `PutRecords` (found under Read and Write categories). 1. For **Resources**, enter the ARN. 1. Review, and then submit the policy. Now you can set up an authentication method that gives Airship access to your Kinesis instance. Airship supports two authentication methods for Kinesis integration: Role delegation or an IAM user with access keys. Role delegation is recommended since it provides enhanced security by allowing Airship to assume a role in your AWS account without requiring long-lived access keys. Benefits include: - **No long-term credentials** — No access keys to manage or rotate - **Temporary access** — Credentials automatically expire - **External ID protection** — Prevents confused deputy attacks - **Least privilege** — Role only has permissions you specify To set up role delegation in Kinesis: 1. Go to **Roles** and select **Create Role**. 1. Under **Trusted entity type**, select **AWS account**. 1. Under **An AWS account**, select **Another AWS account**. 1. In the **Account ID** field, enter Airship's AWS account ID: `208889940903` 1. (Optional) For enhanced security, check **Require external ID** and enter a value. You will enter the ID when configuring the connection in Airship. 1. Select **Next**. 1. Under **Permissions policies**, select the policy you created in previous steps. 1. Select **Next**. 1. Enter a role name and description. 1. Select **Create role**. 1. After creating the role, select it and copy the **Role ARN**. You will need this when configuring your Kinesis integration in Airship. Authentication using an IAM user with access keys is a legacy method, where you create a user to attach your policy to and to represent Airship in your Kinesis instance. To set up an IAM user with access keys in Kinesis: 1. Go to **Users** and select **Create User**. 1. Enter a user name. 1. Select **Next**. 1. Under **Permissions options**, select **Attach policies directly**, and then select the policy you created in previous steps. 1. Under **Set permissions boundary**, select **Use a permissions boundary to control the maximum user permissions**, and then select the policy you created in previous steps. 1. Select **Next**. 1. Select **Create user**, and then select the new user and go to **Security credentials**. 1. Select **Create access key**, choose **Third-party service**, and complete the remaining onscreen steps. 1. After you finish creating your access key, copy the **Access key ID** and **Secret access key**. You will need these when configuring your Kinesis integration in Airship. ### Configuring the AWS Kinesis Integration To set up the integration, you will need your Kinesis stream name and your authentication information: * **For Role delegation**, you need your role ARN from the IAM role you created and your external ID, if configured. * **For IAM User with access keys**, you need your Access Key ID and Secret Access Key from the IAM user you created. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Amazon Web Services / Amazon Kinesis**. 1. Choose your authentication method and follow the onscreen instructions to configure the integration. 1. (Optional) Select **Include app key in event payloads** to add an `app_key` field to each event. This is useful when sending events from multiple Airship applications to the same Kinesis stream, allowing you to distinguish which application generated each event. ### Troubleshooting Role Delegation Use the following steps to troubleshoot errors you may encounter when using role delegation for authentication: **"Access Denied"** - Check that the role ARN is correct and exists. - Verify the external ID matches exactly. See the information for "Invalid external ID" below. - Ensure the role trusts account `208889940903`. **"Invalid external ID"** - Ensure the external ID in your integration configurations matches the one in your role's trust policy. The ID is case-sensitive. **"Stream not found"** - Verify the stream name is correct. - Check that the region matches your stream's region. - Ensure the stream exists and is active. ## Appendix: S3 CSV Headers {#s3-csv-headers} You may choose the CSV format for your [Amazon S3](#amazon-s3) data output. These are the headers for supported event types. OPEN : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, LAST_DELIVERED_PUSH_ID, LAST_DELIVERED_GROUP_ID, LAST_DELIVERED_VARIANT_ID, LAST_DELIVERED_TIME, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, SESSION CLOSE : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, SESSION CUSTOM : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, LAST_DELIVERED_PUSH_ID, LAST_DELIVERED_GROUP_ID, LAST_DELIVERED_VARIANT_ID, LAST_DELIVERED_TIME, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, SESSION, NAME, VALUE, TRANSACTION, INTERACTION_ID, INTERACTION_TYPE, CUSTOMER_ID LOCATION : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, SESSION, LATITUDE, LONGITUDE, FOREGROUND SEND : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID TAG_CHANGE : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE RICH_DELETE : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID RICH_DELIVERY : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID RICH_READ : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID REGION : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, SESSION, ACTION, REGION_ID, NAME, SOURCE, SOURCE_ID IN_APP_MESSAGE_DISPLAY : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, SESSION IN_APP_MESSAGE_EXPIRATION : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, SESSION, TIME_SENT, RESOLUTION_TYPE, TIME_EXPIRED, REPLACING_PUSH_PUSH_ID, REPLACING_PUSH_GROUP_ID, REPLACING_PUSH_VARIANT_ID, REPLACING_PUSH_TIME IN_APP_MESSAGE_RESOLUTION : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, SESSION, TIME_SENT, RESOLUTION_TYPE, BUTTON_ID, BUTTON_DESCRIPTION, DURATION CONTROL : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID SCREEN_VIEWED : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, SESSION, DURATION, PREVIOUS_SCREEN, VIEWED_SCREEN FIRST_OPEN : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE UNINSTALL : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE PUSH_BODY : ID, TYPE, OCCURRED, PROCESSED, OFFSET, PUSH_ID, GROUP_ID, VARIANT_ID, PAYLOAD, TRIMMED, RESOURCE WEB_CLICK : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, PUSH_ID, GROUP_ID, VARIANT_ID WEB_SESSION : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, LAST_DELIVERED_PUSH_ID, LAST_DELIVERED_GROUP_ID, LAST_DELIVERED_VARIANT_ID, LAST_DELIVERED_TIME, SESSION IN_APP_BUTTON_TAP : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, APP_DEFINED_ID, BUTTON_ID, GROUP_ID, RENDERED_LOCALE, PUSH_ID, SESSION, TIME_SENT, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME IN_APP_EXPERIENCES : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, APP_DEFINED_ID, EVENT_NAME, GROUP_ID, PUSH_ID, SESSION, SURVEY_TYPE, TIME_SENT, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, VARIANT_ID IN_APP_FORM_DISPLAY : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, APP_DEFINED_ID, GROUP_ID, PUSH_ID, SESSION, TIME_SENT, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, IN_APP_FORM_EVENT_TYPE IN_APP_FORM_RESULT : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, APP_DEFINED_ID, GROUP_ID, PUSH_ID, SESSION, TIME_SENT, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, IN_APP_FORM_EVENT_TYPE IN_APP_PAGE_SWIPE : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, APP_DEFINED_ID, FROM_PAGE_INDEX, FROM_PAGE_IDENTIFIER, GROUP_ID, RENDERED_LOCALE, PAGER_IDENTIFIER, PUSH_ID, SESSION, TIME_SENT, TO_PAGE_IDENTIFIER, TO_PAGE_INDEX, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME IN_APP_PAGE_VIEW : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, APP_DEFINED_ID, COMPLETED, GROUP_ID, RENDERED_LOCALE, PAGE_COUNT, PAGE_IDENTIFIER, PAGE_INDEX, PAGER_IDENTIFIER, PUSH_ID, SESSION, TIME_SENT, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME, VIEWED_COUNT IN_APP_PAGER_COMPLETED : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, APP_DEFINED_ID, COMPLETED, GROUP_ID, RENDERED_LOCALE, PAGE_COUNT, PAGE_IDENTIFIER, PAGE_INDEX, PAGER_IDENTIFIER, PUSH_ID, SESSION, TIME_SENT, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME IN_APP_PAGER_SUMMARY : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, APP_DEFINED_ID, COMPLETED, GROUP_ID, RENDERED_LOCALE, PAGE_COUNT, PAGE_IDENTIFIER, PAGER_IDENTIFIER, PUSH_ID, SESSION, TIME_SENT, TRIGGERING_PUSH_ID, TRIGGERING_GROUP_ID, TRIGGERING_VARIANT_ID, TRIGGERING_TIME SEND_ABORTED : ID, TYPE, OCCURRED, PROCESSED, OFFSET, NAMED_USER_ID, ANDROID_CHANNEL, IOS_CHANNEL, AMAZON_CHANNEL, CHANNEL, DEVICE_TYPE, APP_PACKAGE_NAME, APP_VERSION DEVICE_MODEL, DEVICE_OS, PUSH_OPT_IN, BACKGROUND_PUSH_ENABLED, LOCATION_ENABLED, LOCALE_LANGUAGE_CODE, LOCALE_COUNTRY_CODE, LOCATION_PERMISSION, IANA_TIMEZONE, GROUP_ID, PUSH_ID, REASON # Amplitude > Level up your behavioral cohort analysis with user-level mobile data. Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) (RTDS) delivers user-level information about push sends, conversions, and uninstall events. Adding Airship's unique information to Amplitude gives you a full view of what's going on in and around your app. By adding user-level mobile engagement data to your Amplitude data, you can leverage [Amplitude Behavioral Cohorts](https://amplitude.com/behavioral-cohorts) for targeting via Airship. You can also leverage Amplitude's behavioral cohorts in Airship as [Tags](https://www.airship.com/docs/reference/glossary/#tag). ## Amplitude Integration Requirements * **Accounts** 1. Amplitude — Enterprise Account 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for outbound integration only* * **Airship project** * The Airship SDK must use the same user identity as the Amplitude SDK. ## Inbound Integration The inbound integration applies Amplitude user information to Airship users as [Tags](https://www.airship.com/docs/reference/glossary/#tag). It works by syncing an Amplitude behavioral cohort with Airship. Airship then sets Tags on the applicable users. Once your data is in Airship, you can target users who do or do not have those Tags. The Tags appear in the `amplitude` [Tag Group](https://www.airship.com/docs/reference/glossary/#tag_group) and contain the name and ID of your synced Amplitude cohort in the format `[Amplitude] : `. For example: `[Amplitude] Has Sent Notification: y4isxl9`. See also [Identify users with similar behaviors](https://amplitude.com/docs/analytics/behavioral-cohorts) in Amplitude's documentation. ### Configuring the Inbound Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Amplitude**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create a [Tag Group](https://www.airship.com/docs/reference/glossary/#tag_group) and an authentication token. Amplitude uses the token to communicate with your project in Airship. * Set up an Airship audience cohort in Amplitude. From your new cohort in Amplitude, select **Sync**, then **Airship**. Airship will start setting Tags representing your Amplitude data on applicable members of your Airship audience. You can continue syncing on demand or set up recurring or real-time syncing. See [Sync to third-party destinations](https://help.amplitude.com/hc/en-us/articles/360060055531-Sync-to-third-party-destinations) in Amplitude's *Syncs and integrations* documentation. ### Targeting Users In the API, target using the `"audience"` object. Specify the `amplitude` Tag Group and the Tag in the format `[Amplitude] : `. **Targeting Amplitude Tags** ```json { "audience": { "group": "amplitude", "tag": "[Amplitude] Has Sent Notification: y4isxl9" } } ``` To target in the dashboard, create a [Segment](https://www.airship.com/docs/reference/glossary/#segment) and add a Tag as a condition. First select the `amplitude` Tag Group, then search for a Tag and complete configuring the Segment. For individual messages, you can create a single-use Segment while creating the message. You can also create reusable Segments instead of having to recreate your audience selections. For [In-App Automations](https://www.airship.com/docs/reference/glossary/#iaa) and [Scenes](https://www.airship.com/docs/reference/glossary/#scene), you cannot target [server-side](https://www.airship.com/docs/guides/audience/segmentation/segmentation/#client-server) Tags directly. Instead, create a Segment that includes the tags you added using this integration, then select that Segment in the Audience step in the composer. See [Segments](https://www.airship.com/docs/guides/audience/segmentation/target-specific-users/#segments) in *Targeting Specific Users*. For more information, see [Targeting users](https://www.airship.com/docs/guides/audience/tags/#targeting-users) in the *Tags* documentation. ## Outbound Integration The outbound integration sends your Airship events to Amplitude using [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds). For those events: 1. Airship sets the [Named User](https://www.airship.com/docs/reference/glossary/#named_user) associated with the event as the Amplitude user ID. 1. If Named User is not present, Airship sets the Android Advertising ID (AAID) or Apple Advertising ID (IDFA) associated with the event as the Amplitude device ID. 1. If neither the AAID nor IDFA is present, Airship sets the [Channel ID](https://www.airship.com/docs/reference/glossary/#channel_id) associated with the event as the Amplitude device ID. If your app is configured to exclude collecting the IDFA by the Airship SDK, it cannot be sent to Amplitude. 1. If Airship cannot set the Amplitude user ID or device ID, Airship will not send the event. ### Configuring the Outbound Integration You will need your Amplitude API key, found in your [Amplitude app settings](https://analytics.amplitude.com/settings). You will also need to know the region where you have implemented Amplitude so you can select a data center, either US or EU. If you are unsure which region to select, [contact Airship Support](https://support.airship.com). In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Amplitude**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Add your Amplitude API key. * Select a data center location. * Select the Airship events to send to Amplitude. After completing setup, Airship will begin sending events from your Airship project to your Amplitude instance. ### Setting Advertising IDs For Airship RTDS events without an associated [Named User](https://www.airship.com/docs/reference/glossary/#named_user), you can collect advertising IDs to be used as device IDs for events sent to Amplitude. See [Android](https://www.airship.com/docs/developer/sdk-integration/android/analytics/#associated-identifiers) and [iOS](https://www.airship.com/docs/developer/sdk-integration/apple/analytics/#associated-identifiers) custom identifiers documentation for more information. The following code examples demonstrate how to add the advertising ID on each supported platform. For iOS, associate the Apple `advertisingID` with the Airship [Channel ID](https://www.airship.com/docs/reference/glossary/#channel_id). If applicable, you can also associate Apple's `identifierForVendor` with the Channel ID. For more information, see [identifierForVendor](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) in Apple's *UIKit* documentation. #### iOS Swift ```swift // Get the current identifiers let identifiers = Airship.analytics.currentAssociatedDeviceIdentifiers() // Set the advertising ID info identifiers.advertisingID = ASIdentifierManager.sharedManager().advertisingIdentifier.UUIDString; identifiers.advertisingTrackingEnabled = ASIdentifierManager.sharedManager().advertisingTrackingEnabled; identifiers.vendorID = UIDevice.currentDevice().identifierForVendor?.UUIDString // Associate the identifiers Airship.analytics.associateDeviceIdentifiers(identifiers) ``` #### iOS Objective-C ```obj-c // Get the current identifiers UAAssociatedIdentifiers *identifiers = [UAirship.analytics currentAssociatedDeviceIdentifiers]; // Set the advertising ID info identifiers.advertisingID = [[ASIdentifierManager sharedManager].advertisingIdentifier] UUIDString]; identifiers.advertisingTrackingEnabled = [ASIdentifierManager sharedManager].advertisingTrackingEnabled; identifiers.vendorID = [[UIDevice currentDevice].identifierForVendor UUIDString]; // Associate the identifiers [UAirship.analytics associateDeviceIdentifiers:identifiers]; ``` For Android, associate the Android Advertising ID with the Airship Channel ID. **Automatically track the Android Advertising ID** ```java Airship.getAnalytics().setAutoTrackAdvertisingIdEnabled(true); ``` **Manually track the Android Advertising ID** ```java // Get the Android Advertising ID info - This call is blocking and should be done in a // background thread. AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(getContext()); Airship.getAnalytics() .editAssociatedIdentifiers() .setAdvertisingId(adInfo.getId(), adInfo.isLimitAdTrackingEnabled()) .apply(); ``` ### Tag Change Mapping For `tag_change` events in outbound integrations, Airship uses Amplitude's [Identify API](https://www.docs.developers.amplitude.com/analytics/apis/identify-api/) to apply Tags on your Amplitude audience. Tags in an `tag_change` event's `current` object appear as `user_properties` in an Amplitude `identifyEvent`. They appear in the format `Airship ": ["", ""]`. Compare the two in the following code samples. **An Airship `tag_change` event** ```json { "id": "00000169-4a14-67b2-1ddd-d9e733622c3a", "occurred": "2019-03-04T19:00:45.106Z", "offset": "1000001260057", "processed": "2019-03-04T19:00:47.094Z", "type": "SEND_REJECTED", "device": { "ios_channel": "1ef235f0-03d5-1384-893e-a19b5cd0d110", "channel": "1ef235f0-03d5-1384-893e-a19b5cd0d110", "device_type": "IOS", }, "body":{ "add": { "crm": [ "partner", "active" ], "loyalty": [ "silver_member" ] }, "remove": { "device": [ "shoe_buyer" ] }, "current": { "crm": [ "partner", "active", "new_user" ], "loyalty": [ "silver_member", "special_offers" ], "device": [ "san_francisco", "sports" ] } }, "type": "TAG_CHANGE" } ``` **Amplitude `user_properties`** ```json { "user_properties": { "ios_channel": "1ef235f0-03d5-1384-893e-a19b5cd0d110", "channel": "1ef235f0-03d5-1384-893e-a19b5cd0d110", "device_type": "IOS", "Airship crm": ["partner", "active", "new_user"], "Airship loyalty": ["silver_member", "special_offers"], "Airship device": ["san_francisco", "sports"] } } ``` # AppsFlyer > Empower marketers with a suite of comprehensive measurement and analytics solutions. [AppsFlyer](https://www.appsflyer.com/) is a popular mobile attribution platform. With the bi-directional integration between Airship and AppsFlyer, you can import attribution data from AppsFlyer to segment and personalize messages, as well as send events back to AppsFlyer via Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) (RTDS). Airship ingests *media source*, *campaign*, *campaign ID*, *attributed Ad ID*, or *attributed adgroup* AppsFlyer parameters as Airship attributes and then sends RTDS events back to AppsFlyer. This enables AppsFlyer to analyze Airship-driven message response. ## AppsFlyer Integration Requirements * **Accounts** 1. AppsFlyer 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for outbound integration only* * **Airship project** * The Airship SDK must use the same user identity as the AppsFlyer SDK. ## Configuring the Inbound Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **AppsFlyer**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Attributes](https://www.airship.com/docs/reference/glossary/#attributes) and an authentication token — AppsFlyer uses the token to communicate with your project in Airship * Add Airship as an integrated partner in AppsFlyer ## Configuring the Outbound Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **AppsFlyer**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Activate Airship RTDS as a partner in AppsFlyer * Select the Airship events to send to Appsflyer ## Android Example for Associating User IDs **Bi-directional integration with AppsFlyer** ```java import ... // AppsFlyer Imports import android.util.Log; import com.appsflyer.AppsFlyerLib; import com.appsflyer.AppsFlyerConversionListener; public class SampleApplication extends Application { private static final String AF_DEV_KEY = "YOUR_DEV_KEY_FROM_APP_SETTINGS"; @Override public void onCreate() { super.onCreate(); ... AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, this); AppsFlyerLib.getInstance().start(this); ... // Associating the channelID with AppsFlyerLib HashMap customData = new HashMap(); String channelId = Airship.getChannel().getId(); customData.put("android_channel", channelId); AppsFlyerLib.getInstance().setAdditionalData(customData); } } ``` ## Email Deep Linking with AppsFlyer You can use AppsFlyer OneLink to create deep links that direct a user from emails to your app or other content. OneLink handles deep links intelligently, so that your links open in your app when possible, but will resolve to a web browser if your users open links on a desktop computer or do not have your app installed. OneLink can be configured to work with Airship emails. Complete these requirements in any order: 1. **Configure a link tracking domain in Airship** — A working click tracking domain is a prerequisite for this integration. Please [contact Airship Support](https://support.airship.com) if you do not know your domain address or have not yet set one up. 1. **Host your Apple App Site Association (AASA) file** — On the same domain you have configured for click tracking you will need to host the AASA file that will be responsible for opening the app in a deep link scenario. For help with generating or configuring an AASA file contact AppsFlyer support. 1. **Configure the AppsFlyer SDK** (iOS V6.0.4 and Android V6.0.0 or later only) — You will need the AppsFlyer SDK in your application to handle deep links. See: [AppsFlyer getting started guide](https://dev.appsflyer.com/hc/docs/sdk-installation). # Azure Event Hubs > Send Airship user-level event data into Azure using our Event Hubs integration. By integrating with Microsoft Azure Event Hubs, you can store events from your airship project in Microsoft Azure. With Azure, you can store events for long term analysis and pass data to real-time analytics providers, making it easy to take advantage of your Airship engagement data in external business intelligence platforms. As a part of this integration, you must create an Event Hub to receive and store events from Airship. An Event Hub exists within a namespace belonging to a resource group. This setup assumes that you've already set up a resource group and a namespace to contain your Airship Real-Time Data Streaming Event Hub. If you have not already done so, [create your resource group and namespace before you begin](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-create). ## Azure Integration Requirements This integration requires these accounts: 1. Azure 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Creating an Airship Event Hub 1. Go to the Azure Portal and select **Event Hubs**. If **Event Hubs** is not in your Favorites menu, select **All Services** and locate it from there. 1. Select the namespace in which to create your Airship Event Hub. 1. Select **Event Hubs** in your namespace page. 1. Select ** Event Hub**. 1. Type a name for your Event Hub, then select **Create**. You can check the status of the Event Hub creation in alerts. When complete, your new Event Hub appears in the list. ## Getting Keys from your Shared Access Policy A shared-access policy contains the keys you'll provide to Airship to authenticate with your Event Hub. ![An Azure shared access policy](https://www.airship.com/docs/images/azure-keys.png) *An Azure shared access policy* 1. Go to the Azure Portal and select **Event Hubs**. If **Event Hubs** is not in your Favorites menu, select **All Services** and locate it from there. 1. In the list of Event Hubs, select the namespace containing your Airship Event Hub. 1. Select **Shared Access Policies**. 1. Select a policy from the list. The default policy is `RootManageSharedAccessPolicy`. If you add a new policy, it must have at least the `send` (write) permission. 1. Copy the policy name and primary key. These are the Shared Access Signature (SAS) Policy Name and Shared Access Signature (SAS) Primary Key Name that you will provide to Airship to authenticate with your Azure Event Hub. You can also copy the Connection string-primary key, which contains both the Shared Access Signature Primary Key and Policy Name. ## Configuring the Integration in Airship Before you configure your Azure integration, you must have configured a namespace and a specific Event Hub to store events from Airship. To configure your Microsoft Azure Event Hubs integration in Airship, you will need: * Event Hub namespace name * Event Hub name * Shared access signature (SAS) policy name — This is the *Policy Name* of a shared access policy in the namespace containing your Event Hub. * Shared access signature (SAS) primary key — This is the *Connection string-primary key* from a shared access policy in the namespace containing your Event Hub. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Microsoft Azure**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Enter your Event Hub information. * Select the Airship events to send to your Event Hub. # BigQuery > Send Airship event data to BigQuery for storage and analysis. BigQuery is a fully managed cloud-based data warehouse and analytics service for storing and analyzing data. This guide helps you integrate Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) event data into BigQuery using this process: 1. **Configure Data Export to Google Cloud Storage**: Use Airship's [Data Export](https://www.airship.com/docs/integrations/data-export/) integration to send RTDS event data as batched CSV files to a Google Cloud Storage (GCS) bucket. 1. **Create tables and load data**: Create BigQuery tables using the event schemas provided in this document, and then load the CSV files from GCS into BigQuery using Google's Data Transfer Service, BigQuery's `LOAD DATA` statements, or another data pipeline method. Airship provides event schemas for tables that correspond to each Airship event type. These schemas are included in this document to help you create the appropriate BigQuery tables and ensure your data loads correctly. This approach gives you flexibility in designing your data pipeline while maintaining full control over your data. While the Data Export integration operates hourly, you can choose how frequently to load data into BigQuery and implement the data transfer method that best fits your infrastructure and requirements. ## Requirements This integration requires the following: * A Google Cloud Platform account with BigQuery and Cloud Storage enabled * Airship account that includes messaging and [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Set up the data pipeline Follow the steps for the [Data Export integration](https://www.airship.com/docs/integrations/data-export/) to send your RTDS event data to a Google Cloud Storage bucket. Select GCS as your storage provider and configure the integration according to your needs. ## Create Airship tables in BigQuery Use the [provided schemas](#sample-airship-setup-script-and-event-schemas) to create the BigQuery dataset and tables for your Airship event data. The table definitions match the structure of the CSV files exported by the Data Export integration. ### File structure The Data Export integration organizes CSV files in your GCS bucket according to the file layout you select. See the [Data Export documentation](https://www.airship.com/docs/integrations/data-export/#structure-and-files) for details on Standard, Simplified, and Flattened layouts. For the DTS pipeline, we recommend the Simplified layout to avoid namespace collisions. Regardless of the layout you choose, files are generated hourly when events occur and include a header row. The file paths follow these patterns: * **Standard layout**: `[folder_path]/appKey/integrationId/eventType/YYYY_MM_DD/YYYY_MM_DD_HH_mm_ss.csv` * **Simplified layout**: `[folder_path]/appKey/integrationId/eventType/YYYY_MM_DD_HH_mm_ss.csv` * **Flattened layout**: `[folder_path]/appKey/integrationId/eventType_YYYY_MM_DD_HH_mm_ss.csv` **Example CSV** ```csv "id","offset","occurred","processed","app_key","channel","device_type","named_user","custom_identifiers","locale_variant","locale_country_code","locale_timezone","locale_language_code","iana_timezone","app_version","device_model","connection_type","ua_sdk_version","push_opt_in","device_os","carrier","location_enabled","location_permission","background_push_enabled","web_browser_name","web_browser_type","web_browser_version","web_user_agent_string","open_platform_name","alerting","campaigns","push_id","group_id","variant_id" "f5e05251-b128-11ec-8a12-0242eb00e5a9","1000042149690","2022-03-31 19:30:02.357 +00:00","2022-03-31 19:30:14.867 +00:00","ISex_TTJRuarzs9-o_Gkhg","b1ab9a9e-9634-4fb4-875a-9a02dcd68e66","ANDROID","","","","FR","7200","fr","Europe/Paris","2022-02-09T000134-goat","VOG-L29","CELL","16.3.0","true","10","F SFR","false","NOT_ALLOWED","true","","","","","","true","","f5d2bdc0-b128-11ec-bae4-024205acadbe","ac4058f7-981b-4f0e-b9c4-8b7af3a647da","" "f8fb4df1-b128-11ec-a0e3-0242e24c72c5","1000042149691","2022-03-31 19:30:07.567 +00:00","2022-03-31 19:30:16.760 +00:00","ISex_TTJRuarzs9-o_Gkhg","b1ab9a9e-9634-4fb4-875a-9a02dcd68e66","ANDROID","","","","FR","7200","fr","Europe/Paris","2022-02-09T000134-goat","VOG-L29","CELL","16.3.0","true","10","F SFR","false","NOT_ALLOWED","true","","","","","","true","","f6586880-b128-11ec-99dd-02423b3f5d45","879056c8-0b34-4c8c-8cdc-1df4f3d40b40","" "9aa98182-e854-4fa7-9c9f-ddea2082cc4c","1000042149694","2022-03-31 19:33:51.225 +00:00","2022-03-31 19:33:51.416 +00:00","ISex_TTJRuarzs9-o_Gkhg","62d92a24-0ced-40d1-ad1d-e1ea953189b7","SMS","","{""sender"":""17372004196""}","","","","","","","","","","","","","","","","","","","","","true","","75fdde30-b129-11ec-99dd-02423b3f5d45","0e2a3d4b-b4b4-4208-838f-08eb7333aa5e","" ``` ## Load data into BigQuery tables Once your tables are created and data is being exported to GCS, load the CSV files into your BigQuery tables. You can use any of the following methods: * **Google Data Transfer Service** — Automatically transfer data from GCS to BigQuery on a schedule * **BigQuery `LOAD DATA` statements** — Manually or programmatically load data using SQL * **Other data pipeline tools** — Use your preferred ETL tool or custom scripts The frequency and method of data loading is up to you and should align with your analytics requirements. ### Loading CSV files in BigQuery BigQuery automatically handles CSV files when loading data. You can specify CSV options in the LOAD DATA statement or when creating external tables. When loading CSV files, BigQuery will: - Skip the header row if you specify `skip_leading_rows = 1` - Automatically detect timestamp formats - Handle quoted fields - Treat empty strings as NULL values The example below shows how to load data using BigQuery's `LOAD DATA` statement: ```sql -- Load data from Cloud Storage into BigQuery LOAD DATA INTO `PROJECT_ID.AIRSHIP_EVENTS.TAG_CHANGE` FROM FILES ( uris = ['gs://your-bucket/ISex_TTJRuarzs9-o_Gkhg/gcs/19c15b67-1dd5-46b9-a25a-dfbd5d60ce58/TAG_CHANGE/2022_03_31/*.csv'], format = 'CSV', skip_leading_rows = 1 ); ``` ## Sample Airship setup script and event schemas Use the following SQL script to create your BigQuery dataset and tables for Airship event data: **SQL setup script** ```sql CREATE SCHEMA IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS`; -- Use PROJECT_ID.AIRSHIP_EVENTS CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.ATTRIBUTE_OPERATION` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `attribute_set` JSON OPTIONS(description="The attributes set on the device as an array of attribute objects."), `attribute_remove` JSON OPTIONS(description="The attributes removed from the device as an array of attribute objects.") ) OPTIONS( description="Attribute Operation events indicate a change in the device's attributes. Because attribute operations are related to a device, they will have a device field. If you set an attribute on a named user, Airship records events for each device associated with the named user." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.CLOSE` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded.") ) OPTIONS( description="Occurs when a user closes the app. Close events are often latent, as they aren't sent back to Airship until the user activates the app again." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.CONTROL` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.") ) OPTIONS( description="Occurs when a device is excluded from a push because it was arbitrarily selected as a member of a control group. Membership in a control group indicates what would've happened if you did not send a message to a user at all. This occurs for A/B Test-related pushes only." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.CUSTOM` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING OPTIONS(description="The unique, platform-agnostic channel identifier for a device. Can be null if the event was sent to a named user."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `name` STRING OPTIONS(description="The name of the event."), `properties` JSON OPTIONS(description="A JSON object containing the properties of the event."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `value` NUMERIC OPTIONS(description="Populated if the event is associated with a count or amount. Airship treats this field as a representation of money. The `value` field respects six digits of precision to the right of the decimal point."), `source` STRING OPTIONS(description="The source of the event either API or SDK."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `last_delivered_push_id` STRING OPTIONS(description="Identifies the last push notification the audience received before the event. Absent if the last push occurred more than 12 hours ago."), `last_delivered_group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `last_delivered_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `last_delivered_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `last_delivered_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Represents custom events that are either emitted from the Airship SDK or submitted through the Custom Events API. You can configure custom events yourself. There are also several CUSTOM-type events for email and SMS that are defined by Airship.In general, you can expect device information if the event source is `SDK` or if the event is one of the defined email or SMS events (as defined by `event_type`)." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.FEATURE_FLAG_INTERACTION` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `eligible` BOOL OPTIONS(description="Indicates whether or not the user was in the Feature Flag audience and had access to the feature. true means the user was in the Feature Flag audience and had access to the feature."), `flag_name` STRING OPTIONS(description="The name of a feature flag."), `flag_id` STRING OPTIONS(description="A UUID that is associated with a feature flag."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the Feature Flag interaction was created by the application logic, not Airship. If this field is present, the event body will not contain `push_id`, `group_id`, `variant_id`, or `triggering_push` fields."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `variant_id` STRING OPTIONS(description="The UUID of the A/B test variant, if available."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a user interacts with a tracked flagged feature. See Feature Flags. The events have a flag ID and flag name, which identify which flagged feature a user interacted with. They also have a boolean eligible field, which indicates whether or not the user was in the Feature Flag audience and had access to the feature." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.FIRST_OPEN` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser.") ) OPTIONS( description="This event occurs when a user opens an Airship-integrated app for the first time." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.FIRST_OPT_IN` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `delivery_address` STRING OPTIONS(description="The address of the device."), `open_platform_name` STRING OPTIONS(description="If device_type is set to OPEN, this field shows the full name of the platform.") ) OPTIONS( description="This event appears in the stream when a channel is first opted in. This event is specific to email (commercial), sms and open channels." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_BUTTON_TAP` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Button Tap was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields."), `button_id` STRING OPTIONS(description="A unique identifier for the button."), `context_reporting_context_content_types` JSON OPTIONS(description="The content types of the in-app automation."), `context_state_form_form_identifier` STRING OPTIONS(description="Is the form controller identifier."), `context_state_form_response_type` STRING OPTIONS(description="The form response type. Possible values: nps, user_feedback."), `context_state_form_submitted` BOOL OPTIONS(description="Whether the form has been submitted."), `context_state_form_type` STRING OPTIONS(description="The form type. Possible values: nps, form."), `context_state_pager_completed` BOOL OPTIONS(description="Whether the user reached the end of the pager."), `context_state_pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `context_state_pager_page_count` NUMERIC OPTIONS(description="The total number of pages."), `context_state_pager_page_identifier` STRING OPTIONS(description="The current page identifier."), `context_state_pager_page_index` NUMERIC OPTIONS(description="The current pager index."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `rendered_locale` STRING OPTIONS(description="Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `time_sent` TIMESTAMP OPTIONS(description="An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when an in-app button is tapped within a scene." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_EXPERIENCES` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Message was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields."), `event_name` STRING OPTIONS(description="Name of the experiences event. Possible values: scene_displayed, scene_completed, scene_incomplete, survey_displayed, survey_submitted, survey_not_submitted."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `survey_type` STRING OPTIONS(description="The survey type, only present for survey events. Possible values: nps, user_feedback."), `time_sent` TIMESTAMP OPTIONS(description="An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Events that occur related to the display and completion behavior of a scene." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_FORM_DISPLAY` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Form was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields."), `context_reporting_context_content_types` JSON OPTIONS(description="The content types of the in-app automation."), `context_state_form_form_identifier` STRING OPTIONS(description="Is the form controller identifier."), `context_state_form_response_type` STRING OPTIONS(description="The form response type. Possible values: nps, user_feedback."), `context_state_form_submitted` BOOL OPTIONS(description="Whether the form has been submitted."), `context_state_form_type` STRING OPTIONS(description="The form type. Possible values: nps, form."), `context_state_pager_completed` BOOL OPTIONS(description="Whether the user reached the end of the pager."), `context_state_pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `context_state_pager_page_count` NUMERIC OPTIONS(description="The total number of pages."), `context_state_pager_page_identifier` STRING OPTIONS(description="The current page identifier."), `context_state_pager_page_index` NUMERIC OPTIONS(description="The current pager index."), `forms` JSON OPTIONS(description="Information about the forms."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `time_sent` TIMESTAMP OPTIONS(description="An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `in_app_form_event_type` STRING OPTIONS(description="The In-App Form event type. The value is always DISPLAY.") ) OPTIONS( description="Occurs when an in-app form (currently specific to surveys) is displayed." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_FORM_RESULT` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Form was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields."), `context_reporting_context_content_types` JSON OPTIONS(description="The content types of the in-app automation."), `context_state_form_form_identifier` STRING OPTIONS(description="Is the form controller identifier."), `context_state_form_response_type` STRING OPTIONS(description="The form response type. Possible values: nps, user_feedback."), `context_state_form_submitted` BOOL OPTIONS(description="Whether the form has been submitted."), `context_state_form_type` STRING OPTIONS(description="The form type. Possible values: nps, form."), `context_state_pager_completed` BOOL OPTIONS(description="Whether the user reached the end of the pager."), `context_state_pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `context_state_pager_page_count` NUMERIC OPTIONS(description="The total number of pages."), `context_state_pager_page_identifier` STRING OPTIONS(description="The current page identifier."), `context_state_pager_page_index` NUMERIC OPTIONS(description="The current pager index."), `forms` JSON OPTIONS(description="Information about the forms."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `time_sent` TIMESTAMP OPTIONS(description="An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `in_app_form_event_type` STRING OPTIONS(description="The In-App Form event type. The value is always RESULT.") ) OPTIONS( description="Occurs when an in-app form (currently specific to surveys) is submitted." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_MESSAGE_DISPLAY` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Message was created by the application logic, not Airship. If this field is present, the event body will not contain `push_id`, `group_id`, `variant_id`, or `triggering_push` fields."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.") ) OPTIONS( description="Occurs when an in-app message is displayed to a user. Because the event pertains to a specific device, the device information object will be populated." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_MESSAGE_EXPIRATION` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Message was created by the application logic, not Airship. If this field is present, the event body will not contain `push_id`, `group_id`, `variant_id`, or `triggering_push` fields."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `replacing_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `replacing_push_group_id` STRING OPTIONS(description="The specific group_id associated with the new message."), `replacing_push_push_id` STRING OPTIONS(description="The specific push_id associated with the new message."), `replacing_push_variant_id` STRING OPTIONS(description="The specific variant_id associated with the new message."), `replacing_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `time_expired` TIMESTAMP OPTIONS(description="The date-time when the in-app message payload expires."), `time_sent` TIMESTAMP OPTIONS(description="The date-time when the in-app message payload was sent to the device."), `expiration_type` STRING OPTIONS(description="Indicates how the in-app message expired."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a new message has taken the place of another message, a message has passed its expiration, or because displaying the message in-app would be redundant. This event type may be latent; it is not emitted until the app becomes active." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_MESSAGE_RESOLUTION` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Message was created by the application logic, not Airship. If this field is present, the event body will not contain `push_id`, `group_id`, `variant_id`, or `triggering_push` fields."), `button_description` STRING OPTIONS(description="The title of the button the user interacted with. Present if `type` is set to `BUTTON_CLICK`."), `button_group` STRING OPTIONS(description="A category associated with the button. Present if `type` is set to `BUTTON_CLICK`."), `button_id` STRING OPTIONS(description="A unique identifier for the button. Present if `type` is set to `BUTTON_CLICK`."), `duration` STRING OPTIONS(description="The number of milliseconds that the user was on the screen."), `time_sent` TIMESTAMP OPTIONS(description="The date-time when the in-app message payload was sent to the device."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `resolution_type` STRING OPTIONS(description="Indicates how the In-App Message was resolved."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.") ) OPTIONS( description="Occurs when an In-App Message is cleared from the display, either by user action or timeout. Because this event pertains to an individual device, the device information object will be present." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_PAGER_COMPLETED` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields."), `context_reporting_context_content_types` JSON OPTIONS(description="The content types of the in-app automation."), `context_state_form_form_identifier` STRING OPTIONS(description="Is the form controller identifier."), `context_state_form_response_type` STRING OPTIONS(description="The form response type. Possible values: nps, user_feedback."), `context_state_form_submitted` BOOL OPTIONS(description="Whether the form has been submitted."), `context_state_form_type` STRING OPTIONS(description="The form type. Possible values: nps, form."), `context_state_pager_completed` BOOL OPTIONS(description="Whether the user reached the end of the pager."), `context_state_pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `context_state_pager_page_count` NUMERIC OPTIONS(description="The total number of pages."), `context_state_pager_page_identifier` STRING OPTIONS(description="The current page identifier."), `context_state_pager_page_index` NUMERIC OPTIONS(description="The current pager index."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `rendered_locale` STRING OPTIONS(description="Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to."), `page_count` NUMERIC OPTIONS(description="The total number of pages."), `page_identifier` STRING OPTIONS(description="The current page identifier."), `page_index` NUMERIC OPTIONS(description="The current pager index."), `pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `time_sent` TIMESTAMP OPTIONS(description="An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when the last page (screen) of a pager is viewed for the first time (currently specific to Scenes & Surveys)." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_PAGER_SUMMARY` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields."), `completed` BOOL OPTIONS(description="Whether the user has reached the end of the pager."), `context_reporting_context_content_types` JSON OPTIONS(description="The content types of the in-app automation."), `context_state_form_form_identifier` STRING OPTIONS(description="Is the form controller identifier."), `context_state_form_response_type` STRING OPTIONS(description="The form response type. Possible values: nps, user_feedback."), `context_state_form_submitted` BOOL OPTIONS(description="Whether the form has been submitted."), `context_state_form_type` STRING OPTIONS(description="The form type. Possible values: nps, form."), `context_state_pager_completed` BOOL OPTIONS(description="Whether the user reached the end of the pager."), `context_state_pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `context_state_pager_page_count` NUMERIC OPTIONS(description="The total number of pages."), `context_state_pager_page_identifier` STRING OPTIONS(description="The current page identifier."), `context_state_pager_page_index` NUMERIC OPTIONS(description="The current pager index."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `rendered_locale` STRING OPTIONS(description="Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to."), `page_count` NUMERIC OPTIONS(description="The total number of pages."), `page_identifier` STRING OPTIONS(description="The current page identifier."), `pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `time_sent` TIMESTAMP OPTIONS(description="An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `viewed_pages` JSON OPTIONS(description="Information about each viewed page.") ) OPTIONS( description="Describes the full path a user took within a pager (currently specific to Scenes), including the order of pages (screens) visited and time spent per page." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_PAGE_SWIPE` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields."), `context_reporting_context_content_types` JSON OPTIONS(description="The content types of the in-app automation."), `context_state_form_form_identifier` STRING OPTIONS(description="Is the form controller identifier."), `context_state_form_response_type` STRING OPTIONS(description="The form response type. Possible values: nps, user_feedback."), `context_state_form_submitted` BOOL OPTIONS(description="Whether the form has been submitted."), `context_state_form_type` STRING OPTIONS(description="The form type. Possible values: nps, form."), `context_state_pager_completed` BOOL OPTIONS(description="Whether the user reached the end of the pager."), `context_state_pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `context_state_pager_page_count` NUMERIC OPTIONS(description="The total number of pages."), `context_state_pager_page_identifier` STRING OPTIONS(description="The current page identifier."), `context_state_pager_page_index` NUMERIC OPTIONS(description="The current pager index."), `from_page_index` NUMERIC OPTIONS(description="The previous page index"), `from_page_identifier` STRING OPTIONS(description="The previous page identifier."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `rendered_locale` STRING OPTIONS(description="Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to."), `pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `time_sent` TIMESTAMP OPTIONS(description="An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device."), `to_page_identifier` STRING OPTIONS(description="The current page identifier"), `to_page_index` NUMERIC OPTIONS(description="The current page index"), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a user swipes to the next or previous page (screen) in a pager (currently specific to Scenes)." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.IN_APP_PAGE_VIEW` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `app_defined_id` STRING OPTIONS(description="An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields."), `completed` BOOL OPTIONS(description="Whether the user has reached the end of the pager."), `context_reporting_context_content_types` JSON OPTIONS(description="The content types of the in-app automation."), `context_state_form_form_identifier` STRING OPTIONS(description="Is the form controller identifier."), `context_state_form_response_type` STRING OPTIONS(description="The form response type. Possible values: nps, user_feedback."), `context_state_form_submitted` BOOL OPTIONS(description="Whether the form has been submitted."), `context_state_form_type` STRING OPTIONS(description="The form type. Possible values: nps, form."), `context_state_pager_completed` BOOL OPTIONS(description="Whether the user reached the end of the pager."), `context_state_pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `context_state_pager_page_count` NUMERIC OPTIONS(description="The total number of pages."), `context_state_pager_page_identifier` STRING OPTIONS(description="The current page identifier."), `context_state_pager_page_index` NUMERIC OPTIONS(description="The current pager index."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `rendered_locale` STRING OPTIONS(description="Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to."), `page_count` NUMERIC OPTIONS(description="The total number of pages."), `page_identifier` STRING OPTIONS(description="The current page identifier."), `page_index` NUMERIC OPTIONS(description="The current pager index."), `pager_identifier` STRING OPTIONS(description="The pager controller identifier."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `time_sent` TIMESTAMP OPTIONS(description="An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `viewed_count` NUMERIC OPTIONS(description="The number of times the current page has been viewed.") ) OPTIONS( description="Occurs when a page (screen) is displayed within a pager (currently specific to Scenes & Surveys)." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.MOBILE_ORIGINATED` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `delivery_address` STRING OPTIONS(description="The address of the device."), `msisdn` STRING OPTIONS(description="The mobile number of the device."), `sender` STRING OPTIONS(description="The email address or number of the sender."), `keyword` STRING OPTIONS(description="The specific keyword used in the inbound message, if recognized; the keyword in the inbound_message determines the outbound_message sent to the device. If a keyword could not be matched in the inbound_message, this field is absent."), `inbound_message` STRING OPTIONS(description="The contents of the message received from an SMS device."), `outbound_message` STRING OPTIONS(description="The response sent to the SMS device, based on the inbound message and keyword.") ) OPTIONS( description="Represents a message action that originated from a user — like an inbound SMS or email." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.OPEN` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `last_delivered_push_id` STRING OPTIONS(description="Identifies the last push notification the audience received before the event. Absent if the last push occurred more than 12 hours ago."), `last_delivered_group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `last_delivered_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `last_delivered_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `last_delivered_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a user opens your app." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.PUSH_BODY` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `trimmed` BOOL OPTIONS(description="If true, the push payload was trimmed from the event body."), `resource` STRING OPTIONS(description="Describes the type of push, helping you interpret the JSON response. Possible values: PIPELINES, SCHEDULES, PUSH, EXPERIMENTS, IN_APP_AUTOMATION"), `payload` STRING OPTIONS(description="The specification of the push as sent via the API, a Base64 encoded JSON value.") ) OPTIONS( description="Occurs when you initiate a push, automation, or sequence.Airship fulfills delivery over a time interval with a number of child pushes, each with a unique Push ID and a common Group ID. There is no guarantee that push body events (defined in Push Body Event) for the child pushes fulfilling a group will appear in the stream.**Note:** When you start, pause, or publish a sequence, Airship emits a `push_body` event for the sequence itself, and each message contained within the sequence (i.e. messages +1). After you start a sequence, Airship does not issue subsequent `push_body` events for the sequence unless you pause or publish changes to the sequence." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.REGION` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `action` STRING OPTIONS(description="Indicates whether the event was the result of a user entering or exiting the region."), `name` STRING OPTIONS(description="A friendly name for the region; may be retrieved from a third-party location provider. "), `region_id` STRING OPTIONS(description="A unique identifier for the region in Airship, UUID format."), `source_info_source` STRING OPTIONS(description="Information about the source application that generated the event."), `source_info_region_id` STRING OPTIONS(description="The unique region identifier from the originating system or location provider.") ) OPTIONS( description="Region Events are emitted when a device enters or exits a geofence or the range of any of a set of bluetooth beacons. Region events require a Gimbal integration. Events for Gimbal customers include the Gimbal application instance identifer as `com.urbanairship.gimbal.aii` within the `identifiers` object." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.RICH_CONTROL` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a Message Center message is not delivered to a user because they are in a control group for a Sequence A/B test or Holdout Experiment." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.RICH_DELETE` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a user deletes a rich message from their inbox." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.RICH_DELIVERY` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a rich message is delivered to a user's inbox. Even though rich push deliveries may or may not cause an alert on the user’s lock screen, they are always associated with a push identifier in the Airship system." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.RICH_READ` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a user reads a rich message in their inbox." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.SCREEN_VIEWED` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded."), `duration` STRING OPTIONS(description="The number of milliseconds that the user was on the screen."), `viewed_screen` STRING OPTIONS(description="The name assigned to the screen that the user left."), `previous_screen` STRING OPTIONS(description="The name assigned to the screen the user was on prior to the viewed screen.") ) OPTIONS( description="Occurs when a user has finished viewing a screen. It is up to you to instrument your application with names for each screen. Doing so will allow you to deterimine the user’s path by filtering on the fields in the table below." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.SEND` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `open_platform_name` STRING OPTIONS(description="If device_type is set to OPEN, this field shows the full name of the platform."), `alerting` BOOL OPTIONS(description="If true, the send event was alerting. Alerting send event has notification text, badge, or sound."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `context_triggered_by` STRING OPTIONS(description="The triggering event type."), `context_event_uuid` STRING OPTIONS(description="The ID of the custom event which triggered the send."), `context_interaction_id` STRING OPTIONS(description="If interaction_id was set on the custom event body, it will be populated here."), `context_transaction` STRING OPTIONS(description="If transaction was set on the custom event body, it will be populated here.") ) OPTIONS( description="Occurs whenever a push notification is sent to a device identified in the audience selector of a message." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.SEND_ABORTED` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `reason` STRING OPTIONS(description="Describes the reason this push was aborted.") ) OPTIONS( description="Occurs when a push is dropped from our system before delivery is attempted. This can happen if you are using External Data Feeds to personalize a message and an error was encountered or the feed returned a non-successful response, or when reaching a Message Limit. Device information for the device that did not receive the push is included with `SEND_ABORTED` events." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.SEND_REJECTED` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.") ) OPTIONS( description="Occurs when a push fails during communication with a third party, like APNs or GCM. This typically indicates that the user has uninstalled the app or otherwise invalidated the last-registered credentials stored in Airship. The event contains the rejected push and the group, variant, or campaigns the push belonged to.Device information for the device that did not receive the push is included with `SEND_REJECTED` events." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.SHORT_LINK_CLICK` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `original_url` STRING OPTIONS(description="The URL that was clicked."), `delivery_address` STRING OPTIONS(description="The address of the device."), `sender` STRING OPTIONS(description="The email address or number of the sender.") ) OPTIONS( description="Occurs when a user taps or 'clicks' an Airship-shortened link in an SMS or MMS message." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.SUBSCRIPTION` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `delivery_address` STRING OPTIONS(description="The address of the device."), `subscription_event_type` STRING OPTIONS(description="Determines the source of the subscription event. registration and create_and_s if not existsend events result in changes to opted_in dates; all other event types contain opted_out dates."), `subscription_identifiers_address` STRING OPTIONS(description="The email address representing the change."), `commercial_opted_in` TIMESTAMP OPTIONS(description="The date and time when the address opted into commercial email messages."), `transactional_opted_in` TIMESTAMP OPTIONS(description="The date and time when the address opted into transactional email messages.") ) OPTIONS( description="Reflect changes to users' subscription preferences — reflected in opt_in and opt_out values. These events help you track a user''s subscription status in the system and the total number of subscribers." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.TAG_CHANGE` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `tags_add` JSON OPTIONS(description="Tag group/tag pairs added to the device. Each tag group is an array containing one or more tags within this object."), `tags_current` JSON OPTIONS(description="The total set/state of tag group/tag pairs associated with the device after the tag change. Each tag group is an array containing one or more tags within this object."), `tags_remove` JSON OPTIONS(description="Tag group/tag pairs removed from the device. Each tag group is an array containing one or more tags within this object.") ) OPTIONS( description="Occurs when tags change for a device." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.UNINSTALL` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `custom_identifiers` JSON OPTIONS(description="The custom identifiers associated with the app channel, stored as an object."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `app_version` STRING OPTIONS(description="The version of the app installed on the device."), `device_model` STRING OPTIONS(description="The model of the device."), `connection_type` STRING OPTIONS(description="The internet connection type used by the device."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `device_os` STRING OPTIONS(description="The operating system of the device."), `carrier` STRING OPTIONS(description="The wireless carrier used by the device."), `location_enabled` BOOL OPTIONS(description="Whether the device has location services enabled."), `location_permission` STRING OPTIONS(description="Location permission level as configured in device settings."), `background_push_enabled` BOOL OPTIONS(description="Whether the device has background push notifications enabled."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `decay` BOOL OPTIONS(description="If true, Airship recorded an uninstall event due to user inactivity.") ) OPTIONS( description="Occurs when a user uninstalls an Airship-integrated app in response to a push." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.WEB_CLICK` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `push_id` STRING OPTIONS(description="A unique identifier for a push operation."), `group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).") ) OPTIONS( description="Occurs when a user interacts with a web notification, e.g., clicked or tapped it. Web Click events have a device attribute on the event indicating the channel that was the target of the notification. The body of a Web Click Event is an Associated Push object." ); CREATE TABLE IF NOT EXISTS `PROJECT_ID.AIRSHIP_EVENTS.WEB_SESSION` ( `id` STRING NOT NULL OPTIONS(description="The event ID"), `offset` STRING OPTIONS(description="The offset of the event that represents the location of the event in the stream."), `occurred` TIMESTAMP OPTIONS(description="The time the event occurred."), `processed` TIMESTAMP OPTIONS(description="The time the event was processed."), `app_key` STRING OPTIONS(description="The identifier for the Airship project."), `channel` STRING NOT NULL OPTIONS(description="The unique, platform-agnostic channel identifier for a device."), `device_type` STRING OPTIONS(description="The platform of the channel"), `named_user` STRING OPTIONS(description="The named user identifier associated with the channel."), `locale_variant` STRING OPTIONS(description="The language variant as reported by the device."), `locale_country_code` STRING OPTIONS(description="The ISO 3166-1 country code as defined in device settings."), `locale_timezone` STRING OPTIONS(description="The timezone as reported by the device offset in seconds from UTC."), `locale_language_code` STRING OPTIONS(description="The ISO 639-1 two-letter language code as defined in device settings."), `iana_timezone` STRING OPTIONS(description="The IANA timezone of the device."), `push_opt_in` BOOL OPTIONS(description="Whether the user has opted in to push notifications."), `ua_sdk_version` STRING OPTIONS(description="The version of the Airship SDK used to record the event."), `web_browser_name` STRING OPTIONS(description="The name of the browser running the SDK."), `web_browser_type` STRING OPTIONS(description="Indicates whether the browser was running on a desktop or mobile device."), `web_browser_version` STRING OPTIONS(description="The version of the browser running the SDK."), `web_user_agent_string` STRING OPTIONS(description="The user agent string reported by the browser."), `last_delivered_push_id` STRING OPTIONS(description="Identifies the last push notification the audience received before the event. Absent if the last push occurred more than 12 hours ago."), `last_delivered_group_id` STRING OPTIONS(description="Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification."), `last_delivered_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `last_delivered_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `last_delivered_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `triggering_push_push_id` STRING OPTIONS(description="The push ID of the push that triggered the custom event."), `triggering_push_group_id` STRING OPTIONS(description="The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s"), `triggering_push_campaigns` JSON OPTIONS(description="An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit."), `triggering_push_time` TIMESTAMP OPTIONS(description="The UTC time when the push occurred."), `triggering_push_variant_id` STRING OPTIONS(description="The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment)."), `session_id` STRING OPTIONS(description="Represents the 'session' of user activity. Absent if the application was initialized while backgrounded.") ) OPTIONS( description="Occurs when an opted in user begins interacting with a website. Web Session events have a device attribute, indicating the channel associated with the user." ); -- List tables using: SELECT table_name FROM `PROJECT_ID.AIRSHIP_EVENTS.INFORMATION_SCHEMA.TABLES` ``` ## Schema and file changes Airship may occasionally add additional columns to the exported CSV files. Column order will remain the same and any new columns will be appended. When creating your data pipelines we recommend ignoring additional columns to prevent any additions from breaking your data loads. If you encounter data load errors, you can recover from your staged files to ensure that no Airship event data is lost. Changes will be noted in a changelog along with example migrations. # Bluedot > Enhance mobile experiences with Bluedot's precise and scalable geofencing solutions. Bluedot is a SaaS provider of location management tools. To set up a mobile application that makes use of Bluedot location services and Airship push notifications. ## Bluedot Integration Requirements * **Accounts** 1. Bluedot 1. Airship — Must include messaging * **Airship project** * The Airship SDK must use the same user identity as the Bluedot SDK. ## Configuring the Bluedot Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Bluedot**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to create the [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) `bluedot_place_entered` and `bluedot_place_exited`. For information about using this integration, see [Bluedot documentation](https://docs.bluedot.io/integrations/airship-integration/). # Branch > Use Branch deep links and attribution data in Airship. Branch is a mobile measurement and deep linking platform that helps you create seamless experiences and engage users in your app. By making small changes to your Airship implementation, you can use Branch deep links in your Airship mobile messages and emails. You can also use Branch's attribution events to understand your users in Airship. Use this data to automatically message users at critical points in your audience's lifecycle to increase conversions and customer satisfaction. ## Mobile Deep Linking with Branch Deep linking makes your app more responsive and capable of navigating to arbitrary content in response to push notifications or other interactions, much in the same way that URLs can link you to specific pages on the Web. If you have added Branch deep links to your app, you can use those with Airship by making a small change to your Airship SDK implementation. The following examples demonstrate how to hand off deep links from Airship to the Branch SDK. ### Using the iOS Deep Link Handler With the Airship iOS SDK, set the `onDeepLink` closure on `Airship` to handle deep links. This will be called when a deep link has been triggered from Airship with a provided URL. Hand off the URL to the Branch SDK: ```swift Airship.onDeepLink = { url in if Branch.getInstance()?.handleDeepLink(withNewSession: url) == true { return } ... } ``` ### Using the Android Deep Link Listener With the Airship Android SDK, you can customize how deep links are handled by setting a `DeepLinkListener` on the `Airship` instance. This will be called when a deep link has been triggered from Airship. If your app is using deep links through Android implicit intents, you will then launch your appropriate Branch activity. ```kotlin Airship.deepLinkListener = DeepLinkListener { deepLink -> /* Handle the deepLink https://help.branch.io/developers-hub/docs/android-advanced-features#section-handle-links-in-your-own-app */ val intent = Intent(context, YourActivity::class.java) intent.putExtra("branch", deepLink) intent.putExtra("branch_force_new_session", true) startActivity(intent) true } ``` ## Email Deep Linking with Branch You can use Branch to support deep links from emails to your app or other content. Branch handles deep links intelligently, so that your links open in your app when possible, but will resolve to a web browser if your users open links on a desktop computer or do not have your app installed. > **Note:** A working [click tracking domain](https://help.branch.io/using-branch/docs/universal-email-integration-guide#3-provide-click-tracking-domain) is a prerequisite for this integration. Please [contact Airship support](https://support.airship.com) if you do not know your domain address or have not yet set one up. When you enable deep link support through Branch, Branch wraps links in your emails inside a tracking URL. The Branch SDK resolves this URL and determines whether or not a client has your app, directing users to the appropriate content in the app or their web browser. ### Configuring Deep Links In the Branch dashboard: 1. Go to **Email**, then **Manager**, then **Airship**. 1. Follow the [Universal Email Integration Guide](https://help.branch.io/using-branch/docs/universal-email-integration-guide), then continue on to configure Airship. 1. Enter your click tracking domain. 1. Enter your Airship domain depending on your region: * US: `https://spgo.io` * EUCS: `https://eu.spgo.io` ![Configuring Branch deep link domains](https://www.airship.com/docs/images/branch-deep-link-setup_hu_ee3b9591a7918912.webp) *Configuring Branch deep link domains* 1. Select **Save**. ### Configuring DNS Records Point your DNS CNAME to Branch's `thirdparty.bnc.lt` domain. See this [Branch email integration help article](https://help.branch.io/using-branch/docs/universal-email-integration-guide#4-point-dns-cname-to-branch) for details. > **Note:** You must have a CNAME entry for your tracking domain that points to a specific Branch URL, e.g.: `branch-tracking-airship.com`. Branch will verify DNS records and confirm the configuration was successful. ## Branch Attribution Data in Airship Branch's *People-Based Attribution* events connect individual users' actions across platforms, helping you better understand your users and their cross-platform behaviors. This integration gives you the power to set up [Automation](https://www.airship.com/docs/reference/glossary/#automation) rules and [Sequences](https://www.airship.com/docs/reference/glossary/#sequence) based on attribution events from Branch. ```mermaid sequenceDiagram participant A as Audience participant B as Branch participant C as Airship B->>A: Identify user by Airship channel_id A->>B: User performs attribution event B->>C: Forward attribution event as custom event C->>A: Message to channel_id in response to custom event ``` ### Branch Attribution Data Integration Requirements * **Accounts** 1. Branch 1. Airship — Must include messaging * **Airship project** * The Airship SDK must use the same user identity as the Branch SDK. --- Events from Branch are associated with `channel_id` values in Airship. Before you can take advantage of this integration, you must update your Branch implementation to get the Airship `channel_id` and set it as a request's metadata in Branch before sending events. This makes sure that events tracked by Branch are associated with appropriate users in Airship. For more information, see: * [Set Request Metadata in Branch](https://help.branch.io/developer-hub/docs/airship-configuration?highlight=airship#3-pass-metadata-to-the-branch-sdk) * [Airship for Android: get a channel_id](https://www.airship.com/docs/reference/libraries/android-kotlin/latest/urbanairship-core/com.urbanairship.channel/-airship-channel-listener/index.html) * [Airship for iOS: get a channel_id](https://urbanairship.github.io/ios-library/v20/AirshipCore/documentation/airshipcore/airshipnotifications/channelcreated) ### Configuring the Branch Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Branch**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) and an authentication token. Branch uses the token to communicate with your project in Airship. * Configure the Airship data integration in Branch. ### Taking Advantage of Custom Events You can set up [Automation](https://www.airship.com/docs/reference/glossary/#automation) rules or [Sequences](https://www.airship.com/docs/reference/glossary/#sequence) to send your audience messages when Airship receives custom events — or specific values in custom events — from Branch. You can even reference event properties in an automation or sequence using [Handlebars](https://www.airship.com/docs/reference/glossary/#handlebars). Using event properties to personalize or modify your message for each member of your audience can help increase the relevance of your message and the likelihood that your audience will engage. For example, to personalize a message using the custom `purchase` event from Branch below, you would probably set up your message to iterate over certain products in the `contentItems` array, and provide total purchase information from the `items` object. **Example message:** ```text Thank you for your purchase! {{#each contentItems}} {{$quantity}} x {{$product_brand}} {{$product_name}} = {{$price}}{{$currency}} {{/each}} ``` **Example Branch purchase event:** ```json { "id": "aae70da5-a276-4dd4-a11e-f5b5796a52f1", "offset": "1000000000780", "occurred": "2026-02-18T22:37:53.000Z", "processed": "2026-02-18T22:40:35.337Z", "device": { "ios_channel": "c014a2ed-4c30-4f6d-a9b3-e2ba7a01b45c", "channel": "c014a2ed-4c30-4f6d-a9b3-e2ba7a01b45c", "device_type": "IOS", "attributes": { "locale_variant": "", "app_version": "1.0", "device_model": "x86_64", "app_package_name": "com.urbanairship.partner.branch", "iana_timezone": "America/Los_Angeles", "push_opt_in": "false", "locale_country_code": "US", "device_os": "13.0", "locale_timezone": "-25200", "locale_language_code": "en", "location_enabled": "false", "background_push_enabled": "false", "ua_sdk_version": "20.3.0", "location_permission": "UNPROMPTED" } }, "body": { "name": "purchase", "value": 1.5, "session_id": "c014a2ed-4c30-4f6d-a9b3-e2ba7a01b45c", "source": "API", "properties": { "device_id": "BB127028-A87C-431B-BF62-32CCF7EB94C9", "contentItems": [ { "$content_schema": "COMMERCE_PRODUCT", "$publicly_indexable": false, "$locally_indexable": false, "$exp_date": 0, "$canonical_identifier": "item/12345", "$og_title": "My Item Title", "$canonical_url": "https://branch.io/item/12345", "$og_description": "", "$og_image_url": "", "$price": 23.2, "$quantity": 1, "$sku": "1994320302", "$product_name": "my_product_name1", "$product_brand": "my_prod_Brand1", "$product_category": "APPAREL_AND_ACCESSORIES", "$product_variant": "XL", "$rating": 0, "$rating_average": 0, "$rating_count": 0, "$rating_max": 0, "$address_street": "", "$address_city": "", "$address_region": "", "$address_country": "", "$address_postal_code": "", "$latitude": 0, "$longitude": 0, "$creation_timestamp": 0, "$currency": "USD" } ], "items": { "transaction_id": "12344555", "currency": "USD", "revenue": 1.5, "revenue_in_usd": 1.5, "exchange_rate": 1, "shipping": 10.2, "tax": 12.3, "coupon": "test_coupon", "affiliation": "test_affiliation", "search_query": "item 123", "description": "Event_description" }, "transaction": "782362138270294161" } }, "type": "CUSTOM" } ``` # Customer.io > Add mobile event data to your customer profiles. [Customer.io](https://customer.io/) is a behavioral email platform that harnesses user activity and profile data to send targeted campaigns at scale. With the Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) and Customer.io integration, incorporate mobile engagement data into your Customer.io profiles and run email campaigns based on Airship events. ## Customer.io Integration Requirements This integration requires these accounts: 1. Customer.io 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Configuring the Customer.io Integration You will need your **Customer.io Site ID** and **API key**, found in your [Customer.io dashboard Integration settings](https://fly.customer.io/). In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Customer.io**. 1. Follow the onscreen instructions to configure the integration. Once you've configured the integration, we'll start sending events from this project to your Customer.io instance, and they will appear in your user activity stream. The following example from the Customer.io dashboard shows an expanded custom event and open event. ![Sample Customer.io event data in Airship](https://www.airship.com/docs/images/connect-customer.io-sample-data_hu_71514492b07fc6e6.webp) *Sample Customer.io event data in Airship* # Data Export > Send structured Airship event data to your own cloud storage. Using [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds), Airship event data is uploaded in batched CSV files to a cloud storage provider: [Amazon S3](https://aws.amazon.com/s3/), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs/), or [Google Cloud Storage](https://cloud.google.com/storage/) (GCS). ## Data Export integration requirements This integration requires these accounts: 1. Your own cloud storage with Amazon S3, Google Cloud Storage, or Azure Blob Storage 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Configuring a cloud storage provider Before setting up this integration, you must create an Amazon S3 bucket, Google Cloud Storage bucket, or Microsoft Azure container. Also, you must set credentials the integration will use to upload data to the storage location: * **Amazon S3** — Configure an IAM user and retrieve the account access keys. Follow [Amazon's documentation: Managing access keys](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey). * **Azure** — Configure an Azure connection string. Follow [Azure's documentation: Configure Azure Storage connection strings](https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string). * **Google Cloud Storage** — Create a JSON-formatted service account key with role Storage Object Creation. Follow [Create and delete service account keys](https://cloud.google.com/iam/docs/keys-create-delete) in Google's IAM documentation. ## Configuring the Data Export integration You will need the following information about your cloud storage: * **Amazon S3** — Access key ID, secret access key, and bucket name, and AWS Region * **Azure** — Connection string and container name * **Google Cloud Storage** — Bucket name and JSON-formatted service account key In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Data Export**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Select your storage provider and enter your credentials. For Amazon S3, you must also select your region. * Select a [file layout](#structure-and-files): Standard, Simplified, or Flattened. * Select the Airship events to send to your storage location. * Options: * Specify a folder path to prepend to the file storage path. * Compress your data to save on storage space. * (For Amazon S3) Enable encrypting your data using [server-side encryption](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html). After completing configuration, it may take several minutes to begin populating events. ## Structure and files You can select one of three file layouts for your Data Export integration: * **Standard** — The default layout, with date folders. > [folder_path]/appKey/integrationId/eventType/YYYY_MM_DD/YYYY_MM_DD_HH_mm_ss.csv * **Simplified** — Date components are included in the file names. > [folder_path]/appKey/integrationId/eventType/YYYY_MM_DD_HH_mm_ss.csv * **Flattened** — All components are included in the file names. > [folder_path]/appKey/integrationId/eventType_YYYY_MM_DD_HH_mm_ss.csv For all layouts, there will be one file generated per hour, assuming a relevant event occurred within that hour. Each CSV file will also contain a header row. ### Example CSVs The following are examples of CVSs exported by Airship. **Send example** ```csv "id","offset","occurred","processed","app_key","channel","device_type","named_user","custom_identifiers","locale_variant","locale_country_code","locale_timezone","locale_language_code","iana_timezone","app_version","device_model","ua_sdk_version","push_opt_in","device_os","location_enabled","location_permission","background_push_enabled","web_browser_name","web_browser_type","web_browser_version","web_user_agent_string","open_platform_name","alerting","campaigns","push_id","group_id","variant_id" "00000198-ba5e-5bf0-c014-662065e32f58","1000085767854","2025-08-17 23:30:02.864 +00:00","2025-08-17 23:30:02.907 +00:00","ISex_TTJRuarzs9-o_Gkhg","","","","","","","","","","","","","","","","","","","","","","","","","","{""categories"":[""Airware-Survey""]}","","7aad0ec7-2b18-494f-ba9c-d82defa7b43c","" "00000198-ba6b-22c6-4950-0827892bac22","1000085767855","2025-08-17 23:44:00.198 +00:00","2025-08-17 23:44:00.253 +00:00","ISex_TTJRuarzs9-o_Gkhg","","","","","","","","","","","","","","","","","","","","","","","","","","","","9f27ad9a-31f1-4a57-b844-07dcc3f98f94","" "00000198-ba79-f92c-6551-79a344ce1896","1000085767856","2025-08-18 00:00:12.588 +00:00","2025-08-18 00:00:12.661 +00:00","ISex_TTJRuarzs9-o_Gkhg","","","","","","","","","","","","","","","","","","","","","","","","","","","","c1f450bf-7b5d-4a2e-b246-b83ab5fb25be","" ``` **Uninstall example** ```csv "id","offset","occurred","processed","app_key","channel","device_type","named_user","custom_identifiers","locale_variant","locale_country_code","locale_timezone","locale_language_code","iana_timezone","app_version","device_model","ua_sdk_version","push_opt_in","device_os","location_enabled","location_permission","background_push_enabled","web_browser_name","web_browser_type","web_browser_version","web_user_agent_string","open_platform_name","alerting","campaigns","push_id","group_id","variant_id" "00000198-ba5e-5bf0-c014-662065e32f58","1000085767854","2025-08-17 23:30:02.864 +00:00","2025-08-17 23:30:02.907 +00:00","ISex_TTJRuarzs9-o_Gkhg","","","","","","","","","","","","","","","","","","","","","","","","","","{""categories"":[""Airware-Survey""]}","","7aad0ec7-2b18-494f-ba9c-d82defa7b43c","" "00000198-ba6b-22c6-4950-0827892bac22","1000085767855","2025-08-17 23:44:00.198 +00:00","2025-08-17 23:44:00.253 +00:00","ISex_TTJRuarzs9-o_Gkhg","","","","","","","","","","","","","","","","","","","","","","","","","","","","9f27ad9a-31f1-4a57-b844-07dcc3f98f94","" "00000198-ba79-f92c-6551-79a344ce1896","1000085767856","2025-08-18 00:00:12.588 +00:00","2025-08-18 00:00:12.661 +00:00","ISex_TTJRuarzs9-o_Gkhg","","","","","","","","","","","","","","","","","","","","","","","","","","","","c1f450bf-7b5d-4a2e-b246-b83ab5fb25be","" ``` **Push Body example** ```csv "id","offset","occurred","processed","app_key","campaigns","group_id","payload","resource","trimmed" "00000198-ba5e-5bf0-c014-662065e32f58","1000085767854","2025-08-17 23:30:02.864 +00:00","2025-08-17 23:30:02.907 +00:00","ISex_TTJRuarzs9-o_Gkhg","{""categories"":[""Airware-Survey""]}","7aad0ec7-2b18-494f-ba9c-d82defa7b43c","eyJzY2hlZHVsZSI6eyJzY2hlZHVsZWRfdGltZSI6IjIwMjQtMTAtMTdUMDc6MzA6MDAiLCJyZWN1cnJpbmciOnsiY2FkZW5jZSI6eyJ0eXBlIjoiaG91cmx5IiwiY291bnQiOjF9LCJ0YXJnZXRfdGltZXpvbmUiOiJFdXJvcGUvTG9uZG9uIiwicGF1c2VkIjpmYWxzZX19LCJwdXNoIjp7ImF1ZGllbmNlIjp7ImFuZCI6W3siYW5kIjpbeyJ0YWciOiJkdW5jYW51bmlxdWUiLCJncm91cCI6ImRldmljZSJ9XX0seyJhbmQiOlt7ImFjdGl2aXR5IjoibWVzc2FnZV9yZWNlaXZlZCIsIm1ldHJpYyI6ImNvdW50Iiwib3BlcmF0b3IiOiJlcXVhbHMiLCJ2YWx1ZSI6IjAiLCJhZnRlciI6IjEiLCJwcmVjaXNpb24iOiJkYXlzIiwid2hlcmUiOnsiYW5kIjpbeyJwcm9wZXJ0eSI6IiQuX21zZy5jYW1wYWlnbnMuY2F0ZWdvcmllc1sqXSIsIm9wZXJhdG9yIjoiZXF1YWxzIiwidmFsdWUiOiJBaXJ3YXJlLVN1cnZleSIsImNvbXBhcmVfYXMiOiJ0ZXh0In1dfX1dfV19LCJkZXZpY2VfdHlwZXMiOlsiaW9zIiwiYW5kcm9pZCIsImFtYXpvbiJdLCJub3RpZmljYXRpb24iOnsiaW9zIjp7ImFsZXJ0IjoiSSBzaG91bGQgb25seSByZWNlaXZlIG9uZSBvZiB0aGVzZSBtZXNzYWdlcyJ9LCJhbmRyb2lkIjp7ImFsZXJ0IjoiSSBzaG91bGQgb25seSByZWNlaXZlIG9uZSBvZiB0aGVzZSBtZXNzYWdlcyJ9LCJhbWF6b24iOnsiYWxlcnQiOiJJIHNob3VsZCBvbmx5IHJlY2VpdmUgb25lIG9mIHRoZXNlIG1lc3NhZ2VzIn19LCJvcHRpb25zIjp7Il9fdWlfaWQiOiI5V3REcGg3R1NnU0xpQlkxd053UVJnIiwibWVzc2FnZV9uYW1lIjoicmVjdXJyaW5nIHRlc3QifSwiY2FtcGFpZ25zIjp7ImNhdGVnb3JpZXMiOlsiQWlyd2FyZS1TdXJ2ZXkiXX0sIm1lc3NhZ2VfdHlwZSI6ImNvbW1lcmNpYWwifSwiZ3JvdXBfaWQiOiI3YWFkMGVjNy0yYjE4LTQ5NGYtYmE5Yy1kODJkZWZhN2I0M2MifQ==","SCHEDULES","false" "00000198-ba6b-22c6-4950-0827892bac22","1000085767855","2025-08-17 23:44:00.198 +00:00","2025-08-17 23:44:00.253 +00:00","ISex_TTJRuarzs9-o_Gkhg","","9f27ad9a-31f1-4a57-b844-07dcc3f98f94","eyJzY2hlZHVsZSI6eyJsb2NhbF9zY2hlZHVsZWRfdGltZSI6IjIwMjAtMTAtMDdUMTA6NDQ6MDAiLCJyZWN1cnJpbmciOnsiY2FkZW5jZSI6eyJ0eXBlIjoiZGFpbHkiLCJjb3VudCI6MX0sImVuZF90aW1lIjoiMjAyMS0xMS0wMVQxNDozMDowMCIsImV4Y2x1c2lvbnMiOlt7ImRhdGVfcmFuZ2UiOiIyMDIxLTEwLTAxVDAwOjAwOjAwLzIwMjEtMTAtMDJUMDA6MDA6MDAifSx7ImhvdXJfcmFuZ2UiOiIyMi02In1dLCJwYXVzZWQiOnRydWV9fSwibmFtZSI6IkRhaWx5IHJlY3VycmluZyBzY2hlZHVsZWQgbWVzc2FnZSB1cGRhdGUgd2hpbGUgcGF1c2VkIiwicHVzaCI6eyJhdWRpZW5jZSI6eyJ0YWciOiJ0YWNvIn0sImRldmljZV90eXBlcyI6WyJpb3MiLCJhbmRyb2lkIl0sIm5vdGlmaWNhdGlvbiI6eyJhbGVydCI6IlFBIFRlc3QgUmVjdXJyaW5nIFVwZGF0ZSJ9fSwiZ3JvdXBfaWQiOiI2YmNlMWE0YS0yYjMwLTQ1YmEtOTFhMi1mM2YzZGNkMjJlNmEifQ==","SCHEDULES","false" "00000198-ba79-f92c-6551-79a344ce1896","1000085767856","2025-08-18 00:00:12.588 +00:00","2025-08-18 00:00:12.661 +00:00","ISex_TTJRuarzs9-o_Gkhg","","c1f450bf-7b5d-4a2e-b246-b83ab5fb25be","eyJzY2hlZHVsZSI6eyJzY2hlZHVsZWRfdGltZSI6IjIwMjItMDgtMjZUMTI6MDA6MDAiLCJyZWN1cnJpbmciOnsiY2FkZW5jZSI6eyJ0eXBlIjoiaG91cmx5IiwiY291bnQiOjF9LCJwYXVzZWQiOmZhbHNlfX0sIm5hbWUiOiJhdGxhbnRpY2dpYW50IGhvdXJseSIsInB1c2giOnsiYXVkaWVuY2UiOnsidGFnIjoiYXRsYW50aWNnaWFudCJ9LCJkZXZpY2VfdHlwZXMiOlsic21zIiwiaW9zIiwid2ViIiwiZW1haWwiXSwibm90aWZpY2F0aW9uIjp7ImFsZXJ0IjoiSGVsbG8gYXRsYW50aWNnaWFudCBob3VybHkiLCJlbWFpbCI6eyJtZXNzYWdlX3R5cGUiOiJ0cmFuc2FjdGlvbmFsIiwic2VuZGVyX25hbWUiOiJBaXJzaGlwIiwic2VuZGVyX2FkZHJlc3MiOiJ1YUBzcGFya3Bvc3Qtc3RhZ2luZy51cmJhbmFpcnNoaXAuY29tIiwicmVwbHlfdG8iOiJ1YUBzcGFya3Bvc3Qtc3RhZ2luZy51cmJhbmFpcnNoaXAuY29tIiwic3ViamVjdCI6IkhlbGxvIGF0bGFudGljZ2lhbnQgaG91cmx5IiwicGxhaW50ZXh0X2JvZHkiOiJIZWxsbyBhdGxhbnRpY2dpYW50IGhvdXJseSJ9fX0sImdyb3VwX2lkIjoiYzFmNDUwYmYtN2I1ZC00YTJlLWIyNDYtYjgzYWI1ZmIyNWJlIn0=","SCHEDULES","false" ``` # DataGrail > DataGrail delivers a single place to manage your privacy programs. DataGrail provides a platform to manage compliance with data privacy regulations, such as [GDPR (General Data Protection Regulation)](https://gdpr-info.eu/) and [CCPA (California Consumer Privacy Act)](https://leginfo.legislature.ca.gov/faces/billTextClient.xhtml?bill_id=201720180AB375). DataGrail offers continuous system detection as well as real-time inventory of data assets. ## DataGrail Integration Requirements * **Accounts** 1. DataGrail 1. Airship — Must include messaging * **Airship project** * [Named User](https://www.airship.com/docs/reference/glossary/#named_user) must be enabled for your project. ## Configuring the DataGrail Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **DataGrail**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create an authentication token. DataGrail uses the token to communicate with your project in Airship. * Configure Airship in DataGrail. Contact DataGrail for configuration location. # Foursquare > Integrate the Foursquare Movement SDK with your Airship implementation. Airship can easily integrate with Foursquare's Movement SDK by associating channels with Foursquare user identifiers. This allows a single user to be consistently identified across both platforms. ## Foursquare Integration Requirements * **Accounts** 1. Foursquare 1. Airship — Must include messaging * **Airship project** * The Airship SDK must use the same user identity as the Foursquare SDK. Associating the Foursquare Movement user identifiers with Airship channels can be accomplished with the following code. ### Client Code: iOS On iOS, associating a Foursquare Movement user identifier with an Airship channel should be done inside a callback triggered by the channel created event. This is to ensure the channel ID is set immediately once it's available. ```swift // Observe the notification center event `ChannelCreated` NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.updateUserID), name:AirshipNotifications.ChannelCreated.name, object: nil) // In the notification callback set the userID on your Movement SDK Manager instance func updateUserID() { if let channelID = UAirship.push().channelID, let _ = FSQMovementSdkManager.shared().userInfo { FSQMovementSdkManager.shared().userInfo!.setUserId(channelID) } } ``` ```obj-c // Observe the notification center event `ChannelCreated` [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateChannel) name:UAirshipNotificationChannelCreated.name object:nil]; // In the notification callback set the userID on your Movement SDK Manager instance NSString channelID = [[UAirship push] channelID]; if (channelID) { [FSQMovementSdkManager.sharedManager.userInfo setUserId:channelID]; } ``` ### Client Code: Android On Android, associating a Foursquare Movement user identifier with an Airship channel should be done inside a class extending `AirshipReceiver` that implements its `onChannelCreated` function. This is to ensure the channel ID is set immediately once it's available. ```kotlin private class MovementAirshipIntegration : AirshipChannelListener { override fun onChannelCreated(channelId: String) { val userInfo = UserInfo().apply { setUserId(channelId) } MovementSdk.get().setUserInfo(userInfo, persisted = true) } } ``` ## Configuring the Foursquare Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Foursquare**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) and an authentication token. Foursquare uses the token to communicate with your project in Airship. * Configure Airship as a third-party integration in Foursquare. # Gimbal > Automatically send messages based on Gimbal location data. [Gimbal](https://gimbal.com/) sends their location data to Airship via Gimbal Adapters. An Airship Gimbal adapter is a drop-in class for iOS, Android, and Fire OS that integrates Gimbal [Places](#key-terms) events with Airship. The Gimbal data can then be used with the [Custom Event Trigger](https://www.airship.com/docs/reference/glossary/#custom_event_trigger) in [Automation](https://www.airship.com/docs/reference/glossary/#automation) and [Sequences](https://www.airship.com/docs/reference/glossary/#sequence). Gimbal is the system of record for their location data, and all updates to places data are managed by Gimbal. Our [legacy integration] instead uses the [Location Trigger](https://www.airship.com/docs/reference/glossary/#location_event_trigger) and [Location Attributes Trigger](https://www.airship.com/docs/reference/glossary/#location_attributes_event_trigger). ## Gimbal integration requirements * **Accounts** 1. Gimbal 1. Airship — Must include messaging * **Airship project** * The Airship SDK must use the same user identity as the Gimbal SDK. ## Adding Gimbal adapters Follow the installation instructions: * [iOS Gimbal Adapter](https://github.com/gimbalinc/airship-adapter-ios) * [Android Gimbal Adapter](https://github.com/gimbalinc/airship-adapter-android) ## Configuring Gimbal integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Gimbal**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to create the [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) `gimbal_custom_entry_event` and `gimbal_custom_exit_event`. ### Gimbal events and properties When you configure the integration in the Airship dashboard, the following two custom events are created. Each event is followed by its associated properties and each property’s acceptable value. gimbal_custom_entry_event : placeAttributes — Gimbal place [attribute](#key-terms). Attributes are flattened and prefixed with `GMBL_PA_`.
visitID — String
placeIdentifier — String
placeName — String
boundaryEvent — Number: 1 = Entry, 2 = Exit. gimbal_custom_exit_event : placeAttributes — Gimbal place [attribute](#key-terms). Attributes are flattened and prefixed with `GMBL_PA_`.
visitID — String
placeIdentifier — String
placeName — String
boundaryEvent — Number: 1 = Entry, 2 = Exit.
dwellTimeInSeconds — Number ## Using the Custom Event trigger In the *Setup* step in an [automation](https://www.airship.com/docs/guides/messaging/messages/sequences/create-automation/) or when configuring the *Trigger* for a [sequence](https://www.airship.com/docs/guides/messaging/messages/sequences/create/create/): 1. Select the *Custom Event* trigger. 1. Use the *Events* box to search for and select `gimbal_custom_entry_event` or `gimbal_custom_exit_event`. 1. (Optional) Click **Add Another** to add more events. Airship handles multiple events as a boolean OR. 1. (Optional) Follow the [Filtering Custom Events](https://www.airship.com/docs/guides/messaging/messages/sequences/triggers/#filtering-custom-events) steps to add custom event filters. Refer to the [properties](#gimbal-events-and-properties) for each event. 1. (Optional) Set the maximum age for the events. If an event is received after it is older than a certain age, the automation or sequence will not start. 1. Enable *Event Expiration*. 1. Enter a value in minutes, hours, days, months, or years. ## Legacy integration You cannot set up the legacy integration. You can only manage an existing legacy integration, and you can use Gimbal location data with the triggers. ### Syncing events or removing the integration 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Gimbal**. 1. Select **Sync Now** to sync Gimbal region events or **Remove** to remove the integration. ### Using the Location and Location Attributes triggers Configure triggers in the Setup step in an [Automation](https://www.airship.com/docs/guides/messaging/messages/sequences/create-automation/) or the [Journey Map](https://www.airship.com/docs/reference/glossary/#journey_map) for a [Sequence](https://www.airship.com/docs/guides/messaging/messages/sequences/create/create/). See [Location](https://www.airship.com/docs/guides/messaging/messages/sequences/triggers/#location) and [Location Attributes](https://www.airship.com/docs/guides/messaging/messages/sequences/triggers/#location-attributes) in *Automation and Sequence triggers*. ## Gimbal key terms {#key-terms} Location : A location is a logical place defined by a set of beacons and/or geofences. Locations are the logical entities that are signalled by devices and may be used to trigger automations and sequences. Attributes : Attributes are *key/value pair* metadata associated with a particular location, e.g., *chain:BobsBurgers*, *has_blender:yes*. Attributes must be defined and assigned to a particular location in the Gimbal system and synced with an Airship account. Beacon : A beacon represents a physical device used for proximity detection. Beacons may represent hardware implementing the iBeacon standard for use with iOS, or proprietary beacons (such as Gimbal beacons) for use with Android. Beacons may or may not have geolocation data associated with them. Geofence : A geofence represents a fixed location representable by one or more points in the [WGS coordinate system](http://en.wikipedia.org/wiki/World_Geodetic_System). Geofences can consist of a single point and a radius expressed in meters, defining a circular region, or a series of points defining a polygon. Place : The Gimbal system refers to your app's locations as *Places*. A Place is either a single geofence, one or more beacons, or one or more beacons and a geofence. ![Gimbal place definitions](https://www.airship.com/docs/images/tg-place-definitions_hu_e523108973b7c69b.webp) *Gimbal place definitions* # Google Analytics > Send user-level mobile engagement data from Airship to Google Analytics in real time. Our Google Analytics integration sends user-level mobile engagement data from Airship to Google using a [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) (RTDS) connector. > **Note:** This integration does not support all the event types and properties available in the Real-Time Data Stream. If you would like to combine non-supported Airship events with Google Analytics data, we recommend using Airship's [Google Cloud Storage integration](https://www.airship.com/docs/integrations/gcs/) and building reports in [Looker Studio](https://support.google.com/looker-studio/answer/6370352?hl=en#zippy=%2Cin-this-article). ## Google Analytics Integration Requirements * **Accounts** 1. Google Analytics 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) * **Mobile App** * The Google Analytics Firebase SDK must be added to your mobile app. * The Firebase App Instance ID must be shared. ## Associating the App Instance ID with a Channel ID You must create custom identifiers that associate a Google Analytics App Instance ID with the user's Airship [Channel ID](https://www.airship.com/docs/reference/glossary/#channel_id). #### iOS Swift ```swift UAirship.shared().analytics .editAssociatedIdentifiers() .addIdentifier("ga4_instance_id", Analytics.appInstanceID()) .apply() ``` #### Android Java ```java FirebaseAnalytics.getInstance(this).getAppInstanceId().addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { String appInstanceId = task.getResult(); Airship.getAnalytics() .editAssociatedIdentifiers() .addIdentifier("ga4_instance_id", appInstanceId) .apply(); } } }); ``` #### Android Kotlin ```kotlin FirebaseAnalytics.getInstance(this).appInstanceId .addOnCompleteListener { task -> if (task.isSuccessful) { val appInstanceId = task.result Airship.analytics.editAssociatedIdentifiers { addIdentifier("ga4_instance_id", appInstanceId) } } } ```

Once set, all associated identifiers are returned in RTDS under the "identifiers" key:

```json { "ios_channel": "a6b392d6-3b0d-4c00-98ef-5cb91d51268a", "named_user_id": "albert", "identifiers": { "foo": "bar", "verycustomid": "123554" }, "attributes": { "package_name": "com.company_name.app_name", "version": "1.0.0", "ua_library": "7.0.2" } } ```

See also: RTDS API: Device Information.

RTDS will report events about those users directly to Google Analytics through the [Google Analytics Measurement Protocol API](https://developers.google.com/analytics/devguides/collection/protocol/ga4). From there, you can create segments within Google Analytics to track mobile engagement behavior. ## Configuring the Google Analytics Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Google Analytics**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Provide your Firebase App ID * Create an API secret in GA4 * Select the Airship events to send to GA4 * (Optional) [Populate the GA4 user ID](#populating-the-ga4-user-id) ### Defining Custom Dimensions in Google Analytics Airship includes some additional event parameters in the events sent to GA4. To use these properties in GA4 reports you must first define them as custom dimensions. Use the information in [GA4: Custom dimensions and metrics](https://support.google.com/analytics/answer/10075209?hl=en) and the [event-mapping table](#airship-google-analytics-event-mapping) below to create custom dimensions in your GA4 property. ### Populating the GA4 User ID {#user-id} The User-ID feature in GA4 allows you to count distinct users accurately and enables measuring their activity across different sessions, devices, and platforms. If your user ID in GA4 is the same value that you use for named users in Airship, you can optionally include that value in events. By default, the user ID is not populated. For more information, see: [GA4: Measure activity across platforms with User-ID](https://support.google.com/analytics/answer/9213390?hl=en). ## Airship-Google Analytics Event Mapping > **Important:** Because Google Analytics does not recommend high-cardinality dimensions, Airship does not include push IDs in events. If you would like to group push-related events, include [Campaign Categories](https://www.airship.com/docs/reference/glossary/#campaign_categories)when creating your messages. See also: [Data Formats: Campaigns Object](https://www.airship.com/docs/developer/rest-api/ua/schemas/push/#campaignsobject). Use the following table for reference when mapping Airship events to Google Analytics events. | Event | Description | GA Custom Dimensions | Notes | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | ------------------------------------------------ | | `airship_send` | Occurs whenever a push notification is sent to a device. | | Not sent if a campaign category is not included | | `airship_direct_open` | Occurs when a user opens your app directly from a push notification. | | Not sent if a campaign category is not included. | | `airship_uninstall` | Occurs when a user uninstalls an Airship-integrated app in response to a push. | | `airship_control` | Occurs when a device is excluded from a push because it was arbitrarily selected as a member of a control group. Membership in a control group indicates what would have happened if you did not send a message to a user at all. This occurs for A/B Test-related pushes only. | The campaign categories. | Not sent if a campaign category is not included. | # Google Cloud Storage > Store, analyze, and customize your mobile data. [Google Cloud Storage](https://cloud.google.com/storage/) is a secure, cloud-based storage service. The process below explains how to route events from Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) into a Google Cloud Storage bucket. ## GCS Integration Requirements This integration requires these accounts: 1. GCS 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Creating a GCS Bucket 1. Log in to the [Google Cloud Platform console](https://console.cloud.google.com/). 1. Create a bucket. See [Create buckets](https://cloud.google.com/storage/docs/creating-buckets) in Google's *Cloud Storage* documentation. 1. Create a JSON Formatted Private Key. See [Cloud Storage authentication](https://cloud.google.com/storage/docs/authentication#generating-a-private-key) in Google's *Cloud Storage* documentation. 1. Download the private key and open the file. You will paste the private key in the next step.

This is an example of a JSON-formatted private key. "REDACTED" appears where sensitive information would normally appear. ```json { "type": "service_account", "project_id": "REDACTED", "private_key_id": "REDACTED", "private_key": "-----BEGIN PRIVATE KEY-----\nREDACTED\n-----END PRIVATE KEY-----\n", "client_email": "REDACTED@REDACTED.iam.gserviceaccount.com", "client_id": "REDACTED", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/REDACTED%40 REDACTED.iam.gserviceaccount.com" } ``` ## Configuring the GCS Integration You will need your [bucket name and JSON-formatted private key](#creating-a-gcs-bucket). In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Google Cloud Storage**. 1. Follow the onscreen instructions to configure the integration. * You have the option to compress your data to save on storage space. * After saving, the private key will not appear again. `%%ENCRYPTED%%` will appear instead. You can still make changes to the private key by pasting updated JSON text. * [Google Cloud Storage always encrypts your data on the server side](https://cloud.google.com/storage/docs/encryption). ## Structure and Files Your bucket's directory structure and files will be named using the following patterns: JSON : appKey + "/" + integrationId + "/JSON/" + year + "\_" + month + "\_" + day + "/" + year + "\_" + month + "\_" + day + "\_" + hour + "\_" + minute + "\_" + second + ".json" There will be one file generated per hour, assuming a relevant event occurred within that hour. > **Note:** File size maximum is 15 GB. If the volume of events for an app results in a > file exceeding 15 GB, you may instead see multiple files. ### Sample File This integration provides RTDS data as line-delimited JSON objects in hourly batches as described above, as of the implementation date/time. Here are a few lines from a sample JSON file: ```json {"id":"0000017f-da30-7443-6712-c751b74e9063","offset":"1000042135016","occurred":"2022-03-30T09:38:02.947Z","processed":"2022-03-30T09:38:02.976Z","body":{"payload":"eyJhdWRpZW5jZSI6ImFsbCIsImRldmljZV90eXBlcyI6WyJpb3MiLCJhbmRyb2lkIiwiYW1hem9uIl0sIm5vdGlmaWNhdGlvbiI6eyJhbWF6b24iOnsiZXh0cmEiOnsiY29tLnVyYmFuYWlyc2hpcC5yZW1vdGUtZGF0YS51cGRhdGUiOiJ0cnVlIn19LCJhbmRyb2lkIjp7ImV4dHJhIjp7ImNvbS51cmJhbmFpcnNoaXAucmVtb3RlLWRhdGEudXBkYXRlIjoidHJ1ZSJ9fSwiaW9zIjp7ImNvbnRlbnRfYXZhaWxhYmxlIjp0cnVlLCJleHRyYSI6eyJjb20udXJiYW5haXJzaGlwLnJlbW90ZS1kYXRhLnVwZGF0ZSI6InRydWUifX19LCJvcHRpb25zIjp7Il9fZG9fbm90X3JlcG9ydCI6dHJ1ZSwiYnlwYXNzX2ZyZXF1ZW5jeV9saW1pdHMiOnRydWV9fQ==","push_id":"183ac190-b00d-11ec-a673-0242c76ec74c","resource":"PUSH","trimmed":false},"type":"PUSH_BODY"} {"id":"18468161-b00d-11ec-851c-0242c8a3fe5a","offset":"1000042135017","occurred":"2022-03-30T09:38:02.998Z","processed":"2022-03-30T09:38:03.071Z","device":{"android_channel":"be5697cf-19ad-474a-9454-9451b0781282","channel":"be5697cf-19ad-474a-9454-9451b0781282","device_type":"ANDROID","named_user_id":"jarofghosts"},"body":{"push_id":"183ac190-b00d-11ec-a673-0242c76ec74c","alerting":false},"type":"SEND"} {"id":"184a03d4-b00d-11ec-b185-02425ebb82b6","offset":"1000042135018","occurred":"2022-03-30T09:38:03.021Z","processed":"2022-03-30T09:38:03.076Z","device":{"android_channel":"cd007034-c302-4e66-84c1-f4a4d73626a5","channel":"cd007034-c302-4e66-84c1-f4a4d73626a5","device_type":"ANDROID","named_user_id":"angrr"},"body":{"push_id":"183ac190-b00d-11ec-a673-0242c76ec74c","alerting":false},"type":"SEND"} {"id":"184f0ce3-b00d-11ec-851c-0242c8a3fe5a","offset":"1000042135019","occurred":"2022-03-30T09:38:03.054Z","processed":"2022-03-30T09:38:03.074Z","device":{"android_channel":"3719d69f-8cc8-4e15-9e93-07eeef19054d","channel":"3719d69f-8cc8-4e15-9e93-07eeef19054d","device_type":"ANDROID"},"body":{"push_id":"183ac190-b00d-11ec-a673-0242c76ec74c","alerting":false},"type":"SEND"} {"id":"184b8a79-b00d-11ec-82cb-02421f49f457","offset":"1000042135020","occurred":"2022-03-30T09:38:03.031Z","processed":"2022-03-30T09:38:03.072Z","device":{"android_channel":"6f1e5dba-d613-4d92-ae57-e9d752b3fb48","channel":"6f1e5dba-d613-4d92-ae57-e9d752b3fb48","device_type":"ANDROID","named_user_id":"gemma"},"body":{"push_id":"183ac190-b00d-11ec-a673-0242c76ec74c","alerting":false},"type":"SEND"} {"id":"184dfb71-b00d-11ec-bba4-0242374bcd23","offset":"1000042135021","occurred":"2022-03-30T09:38:03.047Z","processed":"2022-03-30T09:38:03.079Z","device":{"android_channel":"cd4b40f9-6552-4dc6-9075-3f382ccf643f","channel":"cd4b40f9-6552-4dc6-9075-3f382ccf643f","device_type":"ANDROID","named_user_id":"meghan","attributes":{"locale_variant":"","app_version":"2021-10-04T180745-goat","device_model":"Nokia 6.1","app_package_name":"com.urbanairship.goat","iana_timezone":"America/New_York","push_opt_in":"false","locale_country_code":"US","device_os":"10","locale_timezone":"-14400","locale_language_code":"en","location_enabled":"true","background_push_enabled":"true","ua_sdk_version":"15.0.0","location_permission":"ALWAYS_ALLOWED"}},"body":{"push_id":"183ac190-b00d-11ec-a673-0242c76ec74c","alerting":false},"type":"SEND"} {"id":"184b8a75-b00d-11ec-82cb-02421f49f457","offset":"1000042135022","occurred":"2022-03-30T09:38:03.031Z","processed":"2022-03-30T09:38:03.073Z","device":{"android_channel":"2ffae649-4f28-4ed8-a11f-323a65f585f3","channel":"2ffae649-4f28-4ed8-a11f-323a65f585f3","device_type":"ANDROID","named_user_id":"lhf"},"body":{"push_id":"183ac190-b00d-11ec-a673-0242c76ec74c","alerting":false},"type":"SEND"} ``` ## Use Cases Once you have set up your Google Cloud Storage integration, your Airship data will be directed into your storage bucket once per hour. From there, how you use the data is up to you, but some potential ideas are: * Output files with user-level send and open information, and import these files into your CRM system. * Combine output data with [Google Big Query](https://cloud.google.com/bigquery/) to perform detailed analysis of your users. > **Tip:** Be sure to regularly audit your Airship Google Cloud bucket. Real-Time Data Streaming outputs > large amounts of data, which can lead to expensive Google Cloud bills if not > managed appropriately. # Iterate > Send feature-rich Iterate surveys using Airship In-App Automation or email, and save responses as Airship Custom Attributes. Iterate's unique customer insights platform empowers teams to listen, learn, and act by deploying surveys and data collection across all customer channels. Using Airship's [In-App Automation](https://www.airship.com/docs/reference/glossary/#iaa) or email, Iterate can help you gather the data you need by delivering your customers engaging and powerful questions without needing to integrate any new SDKs. Enrich your customer profiles by sending responses to Airship as Custom [Attributes](https://www.airship.com/docs/reference/glossary/#attributes), enabling you to create deeply personalized campaigns, fill in demographic gaps, collect key metrics like NPS and CSAT, and more. ## Iterate Integration Requirements **Accounts** 1. Iterate 1. Airship — [Must include In-App Automation and/or Email](https://www.airship.com/docs/reference/feature-packages/) ## Configuring the Iterate Integration For information about configuration and usage, see Iterate's [Airship integration](https://help.iteratehq.com/en/articles/8280192-airship-integration) documentation. # Jacquard > Jacquard's AI content platform generates and optimizes content for enterprise marketers. The Jacquard, formerly Phrasee, platform brings together artificial intelligence (AI), computational linguistics, and their trademark customer-centricity as the only tool of its kind to generate, optimize, automate, and analyze language in real time. It gets smarter with every send, seamlessly delivering top-performing copy across your digital marketing campaigns. With Jacquard, you can: * Create experiments and generate copy for variants * Track engagement per variant Refer to [Jacquard's documentation](https://support.jacquard.com/docs/airship-dynamic-optimisation-getting-started) to implement the integration between Jacquard and Airship. # LiveRamp > Export audience data to LiveRamp for activation across their network of advertising partners. Use Airship's integration with LiveRamp to export audience data for activation across LiveRamp's extensive network of advertising partners. This integration uses [Performance Analytics](https://www.airship.com/docs/reference/glossary/#pa) to create and schedule exports of CSV data that can be accessed by your LiveRamp account. The LiveRamp integration enables you to: * Export audience data containing [identifying information](https://docs.liveramp.com/connect/en/identity-and-identifier-terms-and-concepts.html#identifier-data): email addresses, phone numbers, physical addresses * Schedule regular exports of your data * Choose between Cloud Storage (Amazon S3) or SFTP delivery methods * Activate your audiences across LiveRamp's network of [advertising partners](https://partner-directory.liveramp.com/t/categories/media) ## LiveRamp integration requirements This integration requires these accounts: 1. LiveRamp 1. Airship — Must include both: * Messaging * [Performance Analytics](https://www.airship.com/docs/reference/feature-packages/#analytics) To export using SFTP, you must have this information to complete the configuration: * SFTP server details from LiveRamp: * Host address * Username * Password * Preferred key exchange algorithm To export to an Amazon S3 destination, you must have this information to complete the configuration: * S3 bucket name * Access key * Secret key * Region * Optional: Path prefix for files > **Important:** You must you have proper consent and legal basis for sharing the exported data with LiveRamp and their advertising partners. ## Set up data export Follow the steps in [Scheduling delivery of Performance Analytics data](https://www.airship.com/docs/guides/reports/analytics/tasks-queries/scheduling/) with these settings: * **Destination:** Amazon S3 or SFTP * **Export Format**: CSV * **Export recurrence interval**: Daily, weekly, or monthly ## Troubleshooting and support If you encounter issues with the LiveRamp integration: 1. Check the export logs in Airship for errors. 1. Verify your LiveRamp account status. 1. Contact your LiveRamp account team or submit a [Support Ticket](https://docs.liveramp.com/connect/en/support.html#support) through the LiveRamp Community Portal 1. [Contact Airship Support](https://support.airship.com) if issues persist. Additional Resources: * [LiveRamp documentation](https://docs.liveramp.com) * [Airship Feature packages reference](https://www.airship.com/docs/reference/feature-packages/) # Lytics > Connect disparate data sources with the popular customer data platform. Your customers have many and varied interests. The quality of your customer data sources varies too, ranging from structured to unstructured, current to dated. Lytics makes it easy to aggregate customer data from a variety of sources and keep it up-to-date. With Airship Real-Time Data Streaming as your source for mobile data, you can manage your customer data platform with a Mobile First mentality. **Optimize How Users Interact With Your Brand** * Use rich behaviors from your website, email, social, and ad campaigns to inform and inspire your mobile design practices. * Enhance your mobile experience using insights based on how users interact with your entire brand presence. **Put Rich Mobile User Behavior To Work** * Use what you learn about your users from native apps to inform the rest of your brand experience. * Export Lytics behavior-rich segments back to your marketing tools to put mobile user insights to work on other channels. **Adapt Mobile Data To Best-Of-Breed Marketing Tools** * Connect your mobile and marketing data to Lytics to build exportable universal profiles that adapt to many best-of-breed marketing tools. * Deploy behavior-rich audience segments with the click of a button. **Predict Which Customer Segments Will Most Likely Drive Future Business** * Apply the powerful prediction tools of Lytics on the rich behavioral mobile data from Airship. ## Lytics Integration Requirements This integration requires these accounts: 1. Lytics 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Configuring the Lytics Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Lytics**. 1. Follow the onscreen instructions to configure the integration. # Mixpanel > Target cohorts using Airship tags and feed Airship RTDS events into Mixpanel. The Mixpanel integration supports two major functions: * **Feed [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) events into Mixpanel.** Adding Airship events to Mixpanel provides another behavioral dimension to analyze: audience engagement. * **Export Mixpanel cohorts to Airship as tags.** You can export cohorts once or set up *dynamic sync*, which updates the `mixpanel` tag group every 15 minutes. You can then target Mixpanel tags when creating messages: * **Segmentation:** Create a [Segment](https://www.airship.com/docs/reference/glossary/#segment) using a combination of Airship tags and Mixpanel cohorts. Use these segments to send targeted [In-App](https://www.airship.com/docs/reference/glossary/#in_app_message) or [Message Center](https://www.airship.com/docs/reference/glossary/#message_center) messages. * **Automation:** If you set the Mixpanel cohort to be dynamic, you can also set up [Automation rules](https://www.airship.com/docs/reference/glossary/#automation) or [Sequences](https://www.airship.com/docs/reference/glossary/#sequence) based on the addition or removal of a cohort tag. See: [Configure Triggers: Tag Change](https://www.airship.com/docs/guides/messaging/messages/sequences/triggers/#tag-change). Read more about data export and user matching in Mixpanel's [Airship Set Up Guide](https://docs.mixpanel.com/docs/cohort-sync/integrations/airship). ## Mixpanel Integration Requirements * **Accounts** 1. Mixpanel 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for outbound integration only* * **Airship project** * Recommended: Enable [Named User](https://www.airship.com/docs/reference/glossary/#named_user) for non-mobile channels. ### Mixpanel Integration User ID Mapping Users are matched between Airship and Mixpanel using the Airship [Channel ID](https://www.airship.com/docs/reference/glossary/#channel_id). Within Mixpanel, the channel ID is saved as a user profile property: * **iOS**: `$ios_urban_airship_channel_id` * **Android**: `$android_urban_airship_channel_id` If you don't use the Mixpanel SDK, add these properties and set the values with the Mixpanel API to match users by channel IDs. If you would like to specify a value to match a Mixpanel user profile to a [Named User](https://www.airship.com/docs/reference/glossary/#named_user), add the `$airship_named_user` user property (the Airship SDK will not automatically declare it), which will be sent when matching. Users without `$airship_named_user` user property will instead have their `distinct_id` sent to Airship Named User system. This route is intended for implementations where the same identifier value is used for both `distinct_id` (Mixpanel) and `named_user_id` (Airship). ## Mixpanel Inbound Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Mixpanel**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create a [Tag Group](https://www.airship.com/docs/reference/glossary/#tag_group) and an authentication token. Mixpanel uses the token to communicate with your project in Airship. * Configure the Airship integration in Mixpanel. ### Sending Mixpanel Cohorts to Airship as Tags After [configuring the Mixpanel inbound integration](#mixpanel-inbound-integration), you can use your Mixpanel cohorts to set tags on your audience, helping you organize and retarget your audience based on analytics information from Mixpanel. To have Mixpanel send selected cohorts, you need to *export* each cohort to your Airship integration. In Mixpanel: 1. Go to **Data Management**, then **Cohorts**. 1. Select the three dots icon ( ) for a cohort, then **Export to ...**, then **Airship**. 1. Specify if the cohort should be sent one time only or dynamically (at predefined intervals). See also: [Mixpanel's Airship documentation](https://docs.mixpanel.com/docs/cohort-sync/integrations/airship). ## Mixpanel RTDS Integration Mixpanel library initialization requires a Mixpanel project token. See [Find Project Token](https://docs.mixpanel.com/docs/orgs-and-projects/managing-projects#find-your-project-tokens) to locate your token. To set up this integration, you must: 1. Configure your app to set the `mixpanel_distinct_id` on Airship events. See the Android and iOS setup sections below for more information. 1. Set up the RTDS integration in the Airship dashboard. When you set up a Mixpanel RTDS integration, your events will contain a `mixpanel_distinct_id` key. This is the identifier Mixpanel uses to differentiate between unique events. As a fallback, you may want to set your Airship Named User value to `mixpanel_distinct_id` to ensure that events are matched within Mixpanel. ### Android RTDS Setup [Mixpanel Android SDK Docs](https://developer.mixpanel.com/docs/android) ```java // Initialize the Mixpanel library with your project token MixpanelAPI mixpanel = MixpanelAPI.getInstance(context, "MIXPANEL_PROJECT_TOKEN"); // Get the Mixpanel distinct ID String distinctId = mixpanel.getDistinctId(); // Add the distinct ID to the current associated identifiers Airship.getAnalytics() .editAssociatedIdentifiers() .addIdentifier("mixpanel_distinct_id", distinctId) .apply(); ``` ### iOS Swift RTDS Setup [Mixpanel Swift SDK Docs](https://developer.mixpanel.com/docs/swift) ```swift // Initialize the Mixpanel library with your project token Mixpanel.initialize(token: "MIXPANEL_PROJECT_TOKEN") let mixpanel = Mixpanel.mainInstance() // Get the Mixpanel distinct ID let distinctId = mixpanel.distinctId // Add the distinct ID to the current associated identifiers let identifiers = Airship.analytics.currentAssociatedDeviceIdentifiers() identifiers.set(identifier: distinctId, key:"mixpanel_distinct_id") Airship.analytics.associateDeviceIdentifiers(identifiers) ``` ### iOS Objective-C RTDS Setup [Mixpanel Objective-C SDK Docs](https://developer.mixpanel.com/docs/ios) ```obj-c // Initialize the Mixpanel library with your project token Mixpanel *mixpanel = [Mixpanel sharedInstanceWithToken:@"MIXPANEL_PROJECT_TOKEN"]; // Get the Mixpanel distinct ID NSString *distinctId = mixpanel.distinctId; // Add the distinct ID to the current associated identifiers UAAssociatedIdentifiers *identifiers = [UAirship.analytics currentAssociatedDeviceIdentifiers]; [identifiers setIdentifier:distinctId forKey:@"mixpanel_distinct_id"]; [UAirship.analytics associateDeviceIdentifiers:identifiers]; ``` ### React Native RTDS Setup [Mixpanel React Native SDK Docs](https://developer.mixpanel.com/docs/react-native) ```javascript // Initialize the Mixpanel library with your project token const mixpanel = await Mixpanel.init('MIXPANEL_PROJECT_TOKEN', true); // Get the Mixpanel distinct ID const distinctId = await mixpanel.getDistinctId(); // Add the distinct ID to the current associated identifiers UrbanAirship.associateIdentifier("mixpanel_distinct_id", distinctId); ``` ### Set Up a Mixpanel RTDS Integration in Airship You will need your Mixpanel project token. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Mixpanel**. 1. Follow the onscreen instructions to configure the integration. ### Mapping Airship Event Types to Mixpanel In Mixpanel, you can find your events by type, prefixed with *Airship* — e.g., *Airship First Opt-in* for the `"type": "FIRST_OPT_IN"` event. Because the `custom` event type differentiates between events by `name`, Mixpanel uses the event `name` for custom events (if the event has a name), in the format *Airship `body.name`*. | Airship Event | Mixpanel Event | |---|---| | `CLOSE` | `Airship Close` | | `CONTROL` | `Airship Control` | | `CUSTOM` | `Airship` + `custom.name` (Example: `Airship Add To Cart`)

Defaults to `Airship Custom` if `body.name` is absent.| | Email Bounce1 | `Airship Bounce` | | Email Click1 | `Airship Click` | | Email Delay1 | `Airship Delay` | | Email Delivery1 | `Airship Delivery` | | Email Injection1 | `Airship Injection` | | Email Open1 | `Airship Open` | | Email Unsubscribe1 | `Airship Unsubscribe` | | `FIRST_OPEN` | `Airship First Open` | | `FIRST_OPT_IN` | `Airship First Opt-in` | | `IN_APP_BUTTON_TAP` | `Airship In-App Button Tap` | | `IN_APP_EXPERIENCES` | `Airship In-App Experiences` | | `IN_APP_FORM_DISPLAY` | `Airship In-App Form Display` | | `IN_APP_FORM_RESULT` | `Airship In-App Form Result` | | `IN_APP_MESSAGE_DISPLAY` | `Airship In-App Message Display` | | `IN_APP_MESSAGE_EXPIRATION` | `Airship In-App Message Expiration` | | `IN_APP_MESSAGE_RESOLUTION` | `Airship In-App Message Resolution`| | `IN_APP_PAGE_SWIPE` | `Airship In-App Page Swipe` | | `IN_APP_PAGE_VIEW` | `Airship In-App Page View` | | `IN_APP_PAGER_COMPLETED` | `Airship In-App Pager Completed` | | `IN_APP_PAGER_SUMMARY` | `Airship In-App Pager Completed` | | `LOCATION` | `Airship Location` | | `MOBILE_ORIGINATED` | `Airship Mobile Originated` | | `OPEN` | `Airship Open` | | `REGION` | `Airship Region` | | `RICH_DELETE` | `Airship Rich Delete` | | `RICH_DELIVERY` | `Airship Rich Delivery` | | `RICH_READ` | `Airship Rich Read` | | `SCREEN_VIEWED` | `Airship Screen Viewed` | | `SEND` | `Airship Send` | | `SEND_ABORTED` | `Airship Send Aborted` | | `SEND_REJECTED` | `Airship Send Rejected` | | `SHORT_LINK_CLICKED` | `Airship Short Link Click` | | SMS Delivery Report — Aborted2 | `Airship SMS Delivery Aborted` | | SMS Delivery Report — Delivered2 | `Airship SMS Delivered` | | SMS Delivery Report — Dispatched2 | `Airship SMS Delivery Dispatched` | | SMS Delivery Report — Expired2 | `Airship SMS Delivery Expired` | | SMS Delivery Report — Failed2 | `Airship SMS Delivery Failed` | | SMS Delivery Report — Rejected2 | `Airship SMS Delivery Rejected` | | SMS Delivery Report — Undeliverable2 | `Airship SMS Delivery Undeliverable` | | SMS Delivery Report — Unknown2 | `Airship SMS Delivery Unknown` | | `SUBSCRIPTION` | `Airship Subscription` — indicates change in email subscription status or values | | `WEB_CLICK` | `Airship Web Click` | | `WEB_SESSION` | `Airship Web Session` | | `UNINSTALL` | `Airship Uninstall` | 1. Email delivery report events are `CUSTOM` type events with a `body.name` property indicating the delivery status of an email. Mixpanel uses the `body.name` key rather than the `type` key to better represent the event.
2. SMS Delivery reports are `CUSTOM` type events that use the `body.name` property to represent the status of your SMS delivery (as reported by the last-mile provider). ### Mapping Airship Event Properties to Mixpanel | Airship Event Property | Mixpanel Event Property | |---|---| | `body.event_type` | `Specific Event Type` (The event `type` property is already called `Event Type`.) | | `body.identifiers.msisdn` | `MSISDN` | | `body.identifiers.sender` | `Sender` | | `body.properties.inbound_message` | `Inbound Message` | | `body.properties.keyword` | `Keyword` | | `body.properties.outbound_message` | `Outbound Message` | | `device.amazon_channel` | `Amazon Channel ID` | | `device.android_channel` | `Android Channel ID` | | `device.attributes.app_package_name` | `App Package Name` | | `device.attributes.app_version` | `App Version` | | `device.attributes.background_push_enabled` | `Background Push Notifications Enabled` | | `device.attributes.device_model` | `Model` | | `device.attributes.device_os` | `OS Version` | | `device.attributes.iana_timezone` | `Timezone` | | `device.attributes.locale_country_code` | `Country Code` | | `device.attributes.locale_language_code` | `Language Code` | | `device.attributes.locale_timezone` | `Timezone Offset` | | `device.attributes.locale_variant` | `Language Variant` | | `device.attributes.location_enabled` | `Location Services Enabled` | | `device.attributes.location_permission` | `Location Permission` | | `device.attributes.push_opt_in` | `Opted Into Push Notifications` | | `device.attributes.ua_sdk_version` | `Airship SDK Version` | | `device.attributes.web_browser_name` | `Browser` | | `device.attributes.web_browser_type` | `Web Browser Type` | | `device.attributes.web_browser_version` | `Web Browser Version` | | `device.attributes.web_user_agent_string` | `Web User Agent String` | | `device.channel` | `Channel ID` | | `device.delivery_address` | `Delivery Address` | | `device.device_type` | `Device Type` | | `device.identifiers.AA_visitorID` | `Adobe Visitor ID` | | `device.identifiers.address` | `Email Address` | | `device.identifiers.com.urbanairship.aaid` | `Android/Amazon Ad ID` | | `device.identifiers.com.urbanairship.gimbal.aii` | `Gimbal App Instance ID` | | `device.identifiers.com.urbanairship.limited_ad_tracking_enabled` | `Limited Ad Tracking Enabled` | | `device.identifiers.com.urbanairship.vendor` | `Apple Vendor ID` | | `device.identifiers.GA_CID` | `Google Analytics Client ID`| | `device.identifiers.IDFA` | `IDFA` | | `device.ios_channel` | `iOS Channel ID` | | `device.named_user_id` | `Named User ID` | | `id` | `Event ID` | | `offset` | `Event Offset` | | `occurred` | `Time` | | `type` | `Event Type` | ### Mapping Airship Tag Change Event Properties to Mixpanel When Airship sends a tag change event to Mixpanel, Mixpanel reflects the `current` tags as event properties. Mixpanel uses the tag group as the property and the tags in the group as the value. **Example tag change event** ```json { "id": "00000169-4a14-67b2-1ddd-d9e733622c3a", "occurred": "2020-06-23T19:00:45.106Z", "offset": "1000001260057", "processed": "2020-06-23T19:00:47.094Z", "type": "TAG_CHANGE", "device": { "ios_channel": "1ef235f0-03d5-1384-893e-a19b5cd0d110", "channel": "1ef235f0-03d5-1384-893e-a19b5cd0d110", "device_type": "IOS", }, "body":{ "add": { "crm": [ "partner", "active" ], "loyalty": [ "silver_member" ] }, "current": { "crm": [ "partner", "active", "new_user" ], "loyalty": [ "silver_member", "special_offers" ], "device": [ "san_francisco", "sports" ] } }, "type": "TAG_CHANGE" } ``` From the example above, Mixpanel maps tag groups and tags as follows: | Airship Event Property | Mixpanel User Property | Value | |---|---|---| | `body.current.crm` | `Airship crm` | `["partner", "active", "new_user"]` | | `body.current.loyalty` | `Airship loyalty` | `["silver_member", "special_offers"]` | | `body.current.device` | `Airship device` | `["san_francisco", "sports"]` | # Movable Ink > Movable Ink generates personalized visual content for Airship app audiences. You can set up both inbound and outbound integrations with Movable Ink. ## Movable Ink Integration Requirements This integration requires these accounts: 1. Movable Ink * Stories subscription — *Required for outbound integration only* 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for outbound integration only* ## Inbound Integration Movable Ink helps you deliver highly relevant, personalized push notifications, Message Center messages, and in-app automations. Contact [alliances@airship.com](mailto:alliances@airship.com) to get started with the Movable Ink inbound integration. Airship will help you set up your integration and create Message Center templates so you can use your Movable Ink campaigns in Airship. To use Movable Ink with Airship, you must use your audience's `channel_id` or `named_user_id` identifiers as Movable Ink merge tags — the `mi_u` query parameter in Movable Ink. This helps ensure that each member of your audience receives personalized content. To take advantage of Movable Ink, you'll insert blocks of content or *Creative Tags* from Movable Ink into your Airship messages. A Creative Tag is a snippet of HTML that includes business logic to render personalized, intelligent content in your Airship message. ### Use Cases Movable Ink helps you personalize the look and feel of your message to suit each individual in your audience. * **Merge sale-specific information in your messages:** Promote product-based messaging in your app after a user views content in a website or an email. * **Target your audience contextually:** Send time-targeted messages to make sure your audience knows about upcoming events, weather, time-targeted offers, etc. * **Offer behavioral recommendations:** Let your audience know about product substitutes or events tangential to their current interests to keep them engaged. ### Movable Ink Support in Airship Movable Ink dynamically generates creative content in real time for your mobile app using Airship. This table lists many of the Movable Ink capabilities available for Airship apps. > **Note:** If a Movable Ink capability is not listed in these tables, then it is fully supported for mobile messaging with Airship. **Creative Optimizer**: | Movable Ink capability | Rich push notification | In-App Automation/Message Center | Notes | | --- | :---: | :---: | --- | | Display A/B content | | ✓ | | | Optimize | | ✓ | Use the Channel ID to optimize. Must deep link so Movable Ink can capture clicks and optimize the content. Cannot optimize based on conversions or revenue. | {class="table-col-1-30"} **Targeting Rules**: | Movable Ink capability | Rich push notification | In-App Automation/Message Center | Notes | | --- | :---: | :---: | --- | | Date | ✓\* | ✓\* | \*Supported but not recommended because push notifications are cached upon receipt and do not refresh. | | Day of Week | ✓\* | ✓ | \*Supported but not recommended because push notifications are cached upon receipt and do not refresh. | | Query Parameters | ✓\* | ✓\*\* | \*If using Airship with Salesforce Marketing Cloud, your identifiers in Airship (`channel_id` or `named_user`) must match Salesforce's UUID and be passed through their connector.

\*\*Can only use the UUID (`mi_u`) parameter. | | Time of Day | ✓\* | ✓ | \*Supported but not recommended because push notifications are cached upon receipt and do not refresh. | | Stories/Behavioral Activity | | ✓ | Airship's channel or named user identifiers must be linked to your ESP's UUID, which Movable Ink uses for Stories user profiles. | | Deep linking in the app | ✓\* | ✓\*\* | \*Must deep link with Branch.io.

\*\*Must use Airship's custom deep linking solution to track click analytics. | {class="table-col-1-30"} **Apps**: | Movable Ink capability | Rich push notification | In-App Automation/Message Center | Notes | | --- | :---: | :---: | --- | | Bar Chart | | ✓\* | \*As long as the UUID can be used in other data providers to generate content. | | Barcode Generator | ✓ | ✓ | Requires a custom solution and only UUIDs can be merged. Can be used with APIs that accept the UUIDs. | | Countdown Timer | ✓\* | ✓ | \*Supported but not recommended because push notifications are cached upon receipt and do not refresh. | | Data Sources | ✓ | ✓ | | | Facebook Share Button | ✓ | ✓ | Redirects to the web, then to Facebook's website to post content. Deep linking to Facebook's app is not possible. | | Image Personalization | | ✓ | Airship stores limited data about app activity, such as last login date, that may be used. | | Polling | | ✓ | After voting, will leave the app to a mobile landing page as long as the UUID is working. | | QR Code Generator | | ✓ | Requires a custom solution, and only UUIDs can be merged. Can be used with APIs that accept the UUIDs. | | Scratch Off | ✓ | ✓ | On click, will either leave the app for the Scratch off experience or to a custom landing webpage built within the app. | | Social Sharing | ✓\* | ✓ | \*Will be directed to the original app, then the web browser, and finally to the desired destination. | | Video | ✓ | ✓ | Animated GIFs only. | {class="table-col-1-30"} ### Send a Push Notification with Movable Ink You can insert an image source from a Movable Ink *Creative Tag* into an Airship message to deliver personalized media to your audience. 1. Go to your campaign in Movable Ink and click **Code**. 1. Click **Push** and copy the image source URL (the `src` of the `img` tag) from the creative tag. 1. Go to the **Content** step of your message in Airship. 1. Paste the URL in the **Media** section in the *Content* step of your message. Verify that the message preview shows your media from Movable Ink. ![Adding a Movable Ink media URL to a push notification](https://www.airship.com/docs/images/integrations/movable-ink/push-media_hu_65d47fe65ed4b28c.webp) *Adding a Movable Ink media URL to a push notification* 1. Complete the remaining composer steps and send your message. ### Send a Message Center message with Movable Ink Airship Professional Services will create Message Center templates supporting Movable Ink for you. When you compose messages in Airship, you will select a template supporting Movable Ink, then add different parts of your *Creative Tags* from your Movable Ink campaign to your message. In the *Content* step of a message in Airship: 1. Choose how you want to present the message: * Add the message to the Message Center inbox only: 1. Select *Message Center* and click **Add Content**. 1. Select the *Visual editor*. **OR** * Add the message to the Message Center inbox **AND** link to the message from a push notification and/or in-app message: 1. Select *Message Center*, combine with *Push Notification* and/or *In-App Message*, and click **Add Content**. 1. Select the *Visual editor* in the *Actions* section. *Message Center* is automatically the selected action. 1. Click **Create**. 1. Select your Movable Ink template under *Custom Templates*. 1. Go to the *Content* tab for the template. 1. Enter your **Movable Ink URL**: 1. Go to your campaign in Movable Ink, click *Code*, and select *Mobile Inbox*. 1. Copy the URL in your *Creative Tag*. This is the value of the `href` attribute of the `a` tag. 1. Click the *Movable Ink URL* field in Airship and paste the URL. 1. Enter your **Movable Ink Image**: 1. Go to your campaign in Movable Ink and copy the image source URL (the `src` of the `img` tag) from the creative tag. 1. Click the *Movable Ink Image* field in Airship and paste the image source. 1. Set up the remainder of your message. 1. Click **Save & Exit**. 1. Complete the remaining composer steps and send your message. ### Set Up In-App Automation with Movable Ink To take advantage of Movable Ink in your in-app automation, you must create a custom HTML message containing your Movable Ink *Creative Tags*. In Movable Ink: 1. Go to your campaign and click **Code**. 1. Click **In-App Messaging** and copy the *Creative Tags* that you want to add to your automation. ![Copying Creative Tags from Movable Ink](https://www.airship.com/docs/images/integrations/movable-ink/movable-ink-src_hu_deee57a8dfbba029.webp) *Copying Creative Tags from Movable Ink* 1. Paste your *Creative Tags* into the appropriate places in your Custom HTML message. In the Airship dashboard, create a new In-App Automation: 1. Select **Create** in the sidebar. 1. Next to **Build from scratch**, select **View all**. 1. Select **In-App Automation** and configure. * For *Style*, select **Custom HTML**. * In the **Content** step, upload your Custom HTML file or provide the URL where your content is hosted. 1. Complete the remaining composer steps and send your message. ### Send an Email with Movable Ink When setting up an email from Airship, you must add a **Campaign Code** to your email. If your email links your users to a website, you must add a **Conversion Tracking** script to your site to track conversions from your email. To use Movable Ink *Creative Tags* in an email, you must copy the contents of your creative tags into your email. You can either copy your creative tags directly into your own, custom HTML email, or you can create HTML blocks in the email Interactive editor. In the *Content* step of your email: 1. Go to your campaign in Movable Ink and click **Code**. 1. Click *Email* and copy your *Creative Tags*. 1. Paste your *Creative Tags* somewhere in the HTML Body of your email or create reusable HTML blocks in the Interactive editor. * To use your own custom HTML: 1. Paste your *Creative Tags* into your custom HTML. 1. Click **Add ** for **HTML Body**. 1. Upload or paste HTML. Your HTML must contain the *Campaign Code* you copied in earlier steps. * To create reusable custom HTML blocks in the Interactive editor: 1. Select a default or [saved layout](https://www.airship.com/docs/guides/messaging/editors/interactive/saving-layouts/), or select *Blank Layout* to design your own. 1. Drag an *HTML* content element into your email. 1. Select the HTML element and paste your *Creative Tags* into the block. 1. When you finish setting up your email, click **Done**. ![Adding a custom HTML block to an email](https://www.airship.com/docs/images/email-custom-html-block_hu_406e158845ba8c92.webp) *Adding a custom HTML block to an email* 1. Complete the remaining composer steps and send your message. ### Deep Linking Using Movable Ink Movable Ink deep links allow you to use dynamic in-app click through locations in your creative tags. They also enable you to track clicks within Movable Ink from your in-app campaigns. When using Movable Ink deep links you will need to do a few extra steps to make sure they integrate properly. First, add a new Movable Ink [deep link](https://www.airship.com/docs/guides/messaging/project/config/deep-links/#add-a-deep-link) in the Airship dashboard. Set the template value to `{url}` to allow using any Movable Ink URL as a deep link. Next, you will need to do a few minor app updates to handle Movable Ink deep links within a mobile app in order to resolve the actual deep link value at runtime. #### Android Example Set up a method or class that is able to resolve a Movable Ink deep link to the actual deep link: ```kotlin class MovableInkUrl(private val url: String) { private data class Result(val url: String, val locationHeader: String?, val statusCode: Int) fun asFlow() = flow { emit(resolveDeepLink()) }.flowOn(Dispatchers.IO) fun asLiveData(): LiveData { return asFlow() .catch { emit(null) } .asLiveData() } private fun resolveDeepLink(): String? { var result: Result = resolveUrl(url) while (true) { if (result.statusCode == 200) { return result.url } if (result.statusCode == 302) { val nextUrl = nextUrl(result.url, requireNotNull(result.locationHeader)) if (shouldResolve(nextUrl)) { result = resolveUrl(nextUrl) continue } else { return nextUrl } } return null } return null } private fun nextUrl(url: String, location: String): String { return if (Uri.parse(location).isRelative) { Uri.parse(url).buildUpon() .encodedPath(location) .build() .toString() } else { location } } private fun shouldResolve(url: String): Boolean { if (url == this.url) { return true } return URLUtil.isHttpsUrl(url) } private fun resolveUrl(url: String): Result { return with(URL(url).openConnection() as HttpURLConnection) { this.instanceFollowRedirects = false this.requestMethod = "HEAD" val l = getHeaderField("Location") disconnect() Result(url, l, responseCode) } } } ``` Resolving deep links might take a few seconds depending on the connection, so you may need to show some sort of UI state while the app is determining the next navigation. In this example, we will show a progress activity that displays while the deep link is being resolved. ```kotlin class MovableInkActivity : AppCompatActivity() { internal lateinit var viewModel: UrlViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Autopilot.automaticTakeOff(this) val url = intent.getStringExtra("url") val fallbackUrl = intent.getStringExtra("fallback") if (url == null) { finish() return } setContentView(createLayout()) viewModel = ViewModelProvider(this, ViewModelFactory(url, fallbackUrl)).get( UrlViewModel::class.java ) viewModel.result.observe(this) { result -> if (result != null) { Airship.deepLink(result) } else { // no deep link or fallback state // Toast.makeText(this, "Failed to resolve movable ink URL", Toast.LENGTH_SHORT).show() } finish() } } private fun createLayout(): View { val layout = FrameLayout(this) val progressBar = ProgressBar(this, null, android.R.attr.progressBarStyleLarge) progressBar.isIndeterminate = true val params: LinearLayout.LayoutParams = LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT) layout.addView(progressBar, params) return layout } companion object { fun launch(context: Context, url: String, fallbackUrl: String?) { val intent = Intent() .setClass(context, MovableInkActivity::class.java) .putExtra("url", url) .putExtra("fallback", fallbackUrl) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) context.startActivity(intent) } } internal class UrlViewModel(private val url: String, private val fallbackUrl: String?) : ViewModel() { val result = MovableInkUrl(url).asFlow() .catch { emit(fallbackUrl) } .map { it ?: fallbackUrl } .asLiveData() } internal class ViewModelFactory(private val url: String, private val fallbackUrl: String?) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { @Suppress("UNCHECKED_CAST") return UrlViewModel(url, fallbackUrl) as T } } } ``` To handle Movable Ink deep links through Airship you will need to either add a new deep link listener on Airship, or modify your existing deep link listener to process the deep links: ```kotlin airship.deepLinkListener = object : DeepLinkListener { override fun onDeepLink(deepLink: String): Boolean { if (deepLink.startsWith("https://mi.")) { MovableInkActivity.launch(context, deepLink, null) return true } ... } } ``` #### iOS Example Set up a method or class that is able to resolve a Movable Ink deep link to the actual deep link: ```swift } import Foundation class MovableInkURL { private let url: URL private let delegate: TaskDelegate = TaskDelegate() private lazy var session : URLSession = { let config = URLSessionConfiguration.default return URLSession(configuration: config, delegate: self.delegate, delegateQueue: OperationQueue()) }() init(url: URL) { self.url = url } public func resolve() async throws -> URL { var request = URLRequest(url: url) request.httpMethod = "HEAD" return try await withCheckedThrowingContinuation { continuation in let task = self.session.dataTask(with: request, completionHandler: { data, response, error in if let response = response as? HTTPURLResponse, let locationHeader = response.value(forHTTPHeaderField: "Location"), let url = URL(string: locationHeader) { return continuation.resume(returning: url) } else if let url = response?.url { return continuation.resume(returning: url) } else { return continuation.resume(throwing: error ?? URLError(.badServerResponse)) } }) task.resume() } } private class TaskDelegate: NSObject, URLSessionTaskDelegate { func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest) async -> URLRequest? { guard let url = request.url, url.absoluteString.lowercased().starts(with: "https") else { return nil } return request } } } ``` Resolving deep links might take a few seconds depending on the connection, so you may need to show some sort of UI state while the app is determining the next navigation. In this example, we will show a progress window with a progress view while it resolves. ```swift import Foundation import SwiftUI import UIKit class MovableInkAlert { static func openForURL(_ url: URL, scene: UIWindowScene, onResult: @escaping (URL?) -> Void) { var window: UIWindow? let view = MovableLoadingView(url: url) { url in window?.windowLevel = .normal window?.isHidden = true window = nil onResult(url) } let viewController = UIHostingController(rootView: view) viewController.view.backgroundColor = .clear viewController.modalPresentationStyle = .currentContext window = UIWindow(windowScene: scene) window?.rootViewController = viewController window?.windowLevel = .alert window?.makeKeyAndVisible() } fileprivate struct MovableLoadingView: View { let url: URL let onResult: ((URL?) -> Void) @ViewBuilder var body: some View { VStack { ProgressView() .onAppear { Task { let url = try? await MovableInkURL(url: self.url).resolve() await MainActor.run { self.onResult(url) } } } .padding() .background(Color(UIColor.systemBackground)) .cornerRadius(10) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.gray.opacity(0.2)) } } } ``` To handle Movable Ink deep links through Airship you will need to either add a new deep link delegate on Airship, or modify your existing deep link delegate to process the deep links: ```swift func receivedDeepLink(_ url: URL, completionHandler: @escaping () -> ()) { if (url.absoluteString.starts(with: "https://mi.")) { MovableInkAlert.openForURL(url, scene: try! Utils.findWindowScene()) { resolvedURL in // Navigate to resolvedURL or a fallbackURL completionHandler() } return } ... } ``` ## Outbound Integration Send events from Airship to Movable Ink using [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) to activate customer event data stored in Airship to generate personalized content within Movable Ink. For more information, as well as use cases, see [Airship Incoming Webhooks Integration Guide](https://support.movableink.com/hc/en-us/articles/17880007272471-Airship-Incoming-Webhooks-Integration-Guide) in Movable Ink's support site. Login is required. ### Configuring the Outbound Integration First, generate API credentials in Movable Ink, and then enter them when configuring the integration in Airship. Your Movable Ink Client Experience team will be notified when you generate API credentials and may contact you to confirm next steps. In Movable Ink: 1. In Studio, select **Data** from the sidebar, then select **Integrations Gallery**. 1. Locate the Airship tile and select **Learn More** to view the available integrations. 1. Select **Incoming Webhooks**. 1. Select **Get Started**, then **Generate Credentials**. You should now have an Endpoint URL, Access Key ID, and Password. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Movable Ink**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Enter your Endpoint URL * Enter your API Access Key and Secret * Select the Airship events to send to Movable Ink After completing setup, Airship will begin sending events from your Airship project to Movable Ink. # mParticle > Map mobile engagement events to your customer data warehouse. [mParticle](https://www.mparticle.com/) is a mobile data platform that aggregates data from your app, website, and other sources. ## mParticle Integration Types There are three ways you can integrate with mParticle: 1. By integrating your **app** with the mParticle co-SDK — *Use mParticle to segment and target your Airship App audience.* 1. Via the Server-to-Server (S2S) integration for your **website** — *Send web events to Airship and use them to trigger messages and personalize message content.* 1. By sending [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) events from Airship to mParticle ## mParticle Integration Requirements * **Accounts** 1. mParticle 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for outbound integration only* * **Airship project** * The Airship SDK must use the same user identity as the mParticle SDK. ## App Integration Use the App integration and set tags on your app audience from mParticle. ```mermaid sequenceDiagram participant a as User participant b as mParticle participant c as Airship a->>b: Performs action recorded as event b->>c: Sets tag on user in Airship c->>a: Send message to user ``` ### Configuring the App Integration To integrate your app with mParticle, you must add mParticle's Airship Kit to your app's dependencies. The kit acts as a bridge between the mParticle and Airship SDKs, and it exposes the full range of Airship features to mParticle. Follow mParticle's [Airship Kit Integration](https://docs.mparticle.com/integrations/airship/event/#embedded-kit-integration) document to install the kit. > **Note:** Location events are not automatically tracked in the co-SDK integration. See: [Gimbal integration](https://www.airship.com/docs/integrations/gimbal/) and [Radar integration](https://www.airship.com/docs/integrations/radar/). > > The co-SDK issues a custom event for each item in the array of the standard mParticle event. ### Troubleshooting What do I do if I already have the Airship SDK in my app and want to add mParticle's SDK? : To send events from mParticle to Airship, do one of the following: * Reinstall the kit through mParticle for a SDK update and to map the events. * Map mParticle events to Airship-specific events, such as tags, custom events, etc. How do I update the Airship SDK when it was originally installed via the mParticle SDK? : You can specify a newer Airship SDK cocoapod for iOS or define a newer gradle dependency for Android. Both cocoapods and gradle resolve to the newest dependency listed. For example, the kit could define 7.0.0, but if the app wants 7.2.0, the kit will be forced to use 7.2.0. ### Mapping Attributes [Airship predefined attributes](https://www.airship.com/docs/reference/data-collection/attributes/#predefined-attributes) are mapped to [mParticle reserved user attributes](https://docs.mparticle.com/developers/server/json-reference/#user_attributes). If this mapping is not possible, the event properties are flattened and added to the `custom_attributes` object. | Airship Attribute | mParticle Attribute | |----------------------------|---------------------| | age | $age | | gender | $gender | | country | $country | | region (State or province) | $state | | first_name | $firstname | | last_name | $last_name | | mobile_phone | $mobile | Airship tags are grouped: mParticle creates a user attribute list for each tag group. The key is prefixed with `Airship`. For example, a tag group *loyalty* which contains tags `silver_member` and `special_offers` is mapped as follows: ```json {"Airship loyalty" : ["silver_member", "special_offers"]} ``` | Airship Property | mParticle Property | Description | |----------------------------------------------|------------------------|----------------------------------------------------------------| | occurred | timestamp_unixtime_ms | Event timestamp | | com.urbanairship.vendor | ios_idfv | IDFV | | com.urbanairship.aaid | android_advertising_id | Android Advertising ID | | com.urbanairship.limited_ad_tracking_enabled | limit_ad_tracking | Indicates if the user has enabled limit ad tracking | | device_model | device_model | The device model | | device_os | os_version | The device operating system | | locale_language_code | locale_language | Current language device is set to | | locale_country_code | locale_country | Current locale device is set to | | locale_timezone | timezone_offset | The device's timezone offset setting in hours relative to UTC. | | web_user_agent_string | http_header_user_agent | HTTP User Agent | | app_package_name | package | A unique identifier for the app name | | app_version | application_version | The version of the app | | named_user_id | customer_id | Customer ID | | channel | airship_channel_id | Partner ID | Your app integration maps user attributes from mParticle to Airship [tags](https://www.airship.com/docs/developer/rest-api/ua/schemas/channels/#channellistingobject) in the `device` tag group. If a user attribute does not contain a value, the attribute key is mapped directly to an Airship tag. If the user attribute contains a value, Airship sets the tag as `key-value`. For example, an mParticle user attribute in the format `"a_custom_property": "some_value"` would map to a `a_custom_property-some_value` tag in Airship. ## Web Integration The Server to Server (S2S) integration sends mParticle events captured from your website to Airship using the [Custom Events API](https://www.airship.com/docs/developer/rest-api/ua/operations/custom-events/#addcustomevents). You can trigger automations, in-app automations, and sequences using incoming [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) from mParticle. You can even [personalize messages](https://www.airship.com/docs/guides/personalization/about/) in automations or sequences using values from these events. ```mermaid sequenceDiagram participant a as User participant b as mParticle participant c as Airship a->>b: Performs action recorded as event b->>c: Sends custom event c->>a: Automatically sends message based on event ``` Custom events are associated with [Named Users](https://www.airship.com/docs/reference/glossary/#named_user). You can map named users to a hashed email address, an mParticle `customer_id`, or `Other` (a field in mParticle's `user_identities` object). The S2S integration uses the name of the event as the key in the properties of the event, containing an array of objects that you can iterate over — a list of products, promotions, or impressions. ### Configuring the Web Integration You must have an [access level of Owner, Admin or Full Access](https://www.airship.com/docs/guides/getting-started/admin/teams-messaging/#access-levels) to configure the integration. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **mParticle**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) `purchased`, `added_to_cart`, `browsed`, and `starred_item`. * Configure Airship in mParticle. Next, get your Airship project's [App Key](https://www.airship.com/docs/reference/glossary/#app_key), which you will use to configure the integration in mParticle: 1. Next to your project name, select the dropdown menu ( ), then **Project Details**. 1. Copy your App Key. In mParticle: 1. Create an Output Configuration for Airship: 1. Select **Directory**, then **Airship**. 1. Select **Add Airship to Setup**. 1. For **Integration Type**, select **Output Event**, then select **Add to Setup**. 1. Select the **Airship** output configuration group. 1. Enter a Configuration Name, your Airship App Key, and select your domain. 1. Select **App Key is for Web**, then **Save**. 1. Connect inputs to the output configuration you created in the previous step: 1. Go to **Connections**, then **Connect**. 1. Select the Input for the connection definition. 1. Select **Connect Output**. 1. Select the **Airship** Output Configuration that you created in previous steps. 1. Paste the bearer token that you created in earlier steps into the **Token** field. 1. Select the **Named User ID Type** that you want to map to your named users in Airship. 1. Select **Add Connection**. ### Mapping mParticle Events and Airship Events [mParticle commerce events](https://docs.mparticle.com/developers/sdk/web/commerce-tracking/) are mapped to Airship events as follows: | mParticle parent object | mParticle Event | Airship Mapped Name | Array of Objects (S2S integration only) | |-------------------------|----------------------|----------------------|-----------------------------------------| | product_action | purchase | purchased | `purchased.products` | | product_action | add_to_cart | added_to_cart | `added_to_cart.products` | | product_action | add_to_wishlist | starred_item | `starred_item.products` | | product_action | remove_from_wishlist | remove_from_wishlist | `remove_from_wishlist.products` | | product_action | remove_from_cart | remove_from_cart | `remove_from_cart.products` | | product_action | checkout | checkout | `checkout.products` | | product_action | refund | refund | `refund.products` | | product_action | checkout_option | checkout_option | `checkout_option.products` | | product_action | view_detail | view_detail | `view_detail.products` | | promotion_action | unknown | unknown | `unknown.promotions` | | promotion_action | view | view | `view.promotions` | | promotion_action | click | browsed | `browsed.promotions` | | product_impressions | | impression | `impression.impressions` | > **Note:** To use mParticle's lifetime value feature, you must specify an event name for Airship. Usually, these are purchase events or other events you’d like to attribute to the lifetime value of the customer. ### Personalizing Messages and Sequences Using mParticle Events {#personalize} You can use Airship [Handlebars](https://www.airship.com/docs/reference/glossary/#handlebars) to personalize messages in automation rules or sequences based on incoming mParticle events. The mParticle event `name` generally contains an array of objects relevant to the event. For example, in the event below, the array of `products` appears in the `added_to_cart` key in the `added_to_cart` event. Use object and array notation to access these properties. For example, using the incoming mParticle custom event below, you iterate over the array of `products` using `{{#each added_to_cart.products}}`. ```json { "occurred": "2020-02-27T09:41:54", "user": { "named_user_id": "hugh.manbeing" }, "body": { "value": 119.95, "name": "added_to_cart", "properties": { "id": "c420c8f2-5b81-4236-a07e-176cec0e4327", "source_id": "daba03c3-cc27-4395-b38f-deb9d44a0855", "session_id": "-310836276167998200", "coupon_code": "Example transaction coupon code", "transaction_id": "example-transaction-id", "tax_amount": 5.0, "shipping_amount": 5.0, "action": "added_to_cart", "added_to_cart": { "products": [ { "id": "example-sku", "name": "t-shirt", "brand": "Nike", "category": "Athletics", "position": 0, "price": 19.99, "quantity": 4, "totalAmount": 79.96 }, { "id": "example-sku-2", "name": "jacket", "brand": "Columbia", "category": "Outdoors", "position": 0, "price": 29.99, "quantity": 1, "totalAmount": 29.99 } ] }, "source": "mParticle" } } } ``` For example, you might create a template using `#each` to iterate over the `products` array in the example event above and let your audience know about the products that are still in their cart. ```text You added the following items to your cart! {{#each added_to_cart.products}} {{quantity}}x {{name}} @ ${{price}} = {{totalAmount}} {{/each}} Use coupon code {{coupon_code}} to save now! ``` ## Real-Time Data Streaming Integration Take advantage of events recorded by Airship in your mParticle customer data aggregate. ```mermaid sequenceDiagram participant a as User participant b as Airship participant c as mParticle b->>a: Sends a message a->>b: App open event resulting from message b->>c: Sends event to mParticle CDP ``` > **Important:** Only events that have at least one device ID (IDFV/AAID) or user identity ([Named User ID](https://www.airship.com/docs/reference/glossary/#named_user)) are sent to mParticle. ### Configuring the RTDS Integration This integration maps Airship App and Web channels to mParticle platforms. First you will create a feed for each Airship channel in mParticle, then you will configure RTDS for each feed and specify which events to send to mParticle. * iOS, Android, and Web have direct matches in mParticle, so you will select each when creating feeds. * Email and SMS do not have direct matches in mParticle, so you will not select a platform when creating the feed. These events are instead sent as *Unbound* data to mParticle. You can also opt to send **all** Airship data as unbound traffic. In this case, do not select a platform when creating an mParticle feed. --- In mParticle, repeat these steps to create feeds for iOS, Android, Web, and/or Unbound channels: 1. Go to **Directory** to view the available integrations. 1. Hover over the Airship tile and select **Setup**. 1. Go to **Setup**, then **Inputs**. 1. Select the plus icon (). 1. Enter a unique configuration name. 1. Select a platform or leave unselected for an Unbound feed. 1. Select **Save**. 1. Copy the **Server to Server Key** and **Secret** for use in the next steps in Airship. 1. Select **Close**. In Airship, complete these steps for each feed you created in mParticle: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **mParticle**. 1. Follow the onscreen instructions to configure the integration. * Be sure to enter the correct mParticle Server to Server Key and Secret for the platform you select. * The default User Identity Type is Customer ID, but you can also select Other, which is a field in mParticle's `user_identities` object. ### Mapping Events Most Airship events are mapped to mParticle's Custom Event, where: `event_type` = `custom_event`
`custom_event_type` = `other`
`event_name` = `{Airship event type}`
| Airship Event | mParticle Event | |---------------------------|--------------------------------------------------| | ATTRIBUTE_OPERATION | Set as User Attributes | | CLOSE | Custom Event | | CONTROL | Custom Event | | CUSTOM | Custom Event | | FIRST_OPEN | Custom Event | | FIRST_OPT_IN | Custom Event | | IN_APP_BUTTON_TAP | Custom Event | | IN_APP_EXPERIENCES | Custom Event | | IN_APP_FROM_DISPLAY | Custom Event | | IN_APP_FROM_RESULT | Custom Event | | IN_APP_MESSAGE_DISPLAY | Custom Event | | IN_APP_MESSAGE_EXPIRATION | Custom Event | | IN_APP_MESSAGE_RESOLUTION | Custom Event | | IN_APP_PAGE_SWIPE | Custom Event | | IN_APP_PAGE_VIEW | Custom Event | | IN_APP_PAGER_COMPLETED | Custom Event | | IN_APP_PAGER_SUMMARY | Custom Event | | LOCATION | Custom Event
`custom_event_type = location` | | MOBILE_ORIGINATED | Custom Event | | OPEN | Custom Event | | REGION | Custom Event | | RICH_DELETE | Custom Event | | RICH_DELIVERY | Custom Event | | RICH_READ | Custom Event | | SCREEN_VIEWED | Screen View | | SEND | Custom Event | | SEND_ABORTED | Custom Event | | SEND_REJECTED | Custom Event | | SHORT_LINK_CLICK | Custom Event | | SUBSCRIPTION | Custom Event | | TAG_CHANGE | Set as User Attributes | | UNINSTALL | Uninstall | | WEB_CLICK | Custom Event | | WEB_SESSION | Custom Event | # Purchasely > Send Purchasely events to Airship and design personalized automations. Purchasely helps you build and grow your mobile revenue by streamlining in-app purchase integration. You can send Purchasely events as [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) to Airship and design personalized [Automations](https://www.airship.com/docs/reference/glossary/#automation) based on your customers' purchase behavior. ## Purchasely Integration Requirements * **Accounts** 1. Purchasely 1. Airship — Must include messaging * **Airship project** * The Airship SDK must use the same user identity as the Purchasely SDK. ## Configuring the Purchasely Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Purchasely**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) and an authentication token. Purchasely uses the token to communicate with your project in Airship. * Configure Airship as an external integration in Purchasely. For additional detail, see [Purchasely's documentation](https://docs.purchasely.com/integrations/airship). # Radar > Track location data and generate contextual events using Radar event types. [Radar](https://radar.io/) makes it easy to start tracking location data with their iOS and Android SDKs, and generate contextual events from this data using their different event types: Geofences, Insights, and Places. Radar sends location data to Airship using our [server-side Custom Events API](https://www.airship.com/docs/developer/rest-api/ua/operations/custom-events/). Whenever location events are generated, Radar will send custom events and properties to Airship. This data can then be used with the Custom Event trigger in Automations and Sequences. ## Radar Use Cases * **Media:** Trigger sending a notification to a user when they enter a place within a specific category, e.g., a fitness venue, asking them to read your latest article on Health & Wellness. * **Retail:** Trigger sending a notification to a user when they enter one of your store locations, telling them about a new product you are offering. * **Dining:** Trigger sending a notification to a user when they enter a specific geofence, offering them a 20% off coupon for your restaurant. ## Radar Integration Requirements * **Accounts** 1. Radar — Enterprise account 1. Airship — Must include messaging * **Airship project** * The Airship SDK must use the same user identity as the Radar SDK. ## Configuring the Radar Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Radar**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) and an authentication token. Radar uses the token to communicate with your project in Airship. * (Optional) Create [Tag Groups](https://www.airship.com/docs/reference/glossary/#tag_group). * Configure the Airship integration in Radar. Radar will send custom events and properties to Airship for use with the Custom Event trigger. See the full list of [Radar Events](#radar-events). ## Using the Custom Event trigger {#trigger} In the Setup step in an [Automation](https://www.airship.com/docs/guides/messaging/messages/sequences/create-automation/) or when configuring the trigger for a [Sequence](https://www.airship.com/docs/guides/messaging/messages/sequences/create/create/): 1. Select the Custom Event trigger. 1. Search for a Radar event, then select from the listed results. Results are limited to events that occurred in the last 30 days. All [Radar events](#radar-events) have the prefix `radar` in the name. For example, `radar_geofence_entered`. ![Searching for Radar events for the Custom Event trigger](https://www.airship.com/docs/images/auto-event-radar_hu_d1edf7a5dea8d1f5.webp) *Searching for Radar events for the Custom Event trigger* 1. (Optional) Select **Add Another** to add more Radar events. Multiple event are handled as a boolean OR. ![radar_geofence_entered in the Custom Event trigger](https://www.airship.com/docs/images/auto-event-radar-add_hu_b96e05ca966cf7d6.webp) *radar_geofence_entered in the Custom Event trigger* ### Filtering Custom Events {#filter} When configuring the Custom Event trigger, you can filter custom events using numeric values associated with those custom events, or by key/value properties attached to the events. Filtering events this way can help you more precisely target your audience. > **Note:** The filter **does not** show events and event properties for custom events associated with [Named Users](https://www.airship.com/docs/reference/glossary/#named_user). You can still use events associated with named users as triggers, but you must enter their information manually. Each Radar location event has [associated properties](#radar-events) that may be used as filters. For example, you can choose to trigger an automation or sequence when a user enters a Radar geofence (`radar_geofence_entered`) with a confidence property (`radar_confidence`) value of Medium. 1. Select **Add event properties** for the custom event. ![Adding event properties for a Radar custom event](https://www.airship.com/docs/images/auto-event-radar-add_hu_b96e05ca966cf7d6.webp) *Adding event properties for a Radar custom event* 1. Select **Add property**. ![Selecting Add property](https://www.airship.com/docs/images/custom-event-add-2-radar_hu_9d52d4c61a56c3da.webp) *Selecting Add property* 1. Select **Search for properties**, enter a search term, and select from the listed results. ![Searching for Radar event properties](https://www.airship.com/docs/images/custom-event-add-enter-radar_hu_c134917e50588520.webp) *Searching for Radar event properties* ![Selecting a Radar event property from search results](https://www.airship.com/docs/images/custom-event-add-enter-radar-list_hu_9f6adf96b07ec195.webp) *Selecting a Radar event property from search results* 1. Set the property or value for your event filter and the operator determining how you want to evaluate the property or value. An operator will pre-populate for most properties. `Equals` is used for `radar_confidence` only. 1. (Optional) Add an alternative by selecting the plus icon () at the end of a row. 1. Select **ALL** or **ANY** to determine how to evaluate multiple filters and alternatives within each filter:

1. Select **Save**. ## Radar Events and Properties {#radar-events} Use the following terms when [searching for](#trigger) and [filtering](#filter) Radar events. See [Radar's documentation](https://radar.io/documentation) for additional detail. Each event is followed by its associated properties and each property's acceptable value. ### Radar Geofences radar_geofence_entered : radar_geofence_description: String
radar_geofence_tag: String
radar_geofence_external_id: String
radar_confidence: *Low*, *Medium*, or *High* radar_geofence_exited : radar_geofence_description: String
radar_geofence_tag: String
radar_geofence_external_id: String
radar_confidence: *Low*, *Medium*, or *High*
radar_duration: A number, in minutes ### Radar Insights radar_home_entered : radar_confidence: *Low*, *Medium*, or *High* radar_home_exited : radar_confidence: *Low*, *Medium*, or *High* radar_office_entered : radar_confidence: *Low*, *Medium*, or *High* radar_office_exited : radar_confidence: *Low*, *Medium*, or *High* radar_traveling_started : radar_confidence: *Low*, *Medium*, or *High* radar_traveling_stopped : radar_confidence: *Low*, *Medium*, or *High* ### Radar Places radar_place_entered : radar_place_name: String
radar_place_chain_slug: String
radar_place_chain_name: String
radar_place_categories: String
radar_place_facebook_id: String
radar_confidence: *Low*, *Medium*, or *High* radar_place_exited : radar_place_name: String
radar_place_chain_slug: String
radar_place_chain_name: String
radar_place_categories: String
radar_place_facebook_id: String
radar_confidence: *Low*, *Medium*, or *High*
radar_duration number: A number, in minutes # Relay42 > Create meaningful customer relationships by transforming fragmented interactions into seamless journeys. [Relay42](https://relay42.com/) Relay42 is an Orchestration Customer Data Platform (CDP) that empowers businesses to create meaningful customer relationships by utilizing smart technology to transform fragmented interactions into seamless journeys. The Relay42-Airship server-to-server connector allows brand to send audience data from Relay42 to Airship as Custom Events. You can use these Custom Events to target your mobile app audience. ## Relay42 Integration Requirements * **Accounts** 1. Relay42 — [Pro plan](https://relay42.com/platform) 1. Airship — Must include messaging * **Airship project** * [Named User](https://www.airship.com/docs/reference/glossary/#named_user) must be enabled for your project. ## Configuring the Relay42 Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Relay42**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create an authentication token. Relay42 uses the token to communicate with your project in Airship. * Configure the Airship integration in Relay42. For additional detail, see [Relay42's resources](https://support.relay42.com/hc/en-us/articles/4403768464529). # RevenueCat > RevenueCat is a powerful and reliable in-app purchase server with cross-platform support. You can use [RevenueCat](https://docs.revenuecat.com/docs/welcome) events to send [Custom Events](https://www.airship.com/docs/guides/audience/events/custom-events/) and trigger messages with Airship. You can design personalized [Airship Automations and Sequences](https://www.airship.com/docs/guides/messaging/messages/sequences/about/) based on purchase behavior. ## RevenueCat Integration Requirements * **Accounts** 1. RevenueCat — [Pro plan](https://www.revenuecat.com/pricing) 1. Airship — Must include messaging * **Airship project** * The Airship SDK must use the same user identity as the RevenueCat SDK. ## Configuring the RevenueCat Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **RevenueCat**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) and an authentication token. RevenueCat uses the token to communicate with your project in Airship. * Configure the Airship integration in RevenueCat. For additional detail, see [RevenueCat's documentation](https://docs.revenuecat.com/docs/airship). # Salesforce Marketing Cloud > Leverage Airship from within Salesforce Marketing Cloud. Companies engage with their users to deliver positive brand experiences, support their business goals, and build long-term relationships. You can coordinate all your engagement campaigns within the Salesforce Marketing Cloud (SFMC) Journey Builder. And you can consume Airship's events in SFMC, adding Airship-gathered engagement data to your CRM system. ![Salesforce Marketing Cloud integration uses](https://www.airship.com/docs/images/sfmc-benefits_hu_f42e76b44600070c.webp) *Salesforce Marketing Cloud integration uses* ## Inbound integration When you integrate Airship into SFMC's Journey Builder, you can send Airship App, SMS, and Web messages from an SFMC journey. You can also send [Wallet push notifications](https://www.airship.com/docs/guides/wallet/user-guide/notifications/push-notifications/), both to external IDs and pass IDs. * **Create a compelling campaign in minutes** — Initiate campaigns with easy-to-use tools that don't require a development team. With Airship, you can add mobile, SMS, and web messaging to any customer journey that will deliver in-the-moment value to your app audience. * **Create automated SFMC journeys triggered by cross-channel events** — Send targeted campaigns to onboard, activate, retain and re-engage your customers. Easily zero in on the insights necessary to drive targeted actions in other systems. * **Use multiple Airship projects in SFMC** — Most companies have different Airship projects for different purposes. You can add all your projects to SFMC and use them in individual campaigns. * **Add actions and extras to message payloads** — Do more with your messages by adding Actions (Deep Links, Landing Pages, Tagging, etc.) and Extras (key/value pairs available to the app upon direct open). * **Re-engage users** — Use cross-channel marketing to re-engage users when they uninstall your app or convert on their mobile device or web browser. For additional uses, see [Using the inbound integration with SFMC journeys](#using-the-inbound-integration-with-sfmc-journeys) below. ### Integration requirements This integration is fairly flexible in terms of audience mapping. In the context of an individual Airship Activity, you can target an audience using either: * A value from the Journey's Entry Source — This can be either a [Named User](https://www.airship.com/docs/reference/glossary/#named_user) or [Channel ID](https://www.airship.com/docs/reference/glossary/#channel_id) * The Named User associated with the subscriber from the project configuration Named Users map IDs from your CRM or another backend system (like SFMC) to device IDs. The Named User IDs you set must map to a data extension in SFMC. Airship cannot target devices if you do not set Named Users appropriately. See [Associating Channels with Named Users](https://www.airship.com/docs/guides/audience/named-users/#associate) in the *Named Users* guide to set the Named User ID for a device via the iOS SDK, Android SDK, or the server-side API. See [Intro to Channels](https://www.airship.com/docs/guides/getting-started/developers/channels-intro/) for details about Channel IDs. ### Configure Airship in SFMC The steps for configuring Airship in SFMC are provided in the Airship dashboard: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Salesforce Marketing Cloud**. If the SFMC tile is not visible, please fill out our [interest form](https://www.airship.com/lp/airship-sfmc-integration/). 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Tag Group](https://www.airship.com/docs/reference/glossary/#tag_group) `sfmc-integration` and an authentication token. All tags set from Salesforce appear in this tag group, and it used to reference Salesforce tags in the API. SFMC uses the token to communicate with your project in Airship. * Configure the Airship integration in SFMC. ### Add Airship projects to SFMC After configuring Airship in SFMC, add your Airship projects to SFMC. You can select the project that you want to send messages from when configuring activities in SFMC journeys. In SMFC: 1. Hover over **AppExchange** and select **Airship**. 1. Select **New Project** or select the edit icon ( ) to edit the settings for an existing Airship project. ![Adding an Airship project to SFMC](https://www.airship.com/docs/images/salesforce-config.2_hu_c64253cd79ddb7cb.webp) *Adding an Airship project to SFMC* 1. Configure for the project: | Field | Description | Steps | | --- | --- | --- | | **Project** | The name of your Airship project | Enter the project name. | | **App Key** | Your Airship project app key. You can find this in your Airship project in **Settings**. | Enter the app key. | | **Auth Token** | The auth token you created when [configuring Airship in SFMC](#configure-airship-in-sfmc) | Enter the auth token. | | **Email Address** | The address where SFMC should send notifications about send issues | Enter an email address. | | **Contact Attributes** | The field in your Data Extension External Key that you want to map to your Airship Named Users | Navigate to the data extension containing the field you want to map. In **Named User**, select the field.

Data extensions are displayed as they are represented in your SFMC Attribute Groups. If you need assistance locating the field, contact your SFMC administrator. | | **Wallet Config (Optional)** | Enables including Airship [Wallet push notifications](https://www.airship.com/docs/guides/wallet/user-guide/notifications/push-notifications/) in an SFMC journey | See [Enable sending Airship Wallet push notifications](#enable-sending-airship-wallet-push-notifications). | {class="table-col-1-20 table-col-2-40"} 1. Select **Add Project**. ### Enable sending Airship SMS messages To support including Airship SMS messages in an SFMC journey, you must add your Airship [Sender IDs](https://www.airship.com/docs/reference/glossary/#sender_id) to SFMC. You add a sender ID to SFMC by entering a name and its Airship long code or short code. Do this after you add your Airship project to SFMC. If you do not know your long or short codes, you can find them in the Airship dashboard: 1. Select the **Messages** menu, then **SMS Keywords**. 1. Select ** Create new keyword**. 1. Select **Settings**, then the **SMS Sender** menu. You will see all the long codes and short codes for your project. Each sender in the list is formatted as a 2-character country code followed by the actual long or short code. 1. Note the long and short codes, then leave the page without saving a new keyword. If you do not have access to the Airship dashboard, [contact Airship Support](https://support.airship.com) to request the codes. --- Add Airship sender IDs to SFMC: 1. Hover over **AppExchange**, then select **Airship**. 1. Select the edit icon ( ) for the project you want to add your sender IDs to. 1. Under **SMS Sender**, select **Add SMS Sender** and configure for each sender you want to add: | Field or setting | Description | Steps | | --- | --- | --- | | **Name** | Required. A descriptive name for the sender that will help you identify it in Salesforce. | Enter a name. | | **Number** | Required. The long code or short code you want to send messages from. | Enter a long or short code. | | **Enable MMS** | Optional. Allows sending MMS messages in your SFMC Journey Builder. | Check the box to enable. | 1. Select the plus icon (). ### Enable sending Airship Wallet push notifications To support including Airship [Wallet push notifications](https://www.airship.com/docs/guides/wallet/user-guide/notifications/push-notifications/) in an SFMC journey, you must add your Airship Wallet project credentials to an SFMC project that is also configured for messaging. You can add or remove these credentials from SFMC at any time. When present, the Wallet channel will be available when [including an Airship message in an SFMC journey](#include-an-airship-message). First, get your credentials from your Airship Wallet project: 1. Go to **Settings**, then **API**. 1. Copy your Wallet API key and secret. Now you can add them to an SFMC project: * If you are setting up a new project, follow the steps in [Add Airship projects to SFMC](#add-airship-projects-to-sfmc) and enter your credentials in the **Wallet Config** section. * To add your credentials to an existing project in SFMC: 1. Hover over **AppExchange**, then select **Airship**. 1. Select the edit icon ( ) for the project you want to enable for sending Wallet push notifications. 1. Under **Wallet Config**, enter your API key and secret. 1. Select **Save Project**. ## Using the inbound integration with SFMC journeys In addition to sending Airship App, SMS, and Web messages from an SFMC journey, you can: * Send Custom Events from an SFMC journey to Airship * Personalize messages and Custom Events with information from your SFMC Contacts model * Set tags on Named Users that you can use for tracking or to trigger automation When you install the Airship AppExchange package as part of the integration setup, two activities are automatically added to your Journey Builder: * Message activity — *Airship Notification* * Custom — *Airship Events/Tags* You will use these activities in the following steps. ### Include an Airship message Include Airship App, Web, and SMS messages to SFMC journeys. You must set up messages per channel in individual activities, but message types per channel can be combined. For example, you can set up a push notification and an in-app message in a single Mobile App activity. In SFMC: 1. Go to **Journey Builder**, then **Journey Builder**. 1. Select an existing journey or select **Create New Journey**. 1. In the left sidebar, go to **Activities**, then **Messages**, then drag the **Airship Notification** activity into your journey. ![Adding an Airship Notification activity to a journey](https://www.airship.com/docs/images/integrations/sfmc-activity-mobile_hu_f5b95b09160e7d9b.webp) *Adding an Airship Notification activity to a journey* 1. Select the **Airship Notification** activity in the journey. 1. Select a configuration section from sidebar and configure the message: * **Project**: Select the Airship project you want to send the message from. * **Channel**: Select an engagement channel for the message: Mobile App, Web, SMS, MMS, or Wallet. For Mobile App, also select a message type: Push Notification, In-App Message, or both. For SMS and MMS, also select a [sender](#enable-sending-airship-sms-messages). By default, audience members are targeted using Contact Data as configured for the project. To target using Entry Source data instead, select **Entry Source**, and then select a field and type. You must already have an Entry Source configured for the journey. * **Content**: Enter the text to display in the message. For Mobile App, when you combine a push notification and in-app message, the in-app message's alert text is the same as the push notification text by default. To use different messages, under **In-App Message**, select **Write Alternative**, then enter message text. For Wallet, when using an external ID as the audience identifier, a template ID is required. Template IDs can be found in a Wallet project dashboard under **Templates**. All other Content settings are optional: | Setting | Description | Steps | | --- | --- | --- | | **Title** | For Mobile App push notifications and Web only. A heading that appears above the notification text.

For push notifications, it appears in the iOS Notification Center, Apple Watch Looks, and the Android and Fire OS Notification Area/Drawer.

For Web, the title entered here overrides [the default set in Airship](https://www.airship.com/docs/developer/sdk-integration/web/getting-started/#airship-setup) and appears in the iOS Notification Center and Android and Fire OS Notification Area/Drawer. | Enter text. | | **Label** | For Wallet push notifications only. A description of the notification. The label is for reference only, it is not included in the push notification. | Enter text. | | **Media** | For Mobile App, Web, and MMS only. Media to display in your message. See [Media guidelines](https://www.airship.com/docs/reference/messages/media-guidelines/). | Enter an HTTPS URL. | | **Notification Buttons** | For Mobile App and Web only. Interactive buttons that appear after the message text. You can select from [predefined interactive buttons](https://www.airship.com/docs/reference/messages/built-in-interactive-notifications/) and configure adding or removing tags when the button is selected. Some buttons also require setting an [Action](https://www.airship.com/docs/reference/glossary/#action): Home, Web Page, or Dismiss. | Select and configure buttons. See also [Actions](https://www.airship.com/docs/guides/messaging/messages/actions/). | | **Shorten Links** | For SMS and MMS only. Enables [Link Shortening](https://www.airship.com/docs/reference/glossary/#sms_link_shortening). | Check the box to enable. | | **SMS Fallback Text** | Recommended, for MMS only. Users who cannot receive your MMS message will receive an SMS message with this text along with the media URL, if any. 160 characters maximum. | Enter text. | | **Action** | For Mobile App and Web only. The Home, Web Page, Landing Page, Deep Link, or Share [Action](https://www.airship.com/docs/reference/glossary/#action). You can also add or remove [Tags](https://www.airship.com/docs/reference/glossary/#tag) and set key value pairs ([Custom Keys](https://www.airship.com/docs/reference/glossary/#custom_keys) in Airship) for users who interact with the message. | Select and configure an action. Follow the steps in [Actions](https://www.airship.com/docs/guides/messaging/messages/actions/). For tags, enter a tag name, select the plus icon ( ), then select **Add** or **Remove**. For key value pairs, enter the key name and value, then and select the plus icon ( ). | | **Campaigns1** | Tracks the message in Airship using [Campaign Categories](https://www.airship.com/docs/reference/glossary/#campaign_categories). Each category has a 64-character maximum. 10 maximum categories. | Enter categories. | {class="table-col-2-50"} 1. In addition to Campaign Categories you add, Airship automatically adds two to each send from SFMC: the ID of the SFMC Journey and the ID of the activity in the Journey. 1. Select **Review** to view a summary of the activity and a preview of your message. 1. Select **Done** to save the activity. ### Send Custom Events to Airship You can send [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) from an SFMC journey to Airship for triggering, segmentation, and reporting. When you set up a Custom Event in your journey, you can determine the properties that you want to send with the event. The event name appears in the `body.name` of the Custom Event that SFMC sends to Airship, and its properties appear in the Custom Event's `body.properties` object. Issue a Custom Event to Airship as a part of a Salesforce journey: 1. Go to **Journey Builder**, then **Journey Builder**. 1. Select an existing journey or select **Create New Journey**. 1. In the left sidebar, go to **Activities**, then **Custom**, then drag the **Airship Events/Tags** activity into your journey. 1. Select the **Airship Events/Tags** activity in the journey. 1. Select the Airship project you want to send the Custom Event to. 1. For **Audience Trigger**, select **Custom Event**.

By default, audience members are targeted using Contact Data as configured for the project. To target using Entry Source data instead, select **Entry Source**, and then select a field and type. You must already have an Entry Source configured for the journey. 1. Select **Custom Event** in the sidebar or scroll down to its section, then enter an event name in snake case. Example: `hot_sauce`. Event names cannot contain uppercase characters. 1. Select **Add Property**, then enter a property name in snake case, and enter a value for the property and select its type. You can add up to 10 properties. Select **Add Another Property** for more properties. 1. Select **Done**. ### Personalize custom events and messages To personalize Airship activities, create a merge field representing a value you want to personalize, surrounded by double percent signs, e.g., `%%customer_name%%`. Airship replaces the merge field (and braces) with the data specified by the merge field at send time — just like mail merge in a word processor or mail client. Use the fields in your Salesforce Contacts model that are linked by Attribute Group (Attribute Sets). For example, if you have a field called `customer_name`, you could use the value from that field in your Custom Event with `%%customer_name%%`. If you have multiple fields in the model with the same name, reference the data extension name to select the correct field, using the format `%%data_extension_name.field_name%%`. > **Note:** The support of AMPScript syntax is limited. You may use it for referencing fields by name, but program logic control structures, such as *if* statements or function calls, are not supported. > **Important:** Data that is available for personalization is tied to the audience being used in the activity. If the audience is Contact Data (the default), use Contact Attributes to personalize. Since the audience is linked to a Subscriber in that case, any Contact Attribute linked to that Subscriber should be available for personalizing messages and Custom Events. If the audience is Entry Data, there's no guaranteed notion of associated Subscriber, so in that case you can only use fields in the Entry Source for personalization. ### Add or remove tags You can add tags to, or remove tags from, Named Users as they progress through a Salesforce journey. Setting tags on your audience results in `tag_change` events in Airship that you can use as message triggers or to track changes to your audience. All tags set from Salesforce appear in the Airship tag group `sfmc-integration` that is automatically created when [configuring Airship in SFMC](#configure-airship-in-sfmc). Set tags in Airship as a part of a Salesforce journey: 1. Go to **Journey Builder**, then **Journey Builder**. 1. Select an existing journey or select **Create New Journey**. 1. In the left sidebar, go to **Activities**, then **Custom**, then drag the **Airship Events/Tags** activity into your journey. 1. Select the **Airship Events/Tags** activity in the journey. 1. Select the Airship project containing the audience you want to set tags on. 1. For **Audience Trigger**, select **Tag Change**.

By default, audience members are targeted using Contact Data as configured for the project. To target using Entry Source data instead, select **Entry Source**, and then select a field and type. You must already have an Entry Source configured for the journey. 1. In the **Set Tags** field, enter the name of the tag that you want to set or remove, select the plus icon (), then select **Add** or **Remove** as the action. Repeat this step for each tag. ![Setting tag change actions in an SFMC journey](https://www.airship.com/docs/images/sfmc-tag-change_hu_41058278cdda991d.webp) *Setting tag change actions in an SFMC journey* 1. Select **Done**. ## Outbound integration > **Important:** This integration is not recommended for real-time workflows, as there are many factors that can limit the speed of updates. Send events from Airship to SFMC using [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) to incorporate your audience's message activities into your CRM environment. * **Track Airship user engagement in Salesforce** — Understand and leverage how and when your users are using (or not using) your app in the Marketing Cloud interface. * **Trigger SFMC journeys from Airship engagement events** — Take advantage of Airship's Real-Time Data Streaming events in SFMC to trigger new journeys and keep your audience engaged. ### Configure your SFMC account You need your SFMC API account credentials, SOAP WSDL URL, and MID when configuring the integration in Airship. If these items are not available to you, contact your SFMC admin. Complete the following steps in SFMC: 1. Create an **API account username and password**: 1. Select your username in the upper right corner, then select **Setup**. 1. In the sidebar, select **Administration**, then **Users**, then **Users**. 1. Select **Create** and fill in the user information. **Make sure to check the box for *API User*.** 1. Select **Save**. 1. **Set permissions for the API user account**: These permissions can also be set by a role assigned to the user account. 1. Select your username in the upper right corner, then select **Setup**. 1. In the sidebar, select **Administration**, then **Users**, then **Users**. 1. Check the box for the API user account and select **Manage Roles**. 1. Select **Edit Permission** and expand the **Email** section. 1. Navigate to each section and set each permission to Allow: | Section path | Permission | | --- | --- | | Email » Subscribers » Data Extension | Create | | Email » Subscribers » Data Extension | View | | Email » Subscribers » Data Extension | Update | | Email » Subscribers » Data Extension | Manage Data | | Email » Admin » API Access | Webservice API | 1. Select **Save**. 1. Verify **web services permissions** for the Business Unit: 1. Select your username in the upper right corner, then select **Setup**. 1. In the sidebar, select **Security**, then **Security Settings**. 1. Under **Username and Logins**, verify that **Enable Username and Password for Web Services** is set to Yes. If not, contact your SFMC admin. 1. Get your **SOAP WSDL URL**: 1. Select your username in the upper right corner, then select **Setup**. 1. In the sidebar, select **Settings**, then **Company Settings**, then **Account Settings**. 1. In **General Settings**, copy the SOAP WSDL URL. 1. Get your **Marketing Cloud Member ID (MID)**: Hover over the Business Unit name (it's to the left of your username) and copy the MID from the modal that appears: ![ Finding your Salesforce Marketing Cloud Member ID (MID)](https://www.airship.com/docs/images/salesforce-mid_hu_2f7fbfb6ee615c09.webp) * Finding your Salesforce Marketing Cloud Member ID (MID)* ### Configure SFMC in Airship In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Salesforce AppExchange**. 1. Follow the onscreen instructions to configure the integration to: * Enter [your SFMC API account credentials, SOAP WSDL URL, and MID](#configure-your-sfmc-account) * Select the Airship event types you want to send to SFMC > **Tip:** You can configure different Airship project RTDS data to route to specific Business Units in SFMC by using the MID for the specific Business Unit in the RTDS configuration. It's also possible to use a single MID for all Airship projects, which will share Data Extensions. This is feasible because the App Key is included in the Data Extensions. ### Data extensions and storage location A short time after completing integration configuration, the folder /airship will be automatically created in your Data Extensions root folder. Do not create this folder manually. The folder will contain data extensions representing the Airship event types you selected when setting up the integration. Unlike other event types, Airship `tag_change` events are represented by two data extensions: TAG_CHANGE_EVENTS and TAG_ACTION_EVENTS. The TAG_ACTION_EVENTS data extension lists added and removed tags. See [SFMC Data Extension Schemas for RTDS](https://www.airship.com/docs/integrations/salesforce-schemas/). > **Important:** 1. **DO NOT EDIT** Data Extensions, or you may break your integration. > 1. In order to prevent data loss, integrations require a data retention policy for all > Salesforce Data Extensions created in the /airship folder. > > See Salesforce documentation for more information about how to set up a data retention policy: > > * [Manage Data Retention Policy](https://help.salesforce.com/articleView?id=sf.mc_cab_manage_data_retention_policy.htm) > * [Manage Contact Data](https://trailhead.salesforce.com/en/content/learn/modules/marketing-cloud-contact-management/manage-contact-data) # Salesforce Data Cloud > Share data between Airship and Salesforce Data Cloud using out-of-the-box tools on both platforms. Salesforce Data Cloud is a real-time data platform that helps you unify, harmonize, and activate customer data across your organization. You can share data between Airship and Salesforce Data Cloud using native integration capabilities on both platforms without requiring custom development or third-party tools. This guide covers bidirectional data flow: * **From Salesforce Data Cloud to Airship** — Import customer data from Salesforce Data Cloud using SFTP to enrich your Airship [Attributes](https://www.airship.com/docs/reference/glossary/#attributes). * **From Airship to Salesforce Data Cloud** — Export Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) event data to Salesforce Data Cloud using the Data Export integration with Amazon S3 storage. ## Import to Airship You can import customer data from Salesforce Data Cloud into Airship using SFTP. This enables using Salesforce Data Cloud data for audience targeting and personalization in your Airship messaging campaigns. 1. **Set up Attributes** — In Airship, create the necessary [Attributes](https://www.airship.com/docs/reference/glossary/#attributes) that will receive the data from Salesforce Data Cloud. See the [Attributes guide](https://www.airship.com/docs/guides/audience/attributes/) for details. 1. **Configure SFTP in Airship** — Airship's SFTP implementation uses SSH key pairs for authentication. You must create a pair of keys: a private key for your client and a public key for Airship. Follow the steps in [Generate keys](https://www.airship.com/docs/guides/audience/segmentation/sftp-upload/#generate-keys) and [Add your public key to Airship](https://www.airship.com/docs/guides/audience/segmentation/sftp-upload/#add-your-public-key-to-airship) in *SFTP upload for CSV files*. Make sure to set the Purpose to `Attributes`, and note the host, port, and username for use in the next section. 1. **Create a Data Lake Object** — In Salesforce Data Cloud, create a Data Lake Object (DLO) that matches the CSV structure required by Airship: 1. Go to **Data Cloud**, then **Data Streams**. 1. Create a new Data Lake Object. * Configure the schema to match your Airship Attributes. * You must include a column for the channel identifier and one column for each Attribute. The identifier can be a [Channel ID](https://www.airship.com/docs/reference/glossary/#channel_id), [Named User](https://www.airship.com/docs/reference/glossary/#named_user), or email address. * Ensure field names match the Attribute keys defined in Airship. * For more information, see [Attributes CSV format](https://www.airship.com/docs/reference/messages/csv-formatting/#attributes) in the *CSV Formatting Reference*. * Configure the output format as CSV. * Set up SFTP as the destination using your credentials from Airship. * Schedule the data export frequency based on your requirements. 1. **Verify data import** — Verify that data is being successfully imported into Airship: 1. Go to **Audience**, then **Attributes**. 1. Check that Attribute values are being populated for your audience. Monitor your SFTP logs in Salesforce Data Cloud for delivery issues. ## Export to Salesforce Data Cloud You can export Airship event data to Salesforce Data Cloud using the [Data Export](https://www.airship.com/docs/integrations/data-export/) integration with Amazon S3 as the destination. This provides hourly batches of structured [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) data that Salesforce Data Cloud can ingest. [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) is required for this integration. Before configuring the integration, you must set up a storage location: 1. Create an Amazon S3 bucket that will serve as the intermediate storage for Airship data. 1. Configure IAM credentials with write access to the S3 bucket. Follow [Amazon's documentation: Managing access keys](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey). 1. Grant Salesforce Data Cloud read access to the S3 bucket. Follow [Salesforce documentation on S3 data sources](https://developer.salesforce.com/docs/data/data-cloud-int/guide/c360-a-awss3-bucket-policies.html). Next, complete the integration steps: 1. **Configure Data Export in Airship** — Set up the Data Export integration to send event data to your S3 bucket: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Data Export**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Select **Amazon S3** as your storage provider. * Enter your AWS access key ID and secret access key. * Select your AWS region. * Enter your S3 bucket name. * Select **Simplified** as the [file layout](https://www.airship.com/docs/integrations/data-export/#structure-and-files). This structure works well with Salesforce Data Cloud ingestion. * Select the Airship events to send to Salesforce Data Cloud. * Configure options: * Specify a folder path. * Enable compression to save storage space. * Enable server-side encryption. After completing configuration, it may take several minutes to begin populating events. Files will be generated hourly for each event type, following this pattern: > [folder_path]/appKey/integrationId/eventType/YYYY_MM_DD_HH_mm_ss.csv 1. **Create Data Lake Objects** — For each Airship event type you selected for export, create a corresponding Data Lake Object in Salesforce Data Cloud: 1. Navigate to **Data Cloud**, then **Data Streams**, and create a new Data Lake Object. 1. Configure the DLO to match the schema of the Airship event data. See the [Snowflake integration](https://www.airship.com/docs/integrations/snowflake/) for detailed event schemas and field definitions. 1. Add the S3 bucket and folder path as a source for the DLO. 1. Configure the ingestion schedule. Hourly is recommended to align with Airship's export frequency. 1. Create field mappings between the CSV columns and the DLO fields. Creating DLOs and mappings is a one-time setup exercise. Once configured, new data will automatically flow from Airship to Salesforce Data Cloud as events occur. 1. **Verify data export** — Monitor the integration to ensure data is flowing correctly: 1. In your S3 bucket, verify that CSV files are being created hourly in the expected folder structure. 1. In Salesforce Data Cloud, check the Data Stream status and verify that data is being ingested successfully. 1. Review any ingestion errors in Salesforce Data Cloud and adjust field mappings if necessary. # Export Lists from Salesforce Marketing Cloud > Export lists of users or Attributes from Salesforce Marketing Cloud to Airship. You can turn a Salesforce Marketing Cloud (SFMC) audience into an Airship [Uploaded (Static) List](https://www.airship.com/docs/reference/glossary/#uploaded_list). You can also send SFMC Text, Number, and Date [Attributes](https://www.airship.com/docs/reference/glossary/#attributes) to Airship for personalization and targeting. Even better, you can automate the exports to save time. This document walks you through creating an SFMC Data Extension, creating keys and configuring SFTP for the file transfer, creating SFMC activities that perform the data extraction and file transfer, and automating the tasks. ## Creating the Data Extension Your SFMC data will be converted to CSV format before transfer to Airship. The structure of your Data Extension table defines the CSV. ### Formatting for Static Lists For Static Lists, your Data Extension must contain a [Named User](https://www.airship.com/docs/reference/glossary/#named_user) value for each audience member. Configure your Data Extension with these two fields: | Field name | Value | | --- | --- | | **Identifier type** | `named_user` | | **Named User** | The ID string that represents the user in Airship | Each row of the CSV will contain an `Identifier type, Named User` pair. However, the field names you enter in your Data Extension do not matter since they are omitted when the CSV is created. Example conversion to CSV: ```text named_user,customer-009842 named_user,customer-277099 ``` ### Formatting for Attributes For Attributes, configure your Data Extension with a field named `named_user` and an additional field for each Attribute to associate with the Named User: | Field name | Value | | --- | --- | | **named_user** | The ID string that represents the user in Airship | | **<attribute_id>** | The Named User's data in [Text, Number, or Date format](https://www.airship.com/docs/guides/audience/attributes/about/#attribute-types), depending on the Attribute type | The Data Extension field names are used as the header row in the CSV, so you must enter the them exactly. Subsequent rows list a Named User ID and the value of each Attribute for that user. Example conversion to CSV: ```text named_user,first_name,last_name customer-009842,Freddy,Shoop customer-059874,Denise,Green customer-277099,Francis,Gremp ``` > **Important:** You must [define custom Attributes or add predefined Attributes in Airship](https://www.airship.com/docs/guides/audience/attributes/adding/) before associating them with Named Users. Using a custom or predefined Attribute that you haven't yet set up in the Airship will result in an error. ## Setting up file transfer requirements Airship's SFTP implementation uses SSH key pairs for authentication. You must create a pair of keys: a private key for your client and a public key for Airship. Then you can add the keys to Airship and SFMC and create a storage location to transfer your file from. In Airship: 1. Follow the steps in [Generate keys](https://www.airship.com/docs/guides/audience/segmentation/sftp-upload/#generate-keys) in *SFTP upload for CSV files*. 1. Follow the steps in [Add your public key to Airship](https://www.airship.com/docs/guides/audience/segmentation/sftp-upload/#add-your-public-key-to-airship) in *SFTP upload for CSV files*. * Making sure to set the Purpose to `Static Lists` or `Attributes`, depending on your list type. * Note the host, port, and username for use in the following SFMC steps. In SFMC: 1. Create an SSH encryption key. Follow the steps in Salesforce's [Create an Encryption Key for Marketing Cloud](https://help.salesforce.com/s/articleView?id=sf.mc_overview_create_a_key.htm&type=5). Since it is for file transfer activities, make sure to use the private key of the key pair generated using the Airship steps above. 1. Create an External SFTP Site [File Location](https://help.salesforce.com/s/articleView?language=en_US&id=sf.mc_overview_file_locations.htm&type=5). Follow the steps in Salesforce's [Set Up an External FTP, SFTP, or FTPS Site File Location](https://help.salesforce.com/s/articleView?id=sf.mc_overview_set_up_external_ftp_location.htm&type=5) using the stored key from the previous step as well as the host, port, and username provided by Airship. See also [Set up your client and transfer CSVs](https://www.airship.com/docs/guides/audience/segmentation/sftp-upload/#set-up-your-client-and-transfer-csvs) in *SFTP upload for CSV files*. ## Setting up data extraction and transfer Set up SFMC tasks that extract the data from the Data Extension, format it, and transfer it to your SFTP File Location. Follow the steps in the following two Salesforce documents: 1. [Data Extension Extract in Automation Studio](https://help.salesforce.com/s/articleView?id=sf.mc_as_data_extension_extract.htm&type=5) For Static Lists: * The file name entered will be the name of the Uploaded/Static list in Airship. * Be careful about using wildcard dates. They could result in exceeding the 100 list per project limit. * Use a comma as the column delimiter. * Leave **Has Column Headers** unselected. * Select **Uses Line Feed**. For Attributes: * The file name is not used anywhere in Airship, only in the File Transfer activity. * Use a comma as the column delimiter. * Select **Has Column Headers**. * Select **Uses Line Feed**. 1. [Create a File Transfer Activity in Automation Studio](https://help.salesforce.com/s/articleView?id=sf.mc_as_use_a_data_extract_activity.htm&type=5) * Use the same file naming pattern as the Data Extension Extract. * Select file action **Move a File From Safehouse**. This is where the files will be when the previous activity completes. * For **Destination**, select your previously created External SFTP Site File Location. * Do not encrypt. ## Automating the flow The final step is using SFMC's [Automation Studio](https://help.salesforce.com/s/articleView?id=sf.mc_as_automation_studio.htm&type=5) to automate running, in order, the two tasks created in the previous step. ## Verifying transfer After running the automation, verify it was successfully transferred. * For Static Lists, select the **Audience** menu, then **Lists**. You should see your list in **Uploaded Lists** with more than zero entries. * For Attributes, select the **Audience** menu, then **Attributes**, then **Upload History**. For more information, see [Viewing Attributes upload history](https://www.airship.com/docs/guides/audience/attributes/managing/#viewing-upload-history) in *Managing Attributes*. ## Targeting users You can now use the transferred data for targeting. See: * [Using Uploaded Lists](https://www.airship.com/docs/guides/audience/segmentation/audience-lists/uploaded/#using-uploaded-lists) * [Targeting your audience using Attributes](https://www.airship.com/docs/guides/audience/attributes/targeting/) * [Segments](https://www.airship.com/docs/guides/audience/segmentation/segments/) # Segment > Use Segment to combine data across applications and platforms. Segment is a Customer Data Platform (CDP) that lets you combine data across applications and platforms. Send Airship events to Segment for profile enrichment and event triggering (Airship as a source), and ingest external events from Segment with Named Users in Airship for email and SMS registration, message triggering, audience targeting, and analytics (Airship as a destination). > **Note:** This page is for the integration based on Segment's Actions Framework, which provides flexibility by allowing Segment Events and their data to be mapped to Airship [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event), [Attributes](https://www.airship.com/docs/reference/glossary/#attributes), or [Tags](https://www.airship.com/docs/reference/glossary/#tag) based on workflows and requirements. > > We have also have a **legacy** destination/inbound integration. See: [Segment Legacy Destination Integration](https://www.airship.com/docs/integrations/segment/). ## Segment integration requirements * **Accounts** 1. Segment 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for source/outbound integration only* * **Airship project** * [Named User](https://www.airship.com/docs/reference/glossary/#named_user) must be enabled for your project. ## Source integration The Segment source integration sends Airship events to Segment. To properly feed events into, and associate events with, Segment profiles, you must map `named_user_id` to Segment profile `userId` properties. ### Configuring the Segment source integration To configure the integration, first you will add Airship to Segment as a source and retrieve your *Write Key*. Then you will create a Real-Time Data Stream integration for Segment in Airship. In Segment: 1. Go to **Catalog**. 1. Find the Airship source and select **Add Source**. 1. Add a name and optional labels for your source integration, then select **Add Source**. 1. Copy the **Write Key**. You will use this token when enabling your Segment integration in Airship. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Segment**. 1. Follow the onscreen instructions to configure the integration.

You have the option to include anonymous data. Enable this if you want to send events that are not attributed to a Named User to Segment. This can increase the number of customer profiles and the cost of using Segment.

By default, custom events that are sent from Segment to Airship are excluded from being sent back to Segment. If you would prefer to receive these events, [contact Airship Support](https://support.airship.com). It may take several minutes to begin populating events in Segment. You can open the Airship source in Segment and use the Debugger option to see incoming data and confirm that your integration is working properly. ## Destination integration This Segment destination integration uses the [Segment Actions framework](https://segment.com/docs/connections/destinations/actions/) to map Segment events of all types to Airship Custom Events, Attributes, and Tags. It can also be used to register email addresses and SMS [MSISDNs](https://www.airship.com/docs/reference/glossary/#msisdn) as well as associate them with Named Users. There are predefined mappings for the Segment Actions *Set Attributes*, *Custom Events*, and *Register and Associate*. The Named User defaults to `userId`. You can customize these mappings and also manually map the *Manage Tags* actions. ### Configuring the Segment destination integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Segment**. 1. Select **Configure** for the destination integration and follow the onscreen instructions to: * Create [Tag Group](https://www.airship.com/docs/reference/glossary/#tag_group), [Attributes](https://www.airship.com/docs/reference/glossary/#attributes), and an authentication token. Segment uses the token to communicate with your project in Airship. * Configure Airship as a destination in Segment. You must select the Airship Actions integration, not the Airship integration. ### Custom Events The default trigger for the Custom Events Action is the `Track` event type. This, like the rest of the mappings, is configurable in Segment to suit your requirements. ![The default trigger mapping for the Segment Action Custom Events](https://www.airship.com/docs/images/integrations/segment/segment-custom-event-default-type_hu_e50bd5aa4775cc41.webp) *The default trigger mapping for the Segment Action Custom Events* Airship Custom Events must have an Audience (Named User), an Occurred Time, and a Name. These default to `userId`, `timestamp`, and `event`. Feel free to modify, but note that they must exist and be valid. Custom Events can also (optionally) have properties, and these default to items in the `properties` object. ![Mapping the Custom Events Action in Segment](https://www.airship.com/docs/images/integrations/segment/segment-custom-event-default-mappings_hu_9332a140d8de3238.webp) *Mapping the Custom Events Action in Segment* **Example `track` event from Segment** ```json { "receivedAt": "2019-07-09T19:24:15Z", "messageId": "6dJnUw1OKG", "type": "track", "properties": { "provider": "Branch", "campaign": { "source": "AdWords", "name": "Campaign Name", "content": "Organic Content Title", "ad_creative": "Red Hello World Ad", "ad_group": "Red Ones" }, "categories": ["test-campaign"] }, "event": "Install Attributed", "userId": "sKQR2ORpaw", "timestamp": "2019-07-09T19:24:15Z" } ``` **Example Custom Event in Airship** ```json { "occurred": "2019-07-09T19:24:15", "user": { "named_user_id": "sKQR2ORpaw" }, "body": { "name": "install attributed", "interaction_type": "cdp", "properties": { "provider": "Branch", "campaign": { "source": "AdWords", "name": "Campaign Name", "content": "Organic Content Title", "ad_creative": "Red Hello World Ad", "ad_group": "Red Ones" }, "categories": ["test-campaign"], "source": "Segment" } } } ``` > **Note:** * Airship transforms all custom event names to lowercase. In the following > example, note that the value of `event` appears as *Install Attributed* for > Segment while in Airship it is recorded as *install attributed* in the `name` > attribute. > > * Events from Segment are sent as server-side events, which cannot be used to trigger an [In-App Automation](https://www.airship.com/docs/reference/glossary/#iaa) or [Scene](https://www.airship.com/docs/reference/glossary/#scene). ### Manage Tags For the Manage Tags Action, you must manually map Segment event objects to Airship tags. When mapping, the tag names default to `traits.airship_tags`. Change these to whatever is relevant, noting that values must be boolean. The integration uses the `segment-integration` Airship tag group, which is created automatically when you configure the integration in the Airship project settings. You can use a different tag group that better fits your use case, but the examples on this page refer to `segment-integration`. This integration supports boolean properties only. Airship adds or removes its key as a tag in the `segment-integration` tag group depending on the boolean value. Airship adds tags for properties that are `true` and removes tags for properties that are `false`. **Example Segment Identify Event** ```json { "userId": "jane", "type": "identify", "timestamp": "2019-06-12T22:21:33Z", "traits": { "airship_tags": { "new-customer": false, "order-completed-last-60-days": true } } } ``` **Example Airship Tag Change event** ```json { "id": "00000170-cff9-7e5e-6a5a-21814f6b3a37", "offset": "1000031868729", "occurred": "2019-06-12T22:21:33Z", "processed": "2019-06-12T22:21:33Z", "device": { "named_user_id": "jane" }, "body": { "add": { "segment-integration": ["order-completed-last-60-days"] }, "remove": { "segment-integration": ["new-customer"] } }, "type": "TAG_CHANGE" } ``` ### Set Attributes The default trigger for the Set Attributes Action is the `Identify` event type, but you can change it in Segment. ![The default trigger mapping for the Segment Action Set Attributes](https://www.airship.com/docs/images/integrations/segment/segment-attributes-default-type_hu_cc73de66a72f1f35.webp) *The default trigger mapping for the Segment Action Set Attributes* The integration maps [Segment reserved traits](https://segment.com/docs/connections/spec/identify/#traits) to [Airship predefined attributes](https://www.airship.com/docs/reference/data-collection/attributes/#predefined-attributes): | Segment Property | Attribute Name | Attribute ID | Attribute Type | |---|---|---|---| | `traits.address.city` | City | `city` | Text | | `traits.address.country` | Country | `country` | Text | | `traits.address.postalCode` | Zipcode | `zipcode` | Number | | `traits.address.region` | Region | `region` | Text | | `traits.age` | Age | `age` | Number | | `traits.birthday` | Birthdate | `birthdate` | Date | | `traits.company_name` | Company | `company` | Text | | `traits.account_creation` | Account Creation | `account_creation` | Date | | `traits.email` | Email Address | `email` | Text | | `traits.first_name` | First Name | `first_name` | Text | | `traits.gender` | Gender | `gender` | Text | | `traits.last_name` | Last Name | `last_name` | Text | | `traits.full_name` | Full Name | `full_name` | Text | | `traits.phone` | Mobile Phone Number | `mobile_phone` | Number | | `traits.home_phone` | Home Phone Number | `home_phone` | Number | | `traits.work_phone` | Work Phone Number | `work_phone` | Number | | `traits.title` | Title | `title` | Text | | `traits.username` | Username | `username` | Text | | `traits.loyalty_tier` | Loyalty Tier | `loyalty_tier` | Text | | `traits.altitude` | Altitude | `altitude` | Number | | `traits.longitude` | Longitude | `longitude` | Number | | `traits.latitude` | Latitude | `latitude` | Number | | `context.device.advertisingId` | Advertising ID | `advertising_id` | Text | The following example `identify` call assigns attributes to the Named User `jane`. In this example, `age` maps to a predefined Airship attribute. The integration assumes that there is an attribute defined in Airship with the ID `favorite_color`. **Example Segment call** ```json { "type": "identify", "traits": { "age": 30, "favorite_color": "purple" }, "userId": "jane" } ``` For traits in the `identify` call that do not map to a predefined or customer-defined Airship attribute, you must create and enable the attribute in the Airship dashboard. Go to *Audience » Attributes* in your project. See [About attributes](https://www.airship.com/docs/guides/audience/attributes/about/) for details. ### Register and Associate The default trigger for the Register and Associate Action is the `Track` event type with an `Address Registered` event, but you can change it in Segment. ![The default trigger mapping for the Segment Action Register and Associate](https://www.airship.com/docs/images/integrations/segment/segment-custom-event-default-type_hu_e50bd5aa4775cc41.webp) *The default trigger mapping for the Segment Action Register and Associate* The main requirement for registering an email address is simply an email address. This, and most of the other channel objects default to the `properties` object. The only exception is `suppression_state` which defaults to `context.suppression_state`. If a `userId` (or alternatively mapped) value is present, the email address will be registered and associated with the Named User ID in the same trigger. If `new_email` is present, it will replace the old email address. To use [Delivery By Time Zone](https://www.airship.com/docs/reference/glossary/#delivery_by_time_zone) for email or SMS, include `timezone` as a property when registering. For email, all other registration properties are optional and mostly involve opt-in state for various features. ![Mapping the Register and Associate Action in Segment](https://www.airship.com/docs/images/integrations/segment/segment-custom-event-default-mappings_hu_9332a140d8de3238.webp) *Mapping the Register and Associate Action in Segment* **Example `track` event from Segment for email registration and Named User association** ```json { "type": "track", "properties": { "email": "floofy@kittens.org", "commercial_opted_out": "2023-08-30T22:19:03.944Z", "transactional_opted_in": "2023-08-30T22:19:03.944Z", "click_tracking_opted_in": "2023-08-30T22:19:03.944Z", "open_tracking_opted_in": "2023-08-30T22:19:03.944Z", "timezone": "PST" }, "userId": "6319ffd6-f486-4258-9e96-f256fe7c712f", "event": "Address Registered" } ``` The above call registers the email address `floofy@kittens.org` and also: * Associates the address with the Named User `6319ffd6-f486-4258-9e96-f256fe7c712f` * Opts the address in to receiving Commercial and Transaction emails * Opts the address in to tracking clicks and opens * Sets the registered email address's time zone to "PST" SMS registration works in the same way but with more limited fields. **Example `track` event from Segment for SMS registration and Named User association** ```json { "type": "track", "properties": { "msisdn": "15035551212", "sender": "12345", "opted_in": "2023-08-30T22:19:03.944Z" }, "userId": "77565D39-CF68-44AC-86C2-ACE7E8892439", "event": "Address Registered" } ``` The above call registers the SMS [MSISDN](https://www.airship.com/docs/reference/glossary/#msisdn) `15035551212`, associates it with the Named User `77565D39-CF68-44AC-86C2-ACE7E8892439`, and sets the opt-in date to `2023-08-30T22:19:03.944Z`. > **Note:** The date-times should be in ISO 8601 format. The integration will attempt to convert them to Airship-compliant values. ## Troubleshooting your Segment integration {#troubleshooting} Airship returns errors based on the events received as a part of this integration. `400` Bad Request : The call is either missing traits or traits are empty, resulting in no Airship API calls to set tags or attributes. If you don't see events in Airship and you don't see errors in Segment, make sure that your `userId` values in Segment exist as Named Users in Airship. Airship returns `200 OK` when attributing events to Named Users, even if the `named_user_id` does not exist in Airship. # Shopify > Shopify is an e-commerce platform for online stores and retail point of sale (POS) systems. Our Shopify integration enables your Shopify store for web notifications and automatically captures cart-, checkout-, and order-related events, e.g., *order fulfilled*, *checkout created*. Use these events to trigger Airship Sequences and automations in your messaging campaigns. > **Note:** The events configured for this integration are implemented as [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) in Airship. > > Custom events include additional data from Shopify--properties that can be used > to personalize messages in Airship. These include things like items in a > customer's cart, the total purchase value, customer first name, or the URL for > an abandoned cart. ## Shopify Integration Requirements * **Accounts** 1. Shopify 1. Airship — Must include messaging * **Airship project** 1. Your merchant install link. Open an [Airship Support ticket](https://support.airship.com/), to request it. Provide your merchant myshopify.com domain in your request. For example, `pint-mart.myshopify.com`. **The link expires after 7 days.** 1. Your Web SDK bundle. To download it: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Channels**, select **Web**. 1. Select **Update**, then **Download SDK Bundle**. ## Configuring the Shopify Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Shopify**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) and an authentication token. Shopify uses the token to communicate with your project in Airship. * Log in to Shopify, open your merchant install link, and install the *Automated Web Notification* app. * Upload your SDK bundle zip file. ## Configuring Notifications With the Airship SDK bundle uploaded and configured, you can now customize the user experience for customers opting in for notifications. You have multiple attributes at your disposal. In Shopify: 1. On the configuration page of the Automated Web Notification app, go to the **Opt-In Display** section and select **Add opt-in**.

In the expanded **Opt-In Display** section, you can now edit various attributes of the notification: the style of the notification (whether it should appear as a prompt or a bell), the text of the heading and text, color, and position on the screen where it should appear. 1. Select **Save** to apply your changes. > **Note:** Users trigger the prompt when they view a blog post or a product page. The > prompt displays on *checkout* or *cart* pages. The prompt disappears > after 60 seconds unless the user interacts with it. > > If the user does not choose to opt in to notifications, the prompt will be > triggered again in 2 weeks. You can adjust the timing of the re-prompt in your Shopify admin for the Automated Web Notifications app. ## Supported Custom Events Most custom events are generated via webhooks, which are sent by Shopify. In some cases, such as **shopify_cart_changed**, an event originates from the browser. The following custom events are supported: | Event Name | Action | |------------------------------------|------------------------------------------------------------------------------------------------------------------------| | **shopify_cart_changed** | A user took any action in the browser that modified the contents of or created a cart. | | **shopify_checkout_created** | A user started the checkout process for a cart. | | **shopify_checkout_updated** | A user took any action that modified the status of a checkout. Triggered as a user completes each section of checkout. | | **shopify_order_created** | A user has completed a checkout and submitted an order. | | **shopify_order_fulfilled** | A shop owner has marked an order as fulfilled. | | **shopify_order_fulfilled_update** | A shipping provider has provided a status update for an order. | # Simon Data > Unify, explore, and enable acting on all client data, leveraging existing infrastructure. [Simon Data](https://www.simondata.com) offers unified customer identity, dynamic personalized content for creating consistent experiences across all end channels, centralized orchestration, collaboration, and actionable insights. ## Simon Data Integration Requirements This integration requires these accounts: 1. Simon Data 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Configuring the Simon Data Integration You will need to know your webhook endpoint URL and any key/value pairs to add as custom headers. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Webhooks**. 1. Follow the onscreen instructions to configure the integration. See [Configuring an RTDS webhook integration](https://www.airship.com/docs/guides/reports/real-time-data-streaming/#configure-an-rtds-webhook-integration) for more information. # Snowflake > Send Airship event data to Snowflake for storage and analysis. Snowflake is a fully managed cloud-based data warehouse and analytics service for storing and analyzing data. Sending Airship data to Snowflake is a foundational framework with a structured set of schemas and a mechanism for delivering data in hourly batches to your designated cloud storage bucket. Using [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds), Airship event data is uploaded in batched CSV files to a cloud storage provider that can be configured as a Snowflake stage. Airship provides event schemas for tables that correspond to each Airship event type to make it easy to load and query your data. Copy the batched data into tables at intervals that align with your requirements. How frequently you copy the data into Snowflake is up to you and can depend on your use case. This integration gives you the flexibility to design a data pipeline that suits your specific needs and maintains the principles of data ownership and control. Your data remains yours, and you retain full authority to manage and utilize it as you see fit. This architecture empowers you to tailor your integration process while ensuring that your data remains under your control. To send Snowflake data to Airship, see [Export Lists from Snowflake](https://www.airship.com/docs/integrations/snowflake-export-lists/). To use your Snowflake data directly, without copying or importing the data into Airship, see [Zero-copy data integration](https://www.airship.com/docs/guides/features/data-integration/zero-copy-data-integration/). ## Snowflake integration requirements This integration requires these accounts: 1. Snowflake 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Configuring a cloud storage provider This integration takes Airship event data and sends it to a cloud storage destination in either [Amazon S3](https://aws.amazon.com/s3/), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs/), or [Google Cloud Storage](https://cloud.google.com/storage/) (GCS). Before setting up this integration, you must create an Amazon S3 bucket, Google Cloud Storage bucket, or Microsoft Azure container. Also, you must set credentials the integration will use to upload data to the storage location. * **Amazon S3** — Configure an IAM user and retrieve the account access keys. Follow [Amazon's documentation: Managing access keys](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey). * **Azure** — Configure an Azure connection string. Follow [Azure's documentation: Configure Azure Storage connection strings](https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string). * **Google Cloud Storage** — Create a JSON-formatted service account key with role Storage Object Creation. Follow [Create and delete service account keys](https://cloud.google.com/iam/docs/keys-create-delete) in Google's IAM documentation. ## Configuring the Snowflake integration You will need the following information about your cloud storage: * **Amazon S3** — Access key ID, secret access key, and bucket name, and AWS Region * **Azure** — Connection string and container name * **Google Cloud Storage** — Bucket name and JSON-formatted service account key In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Snowflake**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Select your storage provider and enter your credentials. For Amazon S3, you must also select your region. * (Optional) Enable compressing your data to save on storage space. * (Optional for Amazon S3) Enable encrypting your data using [server-side encryption](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html). * Select the Airship events to send to your storage location. After completing configuration, it may take several minutes to begin populating events. ## Configuring a Snowflake external stage See [Snowflake documentation](https://docs.snowflake.com/en/sql-reference/sql/create-stage.html) for steps to configure your cloud storage bucket as an external stage. ## Creating Airship tables in Snowflake Now you are ready to create a database and tables for your Airship data in Snowflake. A sample setup script and event schemas are provided below. ### Loading data in Snowflake After your data has been staged, copy your data into the Airship event tables. This can be a step in your data pipeline. You will determine which data and how frequently you want to copy events to Snowflake tables. ```sql use "DB_NAME"."AIRSHIP_EVENTS"; copy into "TAG_CHANGE" from @sample_airship_stage //validation_mode = RETURN_ERRORS file_format = airship_csv_events pattern = 'ISex_TTJRuarzs9-o_Gkhg/gcs/19c15b67-1dd5-46b9-a25a-dfbd5d60ce58/TAG_CHANGE/2022_03_31/.*[.]csv'; //[.]gz ``` ### Structure and files Your cloud storage directory structure and files will be named using this CSV pattern: > appKey + "/" + cloud provider + "/" + integrationId + "/EVENT_TYPE/" + year + "\_" + month + "\_" + day + "/" + year + "\_" + month + "\_" + day + "\_" + hour + "\_" + minute + "\_" + second + ".csv" There will be one file generated per hour, assuming a relevant event occurred within that hour. Each CSV file will also contain a header row. #### Example CSV ```csv "id","offset","occurred","processed","app_key","channel","device_type","named_user","custom_identifiers","locale_variant","locale_country_code","locale_timezone","locale_language_code","iana_timezone","app_version","device_model","connection_type","ua_sdk_version","push_opt_in","device_os","carrier","location_enabled","location_permission","background_push_enabled","web_browser_name","web_browser_type","web_browser_version","web_user_agent_string","open_platform_name","alerting","campaigns","push_id","group_id","variant_id" "f5e05251-b128-11ec-8a12-0242eb00e5a9","1000042149690","2022-03-31 19:30:02.357 +00:00","2022-03-31 19:30:14.867 +00:00","ISex_TTJRuarzs9-o_Gkhg","b1ab9a9e-9634-4fb4-875a-9a02dcd68e66","ANDROID","","","","FR","7200","fr","Europe/Paris","2022-02-09T000134-goat","VOG-L29","CELL","16.3.0","true","10","F SFR","false","NOT_ALLOWED","true","","","","","","true","","f5d2bdc0-b128-11ec-bae4-024205acadbe","ac4058f7-981b-4f0e-b9c4-8b7af3a647da","" "f8fb4df1-b128-11ec-a0e3-0242e24c72c5","1000042149691","2022-03-31 19:30:07.567 +00:00","2022-03-31 19:30:16.760 +00:00","ISex_TTJRuarzs9-o_Gkhg","b1ab9a9e-9634-4fb4-875a-9a02dcd68e66","ANDROID","","","","FR","7200","fr","Europe/Paris","2022-02-09T000134-goat","VOG-L29","CELL","16.3.0","true","10","F SFR","false","NOT_ALLOWED","true","","","","","","true","","f6586880-b128-11ec-99dd-02423b3f5d45","879056c8-0b34-4c8c-8cdc-1df4f3d40b40","" "9aa98182-e854-4fa7-9c9f-ddea2082cc4c","1000042149694","2022-03-31 19:33:51.225 +00:00","2022-03-31 19:33:51.416 +00:00","ISex_TTJRuarzs9-o_Gkhg","62d92a24-0ced-40d1-ad1d-e1ea953189b7","SMS","","{""sender"":""17372004196""}","","","","","","","","","","","","","","","","","","","","","true","","75fdde30-b129-11ec-99dd-02423b3f5d45","0e2a3d4b-b4b4-4208-838f-08eb7333aa5e","" ``` #### Sample Snowflake file format ```sql create or replace file format airship_csv_events type = csv skip_header = 1 timestamp_format = 'AUTO' //YYYY-MM-DD HH24:MI:SS.FF TZH:TZM null_if = '' field_optionally_enclosed_by='"' error_on_column_count_mismatch=false field_delimiter = ","; ``` ### Sample Airship setup script and event schemas ```sql create schema if not exists "AIRSHIP_EVENTS"; use "DB_NAME"."AIRSHIP_EVENTS"; create table if not exists "ATTRIBUTE_OPERATION" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "attribute_set" variant comment 'The attributes set on the device as an array of attribute objects.', "attribute_remove" variant comment 'The attributes removed from the device as an array of attribute objects.' ) comment = 'Attribute Operation events indicate a change in the device''s attributes. Because attribute operations are related to a device, they will have a `device` field. If you set an attribute on a named user, Airship records events for each device associated with the named user.'; create table if not exists "IN_APP_MESSAGE_DISPLAY" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "push_id" varchar comment 'A unique identifier for a push operation.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Message was created by the application logic, not Airship. If this field is present, the event body will not contain `push_id`, `group_id`, `variant_id`, or `triggering_push` fields.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.' ) comment = 'Occurs when an in-app message is displayed to a user. Because the event pertains to a specific device, the device information object will be populated.'; create table if not exists "FIRST_OPEN" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.' ) comment = 'This event occurs when a user opens an Airship-integrated app for the first time.'; create table if not exists "FIRST_OPT_IN" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "delivery_address" varchar comment 'The address of the device.', "open_platform_name" varchar comment 'If device_type is set to OPEN, this field shows the full name of the platform.' ) comment = 'This event appears in the stream when a channel is first opted in. This event is specific to email (commercial), sms and open channels.'; create table if not exists "FEATURE_FLAG_INTERACTION" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "eligible" boolean comment 'Indicates whether or not the user was in the Feature Flag audience and had access to the feature. true means the user was in the Feature Flag audience and had access to the feature.', "flag_name" varchar comment 'The name of a feature flag.', "flag_id" varchar comment 'A UUID that is associated with a feature flag.', "push_id" varchar comment 'A unique identifier for a push operation.', "app_defined_id" varchar comment 'An identifier defined by the application if the Feature Flag interaction was created by the application logic, not Airship. If this field is present, the event body will not contain `push_id`, `group_id`, `variant_id`, or `triggering_push` fields.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "session_id" varchar comment 'Represents the "session" of user activity. Absent if the application was initialized while backgrounded.', "variant_id" varchar comment 'The UUID of the A/B test variant, if available.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a user interacts with a tracked flagged feature. See Feature Flags. The events have a flag ID and flag name, which identify which flagged feature a user interacted with. They also have a boolean eligible field, which indicates whether or not the user was in the Feature Flag audience and had access to the feature.'; create table if not exists "IN_APP_MESSAGE_RESOLUTION" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "push_id" varchar comment 'A unique identifier for a push operation.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Message was created by the application logic, not Airship. If this field is present, the event body will not contain `push_id`, `group_id`, `variant_id`, or `triggering_push` fields.', "button_description" varchar comment 'The title of the button the user interacted with. Present if `type` is set to `BUTTON_CLICK`.', "button_group" varchar comment 'A category associated with the button. Present if `type` is set to `BUTTON_CLICK`.', "button_id" varchar comment 'A unique identifier for the button. Present if `type` is set to `BUTTON_CLICK`.', "duration" varchar comment 'The number of milliseconds that the user was on the screen.', "time_sent" timestamp_tz comment 'The date-time when the in-app message payload was sent to the device.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "resolution_type" varchar comment 'Indicates how the In-App Message was resolved.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.' ) comment = 'Occurs when an In-App Message is cleared from the display, either by user action or timeout. Because this event pertains to an individual device, the device information object will be present.'; create table if not exists "IN_APP_MESSAGE_EXPIRATION" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Message was created by the application logic, not Airship. If this field is present, the event body will not contain `push_id`, `group_id`, `variant_id`, or `triggering_push` fields.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "push_id" varchar comment 'A unique identifier for a push operation.', "replacing_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "replacing_push_group_id" varchar comment 'The specific group_id associated with the new message.', "replacing_push_push_id" varchar comment 'The specific push_id associated with the new message.', "replacing_push_variant_id" varchar comment 'The specific variant_id associated with the new message.', "replacing_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "time_expired" timestamp_tz comment 'The date-time when the in-app message payload expires.', "time_sent" timestamp_tz comment 'The date-time when the in-app message payload was sent to the device.', "expiration_type" varchar comment 'Indicates how the in-app message expired.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a new message has taken the place of another message, a message has passed its expiration, or because displaying the message in-app would be redundant. This event type may be latent; it is not emitted until the app becomes active.'; create table if not exists "MOBILE_ORIGINATED" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "delivery_address" varchar comment 'The address of the device.', "msisdn" varchar comment 'The mobile number of the device.', "sender" varchar comment 'The email address or number of the sender.', "keyword" varchar comment 'The specific keyword used in the inbound message, if recognized; the keyword in the inbound_message determines the outbound_message sent to the device. If a keyword could not be matched in the inbound_message, this field is absent.', "inbound_message" varchar comment 'The contents of the message received from an SMS device.', "outbound_message" varchar comment 'The response sent to the SMS device, based on the inbound message and keyword.' ) comment = 'Represents a message action that originated from a user — like an inbound SMS or email.'; create table if not exists "OPEN" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "last_delivered_push_id" varchar comment 'Identifies the last push notification the audience received before the event. Absent if the last push occurred more than 12 hours ago.', "last_delivered_group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "last_delivered_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "last_delivered_time" timestamp_tz comment 'The UTC time when the push occurred.', "last_delivered_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a user opens your app.'; create table if not exists "RICH_DELETE" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a user deletes a rich message from their inbox.'; create table if not exists "RICH_CONTROL" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a Message Center message is not delivered to a user because they are in a control group for a Sequence A/B test or Holdout Experiment.'; create table if not exists "PUSH_BODY" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "push_id" varchar comment 'A unique identifier for a push operation.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "trimmed" boolean comment 'If true, the push payload was trimmed from the event body.', "resource" varchar comment 'Describes the type of push, helping you interpret the JSON response. Possible values: PIPELINES, SCHEDULES, PUSH, EXPERIMENTS, IN_APP_AUTOMATION', "payload" varchar comment 'The specification of the push as sent via the API, a Base64 encoded JSON value.' ) comment = 'Occurs when you initiate a push, automation, or sequence.Airship fulfills delivery over a time interval with a number of child pushes, each with a unique Push ID and a common Group ID. There is no guarantee that push body events (defined in Push Body Event) for the child pushes fulfilling a group will appear in the stream.**Note:** When you start, pause, or publish a sequence, Airship emits a `push_body` event for the sequence itself, and each message contained within the sequence (i.e. messages +1). After you start a sequence, Airship does not issue subsequent `push_body` events for the sequence unless you pause or publish changes to the sequence.'; create table if not exists "RICH_DELIVERY" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a rich message is delivered to a user's inbox. Even though rich push deliveries may or may not cause an alert on the user’s lock screen, they are always associated with a push identifier in the Airship system.'; create table if not exists "REGION" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "action" varchar comment 'Indicates whether the event was the result of a user entering or exiting the region.', "name" varchar comment 'A friendly name for the region; may be retrieved from a third-party location provider. ', "region_id" varchar comment 'A unique identifier for the region in Airship, UUID format.', "source_info_source" varchar comment 'Information about the source application that generated the event.', "source_info_region_id" varchar comment 'The unique region identifier from the originating system or location provider.' ) comment = 'Region Events are emitted when a device enters or exits a geofence or the range of any of a set of bluetooth beacons. Region events require a Gimbal integration. Events for Gimbal customers include the Gimbal application instance identifer as `com.urbanairship.gimbal.aii` within the `identifiers` object.'; create table if not exists "SCREEN_VIEWED" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "duration" varchar comment 'The number of milliseconds that the user was on the screen.', "viewed_screen" varchar comment 'The name assigned to the screen that the user left.', "previous_screen" varchar comment 'The name assigned to the screen the user was on prior to the viewed screen.' ) comment = 'Occurs when a user has finished viewing a screen. It is up to you to instrument your application with names for each screen. Doing so will allow you to deterimine the user’s path by filtering on the fields in the table below.'; create table if not exists "SEND" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "open_platform_name" varchar comment 'If device_type is set to OPEN, this field shows the full name of the platform.', "alerting" boolean comment 'If true, the send event was alerting. Alerting send event has notification text, badge, or sound.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "context_triggered_by" varchar comment 'The triggering event type.', "context_event_uuid" varchar comment 'The ID of the custom event which triggered the send.', "context_interaction_id" varchar comment 'If interaction_id was set on the custom event body, it will be populated here.', "context_transaction" varchar comment 'If transaction was set on the custom event body, it will be populated here.' ) comment = 'Occurs whenever a push notification is sent to a device identified in the audience selector of a message.'; create table if not exists "SHORT_LINK_CLICK" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "push_id" varchar comment 'A unique identifier for a push operation.', "original_url" varchar comment 'The URL that was clicked.', "delivery_address" varchar comment 'The address of the device.', "sender" varchar comment 'The email address or number of the sender.' ) comment = 'Occurs when a user taps or "clicks" an Airship-shortened link in an SMS or MMS message.'; create table if not exists "SEND_ABORTED" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "reason" varchar comment 'Describes the reason this push was aborted.' ) comment = 'Occurs when a push is dropped from our system before delivery is attempted. This can happen if you are using [External Data Feeds](https://www.airship.com/docs/guides/personalization/sources/external-data-feeds/) to personalize a message and an error was encountered or the feed returned a non-successful response, or when reaching a [Message Limit](https://www.airship.com/docs/guides/messaging/project/config/message-limits/). Device information for the device that did not receive the push is included with `SEND_ABORTED` events.'; create table if not exists "UNINSTALL" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "decay" boolean comment 'If true, Airship recorded an uninstall event due to user inactivity.' ) comment = 'Occurs when a user uninstalls an Airship-integrated app in response to a push.'; create table if not exists "CONTROL" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "push_id" varchar comment 'A unique identifier for a push operation.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.' ) comment = 'Occurs when a device is excluded from a push because it was arbitrarily selected as a member of a control group. Membership in a control group indicates what would''ve happened if you did not send a message to a user at all. This occurs for A/B Test-related pushes only.'; create table if not exists "RICH_READ" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a user reads a rich message in their inbox.'; create table if not exists "TAG_CHANGE" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "tags_add" variant comment 'Tag group/tag pairs added to the device. Each tag group is an array containing one or more tags within this object.', "tags_current" variant comment 'The total set/state of tag group/tag pairs associated with the device after the tag change. Each tag group is an array containing one or more tags within this object.', "tags_remove" variant comment 'Tag group/tag pairs removed from the device. Each tag group is an array containing one or more tags within this object.' ) comment = 'Occurs when tags change for a device.'; create table if not exists "CLOSE" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.' ) comment = 'Occurs when a user closes the app. Close events are often latent, as they aren''t sent back to Airship until the user activates the app again.'; create table if not exists "SEND_REJECTED" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.' ) comment = 'Occurs when a push fails during communication with a third party, like APNs or GCM. This typically indicates that the user has uninstalled the app or otherwise invalidated the last-registered credentials stored in Airship. The event contains the rejected push and the group, variant, or campaigns the push belonged to.Device information for the device that did not receive the push is included with `SEND_REJECTED` events.'; create table if not exists "WEB_SESSION" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "last_delivered_push_id" varchar comment 'Identifies the last push notification the audience received before the event. Absent if the last push occurred more than 12 hours ago.', "last_delivered_group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "last_delivered_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "last_delivered_time" timestamp_tz comment 'The UTC time when the push occurred.', "last_delivered_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.' ) comment = 'Occurs when an opted in user begins interacting with a website. Web Session events have a device attribute, indicating the channel associated with the user.'; create table if not exists "WEB_CLICK" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a user interacts with a web notification, e.g., clicked or tapped it. Web Click events have a device attribute on the event indicating the channel that was the target of the notification. The body of a Web Click Event is an Associated Push object.'; create table if not exists "CUSTOM" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar comment 'The unique, platform-agnostic channel identifier for a device. Can be null if the event was sent to a named user.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "web_browser_name" varchar comment 'The name of the browser running the SDK.', "web_browser_type" varchar comment 'Indicates whether the browser was running on a desktop or mobile device.', "web_browser_version" varchar comment 'The version of the browser running the SDK.', "web_user_agent_string" varchar comment 'The user agent string reported by the browser.', "name" varchar comment 'The name of the event.', "properties" variant comment 'A JSON object containing the properties of the event.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "value" number comment 'Populated if the event is associated with a count or amount. Airship treats this field as a representation of money. The `value` field respects six digits of precision to the right of the decimal point.', "source" varchar comment 'The source of the event either API or SDK.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "last_delivered_push_id" varchar comment 'Identifies the last push notification the audience received before the event. Absent if the last push occurred more than 12 hours ago.', "last_delivered_group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "last_delivered_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "last_delivered_time" timestamp_tz comment 'The UTC time when the push occurred.', "last_delivered_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Represents custom events that are either emitted from the Airship SDK or submitted through the Custom Events API. You can configure custom events yourself. There are also several CUSTOM-type events for email and SMS that are defined by Airship.In general, you can expect device information if the event source is `SDK` or if the event is one of the defined email or SMS events (as defined by `event_type`).'; create table if not exists "SUBSCRIPTION" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "delivery_address" varchar comment 'The address of the device.', "subscription_event_type" varchar comment 'Determines the source of the subscription event. registration and create_and_s if not existsend events result in changes to opted_in dates; all other event types contain opted_out dates.', "subscription_identifiers_address" varchar comment 'The email address representing the change.', "commercial_opted_in" timestamp_tz comment 'The date and time when the address opted into commercial email messages.', "transactional_opted_in" timestamp_tz comment 'The date and time when the address opted into transactional email messages.' ) comment = 'Reflect changes to users'' subscription preferences — reflected in opt_in and opt_out values. These events help you track a user''s subscription status in the system and the total number of subscribers.'; create table if not exists "IN_APP_BUTTON_TAP" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Button Tap was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "button_id" varchar comment 'A unique identifier for the button.', "context_reporting_context_content_types" variant comment 'The content types of the in-app automation.', "context_state_form_form_identifier" varchar comment 'Is the form controller identifier.', "context_state_form_response_type" varchar comment 'The form response type. Possible values: nps, user_feedback.', "context_state_form_submitted" boolean comment 'Whether the form has been submitted.', "context_state_form_type" varchar comment 'The form type. Possible values: nps, form.', "context_state_pager_completed" boolean comment 'Whether the user reached the end of the pager.', "context_state_pager_identifier" varchar comment 'The pager controller identifier.', "context_state_pager_page_count" number comment 'The total number of pages.', "context_state_pager_page_identifier" varchar comment 'The current page identifier.', "context_state_pager_page_index" number comment 'The current pager index.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "rendered_locale" varchar comment 'Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to.', "push_id" varchar comment 'A unique identifier for a push operation.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "time_sent" timestamp_tz comment 'An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when an in-app button is tapped within a scene.'; create table if not exists "IN_APP_EXPERIENCES" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "push_id" varchar comment 'A unique identifier for a push operation.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Message was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "event_name" varchar comment 'Name of the experiences event. Possible values: scene_displayed, scene_completed, scene_incomplete, survey_displayed, survey_submitted, survey_not_submitted.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "survey_type" varchar comment 'The survey type, only present for survey events. Possible values: nps, user_feedback.', "time_sent" timestamp_tz comment 'An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Events that occur related to the display and completion behavior of a scene.'; create table if not exists "IN_APP_FORM_DISPLAY" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Form was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "context_reporting_context_content_types" variant comment 'The content types of the in-app automation.', "context_state_form_form_identifier" varchar comment 'Is the form controller identifier.', "context_state_form_response_type" varchar comment 'The form response type. Possible values: nps, user_feedback.', "context_state_form_submitted" boolean comment 'Whether the form has been submitted.', "context_state_form_type" varchar comment 'The form type. Possible values: nps, form.', "context_state_pager_completed" boolean comment 'Whether the user reached the end of the pager.', "context_state_pager_identifier" varchar comment 'The pager controller identifier.', "context_state_pager_page_count" number comment 'The total number of pages.', "context_state_pager_page_identifier" varchar comment 'The current page identifier.', "context_state_pager_page_index" number comment 'The current pager index.', "forms" variant comment 'Information about the forms.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "push_id" varchar comment 'A unique identifier for a push operation.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "time_sent" timestamp_tz comment 'An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "in_app_form_event_type" varchar comment 'The In-App Form event type. The value is always DISPLAY.' ) comment = 'Occurs when an in-app form (currently specific to surveys) is displayed.'; create table if not exists "IN_APP_FORM_RESULT" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Form was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "context_reporting_context_content_types" variant comment 'The content types of the in-app automation.', "context_state_form_form_identifier" varchar comment 'Is the form controller identifier.', "context_state_form_response_type" varchar comment 'The form response type. Possible values: nps, user_feedback.', "context_state_form_submitted" boolean comment 'Whether the form has been submitted.', "context_state_form_type" varchar comment 'The form type. Possible values: nps, form.', "context_state_pager_completed" boolean comment 'Whether the user reached the end of the pager.', "context_state_pager_identifier" varchar comment 'The pager controller identifier.', "context_state_pager_page_count" number comment 'The total number of pages.', "context_state_pager_page_identifier" varchar comment 'The current page identifier.', "context_state_pager_page_index" number comment 'The current pager index.', "forms" variant comment 'Information about the forms.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "push_id" varchar comment 'A unique identifier for a push operation.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "time_sent" timestamp_tz comment 'An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "in_app_form_event_type" varchar comment 'The In-App Form event type. The value is always RESULT.' ) comment = 'Occurs when an in-app form (currently specific to surveys) is submitted.'; create table if not exists "IN_APP_PAGE_SWIPE" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "context_reporting_context_content_types" variant comment 'The content types of the in-app automation.', "context_state_form_form_identifier" varchar comment 'Is the form controller identifier.', "context_state_form_response_type" varchar comment 'The form response type. Possible values: nps, user_feedback.', "context_state_form_submitted" boolean comment 'Whether the form has been submitted.', "context_state_form_type" varchar comment 'The form type. Possible values: nps, form.', "context_state_pager_completed" boolean comment 'Whether the user reached the end of the pager.', "context_state_pager_identifier" varchar comment 'The pager controller identifier.', "context_state_pager_page_count" number comment 'The total number of pages.', "context_state_pager_page_identifier" varchar comment 'The current page identifier.', "context_state_pager_page_index" number comment 'The current pager index.', "from_page_index" number comment 'The previous page index', "from_page_identifier" varchar comment 'The previous page identifier.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "rendered_locale" varchar comment 'Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to.', "pager_identifier" varchar comment 'The pager controller identifier.', "push_id" varchar comment 'A unique identifier for a push operation.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "time_sent" timestamp_tz comment 'An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device.', "to_page_identifier" varchar comment 'The current page identifier', "to_page_index" number comment 'The current page index', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when a user swipes to the next or previous page (screen) in a pager (currently specific to Scenes).'; create table if not exists "IN_APP_PAGE_VIEW" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "completed" boolean comment 'Whether the user has reached the end of the pager.', "context_reporting_context_content_types" variant comment 'The content types of the in-app automation.', "context_state_form_form_identifier" varchar comment 'Is the form controller identifier.', "context_state_form_response_type" varchar comment 'The form response type. Possible values: nps, user_feedback.', "context_state_form_submitted" boolean comment 'Whether the form has been submitted.', "context_state_form_type" varchar comment 'The form type. Possible values: nps, form.', "context_state_pager_completed" boolean comment 'Whether the user reached the end of the pager.', "context_state_pager_identifier" varchar comment 'The pager controller identifier.', "context_state_pager_page_count" number comment 'The total number of pages.', "context_state_pager_page_identifier" varchar comment 'The current page identifier.', "context_state_pager_page_index" number comment 'The current pager index.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "rendered_locale" varchar comment 'Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to.', "page_count" number comment 'The total number of pages.', "page_identifier" varchar comment 'The current page identifier.', "page_index" number comment 'The current pager index.', "pager_identifier" varchar comment 'The pager controller identifier.', "push_id" varchar comment 'A unique identifier for a push operation.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "time_sent" timestamp_tz comment 'An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "viewed_count" number comment 'The number of times the current page has been viewed.' ) comment = 'Occurs when a page (screen) is displayed within a pager (currently specific to Scenes & Surveys).'; create table if not exists "IN_APP_PAGER_COMPLETED" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "context_reporting_context_content_types" variant comment 'The content types of the in-app automation.', "context_state_form_form_identifier" varchar comment 'Is the form controller identifier.', "context_state_form_response_type" varchar comment 'The form response type. Possible values: nps, user_feedback.', "context_state_form_submitted" boolean comment 'Whether the form has been submitted.', "context_state_form_type" varchar comment 'The form type. Possible values: nps, form.', "context_state_pager_completed" boolean comment 'Whether the user reached the end of the pager.', "context_state_pager_identifier" varchar comment 'The pager controller identifier.', "context_state_pager_page_count" number comment 'The total number of pages.', "context_state_pager_page_identifier" varchar comment 'The current page identifier.', "context_state_pager_page_index" number comment 'The current pager index.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "rendered_locale" varchar comment 'Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to.', "page_count" number comment 'The total number of pages.', "page_identifier" varchar comment 'The current page identifier.', "page_index" number comment 'The current pager index.', "pager_identifier" varchar comment 'The pager controller identifier.', "push_id" varchar comment 'A unique identifier for a push operation.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "time_sent" timestamp_tz comment 'An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' ) comment = 'Occurs when the last page (screen) of a pager is viewed for the first time (currently specific to Scenes & Surveys).'; create table if not exists "IN_APP_PAGER_SUMMARY" ( "id" varchar unique not null comment 'The event ID', "offset" varchar comment 'The offset of the event that represents the location of the event in the stream.', "occurred" timestamp_tz comment 'The time the event occurred.', "processed" timestamp_tz comment 'The time the event was processed.', "app_key" varchar comment 'The identifier for the Airship project.', "channel" varchar not null comment 'The unique, platform-agnostic channel identifier for a device.', "device_type" varchar comment 'The platform of the channel', "named_user" varchar comment 'The named user identifier associated with the channel.', "custom_identifiers" variant comment 'The custom identifiers associated with the app channel, stored as an object.', "locale_variant" varchar comment 'The language variant as reported by the device.', "locale_country_code" varchar comment 'The ISO 3166-1 country code as defined in device settings.', "locale_timezone" varchar comment 'The timezone as reported by the device offset in seconds from UTC.', "locale_language_code" varchar comment 'The ISO 639-1 two-letter language code as defined in device settings.', "iana_timezone" varchar comment 'The IANA timezone of the device.', "app_version" varchar comment 'The version of the app installed on the device.', "device_model" varchar comment 'The model of the device.', "connection_type" varchar comment 'The internet connection type used by the device.', "ua_sdk_version" varchar comment 'The version of the Airship SDK used to record the event.', "push_opt_in" boolean comment 'Whether the user has opted in to push notifications.', "device_os" varchar comment 'The operating system of the device.', "carrier" varchar comment 'The wireless carrier used by the device.', "location_enabled" boolean comment 'Whether the device has location services enabled.', "location_permission" varchar comment 'Location permission level as configured in device settings.', "background_push_enabled" boolean comment 'Whether the device has background push notifications enabled.', "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "completed" boolean comment 'Whether the user has reached the end of the pager.', "context_reporting_context_content_types" variant comment 'The content types of the in-app automation.', "context_state_form_form_identifier" varchar comment 'Is the form controller identifier.', "context_state_form_response_type" varchar comment 'The form response type. Possible values: nps, user_feedback.', "context_state_form_submitted" boolean comment 'Whether the form has been submitted.', "context_state_form_type" varchar comment 'The form type. Possible values: nps, form.', "context_state_pager_completed" boolean comment 'Whether the user reached the end of the pager.', "context_state_pager_identifier" varchar comment 'The pager controller identifier.', "context_state_pager_page_count" number comment 'The total number of pages.', "context_state_pager_page_identifier" varchar comment 'The current page identifier.', "context_state_pager_page_index" number comment 'The current pager index.', "group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.', "rendered_locale" varchar comment 'Optional string that defines the country and language this in-app-automation was localized as by remote-config-api. country - (String) an ISO 3166-1 country code, set by device settings. language - (String) The ISO 639-1 two-letter language code reflecting the language the phone is set to.', "page_count" number comment 'The total number of pages.', "page_identifier" varchar comment 'The current page identifier.', "pager_identifier" varchar comment 'The pager controller identifier.', "push_id" varchar comment 'A unique identifier for a push operation.', "session_id" varchar comment 'Represents the “session” of user activity. Absent if the application was initialized while backgrounded.', "time_sent" timestamp_tz comment 'An ISO 8601 datetime indicating when the payload defining the In-App Message was sent to the device.', "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.', "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s', "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.', "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.', "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).', "viewed_pages" variant comment 'Information about each viewed page.' ) comment = 'Describes the full path a user took within a pager (currently specific to Scenes), including the order of pages (screens) visited and time spent per page.'; show tables; ``` ### Schema and file changes Airship may occasionally add additional columns to the exported CSV files. Column order will remain the same and any new columns will be appended. When creating your data pipelines we recommend ignoring additional columns to prevent any additions from breaking your data loads. If you encounter data load errors, you can recover from your staged files to ensure that no Airship event data is lost. Changes will be noted in the changelog along with example migrations. #### Changelog | Change | Migration | | --- | --- | | **Aug 2024**
Changed position of `completed` field in **IN_APP_PAGER_SUMMARY** table. | ```sql ... "app_defined_id" varchar comment 'An identifier defined by the application if the In-App Pager was created by the application logic, not Airship. If this field is present, the event body will not contain push_id, group_id, variant_id, or triggering_push fields.', "completed" boolean comment 'Whether the user has reached the end of the pager.', "context_reporting_context_content_types" variant comment 'The content types of the in-app automation.', ... ``` | | **May 2023**
Made channel ID not required for **CUSTOM** table. Custom events sent to named users will not include a channel ID. | ```sql alter table "CUSTOM" alter "channel" drop not null; ``` | | **Dec 2022**
Added `campaigns` to **IN_APP_MESSAGE_RESOLUTION** and **IN_APP_MESSAGE_DISPLAY** tables. | ```sql alter table IN_APP_MESSAGE_RESOLUTION add column "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.'; alter table IN_APP_MESSAGE_DISPLAY add column "campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.'; ``` | | **Sep 2022**
Added push attributes to **CUSTOM** table. | ```sql alter table CUSTOM add column "triggering_push_push_id" varchar comment 'The push ID of the push that triggered the custom event.' add column "triggering_push_group_id" varchar comment 'The specific `push_id` and accompanying identifiers associated with an event. An associated push helps you trace an event to the original notification or operation. An associated push object may specify a `time`, if the push was a singular operation sent at a defined time. Otherwise, the object will include a `group_id` if the push was sent at a relative time (`best_time` or `local_time`) an automation pipeline, or another operation resulting in multiple `push_id`s' add column "triggering_push_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.' add column "triggering_push_time" timestamp_tz comment 'The UTC time when the push occurred.' add column "triggering_push_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).' add column "last_delivered_push_id" varchar comment 'Identifies the last push notification the audience received before the event. Absent if the last push occurred more than 12 hours ago.' add column "last_delivered_group_id" varchar comment 'Identifies a push specification delivered over an interval of time, e.g. multiple push_ids as part of the fulfillment of an automation pipeline or a push-to-local-time specification.' add column "last_delivered_campaigns" variant comment 'An object listing the campaigns a push specification is associated with. The campaigns object includes an array of categories that must have between 1 and 10 elements, each of which is a string with a 64-byte and -character limit.' add column "last_delivered_time" timestamp_tz comment 'The UTC time when the push occurred.' add column "last_delivered_variant_id" varchar comment 'The ID of the variant that a push is associated with, if the push was a part of an A/B test (experiment).'; ``` | {class="table-col-1-20"} # Export Lists from Snowflake > Export Snowflake audience data for personalization and segmentation in Airship. Sending Snowflake data to Airship capitalizes on existing, readily available tools to achieve the highest degree of flexibility and control, all while maintaining cost-effectiveness. Your data team uses Snowflake to generate valuable insights and audience segments by employing a tool they are already proficient in: SQL. You can expand on these existing processes to send data to Airship. This collaboration unlocks a multitude of potential use cases and drives a substantial improvement in personalization capabilities. Follow these steps to create [Attributes](https://www.airship.com/docs/reference/glossary/#attributes) from Snowflake data. You can also leverage any of the supported features listed in [SFTP upload for CSV files](https://www.airship.com/docs/guides/audience/segmentation/sftp-upload/), including [Uploaded (Static) Lists](https://www.airship.com/docs/reference/glossary/#uploaded_list). To use your Snowflake data directly, without copying or importing the data into Airship, see [Zero-copy data integration](https://www.airship.com/docs/guides/features/data-integration/zero-copy-data-integration/). To send Airship data to Snowflake, see the [Real-Time Data Streaming integration](https://www.airship.com/docs/integrations/snowflake/). ## Generating SFTP keys Airship's SFTP implementation uses SSH key pairs for authentication. You must create a pair of keys: a private key for your client and a public key for Airship. Then you can add the public key to Airship use the private key from Snowflake. In Airship: 1. Generate your key pair. Follow the steps in [Generate keys](https://www.airship.com/docs/guides/audience/segmentation/sftp-upload/#generate-keys) in *SFTP upload for CSV files*. 1. Add your public key, making sure to set the Purpose to `Attributes`. Follow the steps in [Add your public key to Airship](https://www.airship.com/docs/guides/audience/segmentation/sftp-upload/#add-your-public-key-to-airship) in *SFTP upload for CSV files*. Note the host, port, and username for use in the following SFMC steps. ## Creating a network rule and integration In Snowflake, your setup may require the following. **Create a network rule and external access integration** ```sql -- This gets used in creating the external access integration CREATE OR REPLACE NETWORK RULE airship_sftp_network_rule TYPE = HOST_PORT VALUE_LIST = ('sftp.airship.com:5222') MODE= EGRESS ; -- This gets used later creating the stored proc CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION sftp_airship_ext_int ALLOWED_NETWORK_RULES = (airship_sftp_network_rule) ALLOWED_AUTHENTICATION_SECRETS = (sftp_airship_attribute_cred) ENABLED = true ; ``` ## Storing the SFTP credentials In Snowflake, store the private key in a `SECRET` type `password`. This is preferred because the tokens are encrypted. **Store the credentials** ```sql -- create secret credential object (removed the actual key in this example) -- this creates an object with a username and password (it's a key in this case) CREATE SECRET sftp_airship_attribute_cred TYPE = password USERNAME = 'OZzRx6y4Rm690T6KkReIuQ' PASSWORD = '-----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- '; ``` ## Creating a function to retrieve the SSH authentication In Snowflake, you can create a function to retrieve the credentials. **Create a function** ```sql CREATE OR REPLACE FUNCTION get_secret_username_password() RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = 3.9 HANDLER = 'get_secret_username_password' EXTERNAL_ACCESS_INTEGRATIONS = (sftp_airship_ext_int) SECRETS = ('cred' = sftp_airship_attribute_cred ) AS $$ import _snowflake def get_secret_username_password(): username_password_object = _snowflake.get_username_password('cred') username_password_dictionary = {} username_password_dictionary["Username"] = username_password_object.username username_password_dictionary["Password"] = username_password_object.password return username_password_dictionary $$; ``` ## Creating a sample attributes table Next, create a sample SQL table for your Snowflake attributes. It's unlikely that attributes will be pulled from a single table formatted precisely like this. Nevertheless, it's a good place to start as it illustrates the functionality. **Create a table** ```sql -- create a table for attributes and insert a row or two CREATE table sample_attributes ( named_user VARCHAR(100), first_name VARCHAR(100), last_name VARCHAR(100), loyalty_id INT, favourite_color VARCHAR(100), tacos_desired INT ); INSERT INTO sample_attributes VALUES ('8732eda2-c13c-4a2a-9123-fb5bf0bccffb', 'John', 'Smith', 60001, 'Green', 77); INSERT INTO sample_attributes VALUES ('ba06daf2-66f8-43ce-a152-b0605b9b834e', 'Alice', 'Jones', 87301, 'Blue', 1); ``` ## Creating a Stored Procedure This example creates a very basic Stored Procedure that uploads the `sample_attributes` table above via SFTP to Airship. It doesn't use arguments, everything is hard coded, and it uses the [function above](#creating-a-function-to-retrieve-the-ssh-authentication) to fetch the credentials. **Create a stored procedure** ```sql CREATE OR REPLACE PROCEDURE upload_to_sftp() RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = 3.8 HANDLER = 'main' EXTERNAL_ACCESS_INTEGRATIONS = (sftp_airship_ext_int) PACKAGES = ('snowflake-snowpark-python','paramiko') SECRETS = ('cred' = sftp_airship_attribute_cred) AS $$ import _snowflake import paramiko from snowflake.snowpark.files import SnowflakeFile from io import StringIO def main(session): # use the function for grabbing the creds sftp_cred = _snowflake.get_username_password('cred'); # convert the private key to a file-like object private_key_file = StringIO(sftp_cred.password) private_key = paramiko.RSAKey.from_private_key(private_key_file) # grab the data from the sample attributes table df = session.sql("select * from sample_attributes").toPandas() df.to_csv('/tmp/out.csv',index=False) # connect and upload via SFTP using Paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect("sftp.airship.com",port=5222, username=sftp_cred.username, pkey=private_key) sftp = ssh.open_sftp() ret = sftp.put('/tmp/out.csv','/out.csv', confirm=False) # confirm=False is important because Airship sftp doesn't support `ls` return ret except Exception as e: return f" Error with SFTP : {e}" $$; ``` ## Verifying transfer Run `call upload_to_sftp();`, then verify your data was successfully transferred to Airship. Select the **Audience** menu, then **Attributes**, then **Upload History**. For more information, see [Viewing Attributes upload history](https://www.airship.com/docs/guides/audience/attributes/managing/#viewing-upload-history) in *Managing Attributes*. ## Targeting users You can now use the transferred data for targeting. See: * [Targeting your audience using Attributes](https://www.airship.com/docs/guides/audience/attributes/targeting/) * [Using Uploaded Lists](https://www.airship.com/docs/guides/audience/segmentation/audience-lists/uploaded/#using-uploaded-lists) * [Segments](https://www.airship.com/docs/guides/audience/segmentation/segments/) # Snowplow > Send Real-Time Data Streaming events to Snowplow with our Amazon Redshift integration. Snowplow helps you track all events across all channels to give you an up-to-the-minute view of user behaviors. With the Airship [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds) integration you will have access to all your mobile data in addition to any other data you want to collect via Snowplow. This enables you to have complete control over your data warehouse. Amazon Redshift is used so your data analysts can run custom queries and generate reports. * Understand user lifecycle. * Uncover activation behaviors that lead to long term users. * Optimize user acquisition spend based on the highest performing source that leads to conversions. ## Snowplow Integration Requirements This integration requires these accounts: 1. Snowplow 1. Airship — Must include both: * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) ## Configuring the Snowplow Integration [Contact Snowplow](https://snowplow.io/contact-us/) to set up this integration. For a list of events tracked, see [Snowplow's Airship integration documentation](https://docs.snowplow.io/docs/collecting-data/collecting-data-from-third-parties/urban-airship-connect/). # Talon.One > Use Airship's External Data Feeds to fetch personalized promotions and loyalty rewards from Talon.One. Airship's [External Data Feeds](https://www.airship.com/docs/reference/glossary/#external_feed) can fetch personalized promotions and loyalty rewards from [Talon.One](https://www.talon.one/) at message send time. This allows you to deliver highly targeted offers to your users through Airship's messaging channels, with the promotion logic handled by Talon.One's powerful engine. This integration approach provides the following capabilities: * Fetch real-time promotion data from Talon.One when sending messages. * Personalize messages with dynamic coupon codes and offers. * Leverage Talon.One's promotion engine for eligibility and targeting. * Maintain a single source of truth for promotions in Talon.One. ## Talon.One integration requirements This integration requires the following: * **Accounts** 1. Talon.One — The account must have permissions to manage API keys. 1. Airship — The account must include messaging. * **External API** — See [External API requirements](https://www.airship.com/docs/guides/personalization/sources/external-data-feeds/#external-api-requirements) in the *External Data Feeds* guide. You must have appropriate permissions in both systems. ## Configuring the integration To set up the integration, you will create an API key and campaign in Talon.One and an External Data Feed in Airship. Then, you can reference the feed in your Airship messages. ### Create an API Key In Talon.One: 1. Go to **Apps** and select the application you want to integrate with Airship. 1. Select **Settings**, then **Integration API Keys**. 1. Select **+ Create API Key**. 1. Enter a key name and set an expiration date. 1. For **Third-party integration**, select **Yes**. 1. For **Platform**, select **Customer Engagement Platform**. 1. Select **Create API Key**. ### Create a campaign In Talon.One: 1. Go to **Apps** and select the application you want to integrate with Airship. 1. Select **+Create Campaign** and enable the **Coupons** option. 1. Select **Create Campaign**. 1. Copy the following values for use in Airship: * Destination hostname * Authorization key * Customer engagement hostname 1. In the browser address bar, copy the URL to capture the Talon.One applicationId and campaignId. The URL also contains the destination hostname. For the example `https://internal.europe-west1.talon.one/applications/359/campaigns/7777`, these are the values for each section:

* Destination hostname: internal.europe-west1.talon.one * applicationId: 359 * campaignID: 777

You can return to the URL at any time by editing the campaign.

### Create an External Data Feed See [Create a feed](https://www.airship.com/docs/guides/personalization/sources/external-data-feeds/#create-a-feed) in *External Data Feeds* for information about each setting. The following information is specific to requirements for the Talon.One integration. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **External Data Feeds**. 1. Select **Create External Data Feed**. 1. Configure the feed using the following information: | Setting | Steps | | --- | --- | | **Request URL** | Configure the URL to point to your Talon.One API endpoint: `https://integration.talon.one/customer_engagement/coupon?applicationId=applicationId&campaignId=campaignId&externalCampaignId=[[externalCampaignId]]&identifier={{channel_id}}`.

Replace the parameter values with your actual Talon.One IDs obtained from your campaign URL and add a default value for externalCampaignId, for example, `t1`. | | **Headers** | Enter a key/value pair for each:

- `Authorization` : Your Talon.One API key
- `Customer-Engagement-Platform-Name` : `Airship`
- `Destination-Hostname` : Your destination hostname | | **Object locations** | Add an object location for the data you want to access. Both the name and location should have value `coupon`. The identifier could be any value available in Airship, including [Named User](https://www.airship.com/docs/reference/glossary/#named_user) or any [Attribute](https://www.airship.com/docs/reference/glossary/#attributes). For example, perhaps there is a Loyalty ID with your end users in both platforms stored as an attribute. | {class="table-col-1-30"} 1. Select **Save** to create the feed in your project. ## Using Talon.One data in Airship messages You add your data feed to messages in two parts: 1. Formatting the message content 1. Determining how to handle the message if the feed fails For full documentation, see [Using a feed in messages](https://www.airship.com/docs/guides/personalization/sources/external-data-feeds/#using-a-feed-in-messages) in *External Data Feeds*. ### Reference the feed in message content The JSON response from Talon.One will look something like this: ```json { "ID": 20190408, "ApplicationID": 398, "CampaignID": 5671, "Value": "EW-1BC2", "StartDate": "2021-09-30T15:35:02.371569+02:00", "ExpiryDate": "2024-10-03T15:35:02.371569+02:00", "RecipientIntegrationID": "URN-GV8294NV", "UsageLimit": 1, "Attributes": { "email": "user@example.com", "country": "DE" } } ``` When creating message content, use the feed block syntax to access Talon.One data: ```handlebars {{#feed "talon_promotions" as |data|}} Here's your exclusive offer: {{data.Value}} {{/feed}} ``` This should result in an alert with a personalized coupon code: ![An example coupon code from Talon.One data](https://www.airship.com/docs/images/integrations/talon-one-alert-example_hu_b19629bd260f1108.webp) *An example coupon code from Talon.One data* ### Configure feed failure behavior In the Delivery step of your message, under **External data feed options**, set the behavior that should occur if the feed fails: * **Abort sending the message** — Use this option if the promotion is critical. * **Send message without this data** — Use this option if you have fallback content. ## Additional resources See [Talon.One documentation](https://docs.talon.one) for additional information, including [Create coupon](https://docs.talon.one/third-party-api#tag/Customer-engagement-platforms/operation/cep/createCoupon) in *Customer engagement platform*. # Tealium > Consume Tealium data and send Airship engagement data to Tealium. Tealium is a Customer Data Platform (CDP). CDPs collect, store, and normalize large volumes of data while creating a persistent identifier that spans across data sets. You can use the inbound and source integrations together or separately. Inbound Integration : Use Tealium to set [Tags](https://www.airship.com/docs/reference/glossary/#tag), [Attributes](https://www.airship.com/docs/reference/glossary/#attributes), and deliver [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) in Airship. This data is synced between Tealium and Airship using [Named User](https://www.airship.com/docs/reference/glossary/#named_user). Once in Airship, customers can segment based on those tags, events, and custom event properties, as well as trigger Automations and Sequences. Personalization using attributes and custom event properties is also supported. Source Integration : Rich user-level App, SMS, Web, Email, and Open channel data is sent from Airship to Tealium using [Real-Time Data Streaming](https://www.airship.com/docs/reference/glossary/#rtds). Tealium then transforms Airship data into traits and audiences, unifying users and content across different platforms. You choose which RTDS events to send to Tealium. ## Tealium integration requirements * **Accounts** 1. Tealium 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for outbound integration only* * **Airship project** * [Named User](https://www.airship.com/docs/reference/glossary/#named_user) must be enabled for your project. ## Configuring the Tealium inbound integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Tealium**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create [Attributes](https://www.airship.com/docs/reference/glossary/#attributes), a [Tag Group](https://www.airship.com/docs/reference/glossary/#tag_group), and an authentication token. Tealium uses the token to communicate with your project in Airship. * Add a new connector for Airship in Tealium. ## Configuring the Tealium source integration To set up this integration, you will: 1. Configure your app to set the `tealium_visitor_id` on Airship events. See the Kotlin and iOS setup sections below for more information. 1. Add Airship to Tealium as a source and retrieve your Data Source Endpoint. 1. Set up the RTDS integration for Tealium in the Airship dashboard. When you set up a Tealium RTDS integration, your events will contain a `tealium_visitor_id` key. This is the identifier Tealium uses to differentiate between unique events. As a fallback, you may want to set your Airship [Named User](https://www.airship.com/docs/reference/glossary/#named_user) value to `tealium_visitor_id` to ensure that events are matched within Tealium. ### Set the `tealium_visitor_id` on Airship events **Kotlin SDK example** ```kotlin // Initialize the Tealium library TealiumConfig tealiumConfig = TealiumConfig( application, {ACCOUNT}, {PROFILE}, {ENVIRONMENT}, dataSourceId = {DATASOURCE_ID}, //optional modules = mutableSetOf(VisitorService), dispatchers = mutableSetOf(TagManagement, Collect) ); Tealium tealium = Tealium.create("tealium_instance", tealiumConfig); // Get the Tealium visitor ID String visitorId = tealium.getVisitorId(); // Add the visitor ID to the current associated identifiers Airship.getAnalytics() .editAssociatedIdentifiers() .addIdentifier("tealium_visitor_id", visitorId) .apply(); ``` See also: [Tealium Kotlin Identity Resolution documentation](https://docs.tealium.com/platforms/getting-started-mobile/identity-resolution/). **Swift SDK example** ```swift // Initialize the Tealium library let config = TealiumConfig(account: {ACCOUNT}, profile: {PROFILE}, environment: {ENVIRONMENT}, datasource: {DATASOURCE}) let tealium = Tealium(config: config) // Get the Tealium visitor ID let visitorId = tealium.visitorId // Add the visitor ID to the current associated identifiers let identifiers = Airship.analytics.currentAssociatedDeviceIdentifiers() identifiers.set(identifier: visitorId, key:"tealium_visitor_id") Airship.analytics.associateDeviceIdentifiers(identifiers) ``` See also: [Tealium Swift Identity Resolution documentation](https://docs.tealium.com/platforms/getting-started-mobile/identity-resolution/). ### Add Airship to Tealium as a source You will also retrieve your *Data Source Endpoint URL*. 1. Log in to [Tealium](https://my.tealiumiq.com/). 1. In the sidebar, select **Sources**, then **Data Sources**, which will take you to a page where you can add Airship as a data source. 1. Select **Add Source**. 1. Under **Communication**, select **Airship**. 1. Enter a name for your Airship source integration. 1. Select **Continue** until you reach the **Choose Event Specifications** page. > **Note:** The event specifications currently do not support Airship-specific events. Tealium may add these in the future. For now, you can ignore the event specifications. 1. Select **Continue** to proceed to the **Get Code** page. 1. Copy the Data Source Endpoint URL. You will paste this in the Airship dashboard when setting up the RTDS integration. ![Copying the Data Source Endpoint URL from Tealium](https://www.airship.com/docs/images/tealium-install_hu_bbbcef297a7d9b29.webp) *Copying the Data Source Endpoint URL from Tealium* > **Note:** The Install steps listed in the Tealium **Get Code** page are the same as provided in the next section on this page. Please read the steps for information not provided by Tealium. ### Set up a Tealium RTDS integration in Airship You will need your Tealium Data Source Endpoint URL. In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Real-Time Data Streaming**. 1. Under **Real-Time Data Streaming**, select **Tealium**. 1. Follow the onscreen instructions to configure the integration.

You have the option to include anonymous data. Events that have a `tealium_visitor_id`, named user, or [delivery_address](https://www.airship.com/docs/developer/rest-api/connect/schemas/device-information/#sms-email-devices) (phone number, [MSISDN](https://www.airship.com/docs/reference/glossary/#msisdn), or email address) are delivered to Tealium by default. When electing to send anonymous data, Airship sends all events to Tealium regardless of whether the user is identified with a Visitor ID or Secondary Visitor ID. See also [Airship incoming webhook setup guide](https://docs.tealium.com/server-side/data-sources/webhooks/airship/) in Tealium's *Incoming Webhooks* documentation. # Treasure Data > Treasure Data offers an enterprise customer data platform that unifies all types of online, offline, and IoT device customer data. You can set up an inbound integration in Airship or an outbound integration in Treasure Data. See Treasure Data's [April 2021 release note](https://docs.treasuredata.com/release-notes/archive/2021/april-2021-release-note#airship-import-and-export-integrations) about Airship Import and Export Integrations. ## Inbound integration With an inbound integration, you can do the following directly from Treasure Data: * **Export audience lists**: Send predefined lists of users from Treasure Data directly to create Airship [Uploaded (Static) Lists](https://www.airship.com/docs/reference/glossary/#uploaded_list) for targeted messaging and campaigns. * **Export custom events**: Export custom event data, such as omnichannel events from web, CRM, or POS systems, to Airship. * **Synchronize Attributes**: Update both non-JSON (text, number, date/time) and JSON [Attributes](https://www.airship.com/docs/reference/glossary/#attributes) on Airship users. You have granular control to set or remove Attribute values and specify whether to target [Named Users](https://www.airship.com/docs/reference/glossary/#named_user) or individual channels. For large volumes of data, the integration supports and recommends batch CSV uploads specifically for efficiently adding and updating Attributes in Airship. ### Inbound integration requirements This integration requires these accounts: 1. Treasure Data 1. Airship — Must include messaging ### Configure the inbound integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Treasure Data**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create an authentication token. Treasure Data uses the token to communicate with your project in Airship. * Configure the Airship integration in Treasure Data. For additional implementation steps, see the Treasure Data documentation: * [Airship Export Integration](https://docs.treasuredata.com/int/airship-export-integration) * [Airship Export Integration CLI](https://docs.treasuredata.com/int/airship-export-integration-cli) ## Outbound integration You can configure an Airship outbound integration in Treasure Data so you can import the following: * **Uploaded (Static) Lists**: Synchronize Airship [Uploaded (Static) Lists](https://www.airship.com/docs/reference/glossary/#uploaded_list) with profiles stored in the Treasure Data database. * **User data**: Send information, such as [Named User](https://www.airship.com/docs/reference/glossary/#named_user) IDs, to enrich Treasure Data user profiles. * **Reporting data**: Import various Airship report types, including Custom Event, Opt-in, Opt-out, Time In App, Web Response, Response List, and Device reports, to analyze marketing strategy and campaign performance. See [Airship Import Integration](https://docs.treasuredata.com/int/airship-import-integration) in Treasure Data's Integrations Portal documentation. # Woosmap > Deliver the right messages at the right time, and in the right place. Make your app location-aware and benefit from dedicated [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) to trigger messages with Airship. This means you can design personalized Airship [Sequences](https://www.airship.com/docs/reference/glossary/#sequence) and [Automations](https://www.airship.com/docs/reference/glossary/#automation) based on location. * The Woosmap Geofencing SDK adds to your app: Geofencing, users' background location, and geographic behavior analysis capabilities. * You can manage your assets (stores, points of interest, branches, competitors, etc.) in Woosmap and add even more depth to your location-based scenarios. ## Woosmap Integration Requirements * **Accounts** 1. Woosmap 1. Airship — Must include: * Messaging * **Airship project** * The Airship SDK must use the same user identity as the Woosmap SDK. ## Configuring the Woosmap Integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Woosmap**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to create [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event). See [Woosmap documentation](https://developers.woosmap.com/products/geofencing-sdk/integration/airship/) for more information. # Zeotap > Zeotap CDP is the easy, secure, and impactful customer data platform made in Europe for Europe. Zeotap CDP empowers brands to integrate, unify, segment and orchestrate customer data now and in the cookieless future, all while putting consumer privacy and compliance front and center. These integrations support: * Creating [Uploaded (Static) Lists](https://www.airship.com/docs/reference/glossary/#uploaded_list) * Setting [Custom Events](https://www.airship.com/docs/reference/glossary/#custom_event) * [Named User](https://www.airship.com/docs/reference/glossary/#named_user) export * [Real-Time Data Streaming (RTDS)](https://www.airship.com/docs/reference/glossary/#rtds) ## Zeotap Integration Requirements * **Accounts** 1. Zeotap 1. Airship * Messaging * [Real-Time Data Streaming](https://www.airship.com/docs/reference/feature-packages/#data) — *Required for outbound integration only* * **Airship project** * [Named User](https://www.airship.com/docs/reference/glossary/#named_user) must be enabled for your project — *Required for inbound integration only* ## Configuring the inbound integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Zeotap**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create an authentication token. Zeotap uses the token to communicate with your project in Airship. * Configure Airship in Zeotap. ## Configuring the outbound integration In Airship: 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Zeotap**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Set up Airship Real-Time Data Streaming in Zeotap as a source. * Enter your Zeotap API Endpoint URL and Write Key in Airship. * Select the Airship events to send to Zeotap. For information about using this integration, see [Zeotap documentation](https://docs.zeotap.com/articles/#!integrate-customer/airship). # Zeta Global > Create and adapt powerful app experiences that accelerate customer understanding for next-level personalization to capture more business value for everyone involved. To create and adapt powerful app experiences that accelerate customer understanding for next-level personalization to capture more business value for everyone involved, Zeta has partnered with Airship, a leader in the space of push notifications with proven scale and a significant integration footprint. With this, we are leapfrogging our mobile app strategy and in no time, expanding to deliver data-driven personalized experiences to you all. Owing to this integration with Airship, you now have a multitude of options for push notification solutions to choose from: * Deliver and report on mobile push messages * Send push notifications to Android or iOS through the familiar interface of building Broadcast Campaigns or Experience Builder * Retrieve push notification events and track your campaign’s performance through Report Builder ## Zeta Global Integration Requirements **Accounts** 1. Zeta Global 1. Airship — Must include messaging ## Configuring the inbound Zeta Global Integration 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Zeta Global**. 1. Select **Configure** for the inbound integration and follow the onscreen instructions to: * Create an authentication token. Zeta uses the token to communicate with your project in Airship. * Add a new connector for Airship in Zeta Global. ## Configuring the outbound Zeta Global Integration 1. Next to your project name, select the dropdown menu ( ), then **Settings**. 1. Under **Project settings**, select **Partner Integrations**. 1. Select **Zeta Global**. 1. Select **Configure** for the outbound integration and follow the onscreen instructions to: * Provide your Zeta Marketing Platform endpoint URL * Select the Airship events to send to Zeta Global For information about configuration and usage, see Zeta's [Airship integration](https://knowledgebase.zetaglobal.com/kb/integration-with-airship) documentation.