# Twitter Ads

## Getting Started

To connect the Twitter Ads integration, follow these steps:

1. **Sign In:** A Twitter login window will appear, sign in and proceed to the next step of granting permissions
2. **Grant Permissions:** Review the requested permissions, such as access to your ad accounts and campaigns. Click **Allow** to grant the necessary permissions.
3. **Confirmation:** After granting permissions, you'll be redirected back to HockeyStack

## What Data Gets Tracked as Metadata

The following fields are tracked and stored during the integration process:

| **Field**           | **Description**                                                       |
| ------------------- | --------------------------------------------------------------------- |
| `account_id_hashed` | A hashed version of the account ID for secure storage.                |
| `type`              | The type of tracked data, such as `paid-ads`.                         |
| `date`              | The date of the ad activity, formatted as `YYYY-MM-DD`.               |
| `id`                | A unique identifier for each data row, generated as an MD5 hash.      |
| `metadata`          | A JSON object containing detailed metadata about the campaign and ad. |
| `account_id`        | The original account ID associated with the ad.                       |
| `network`           | The advertising network, such as `Twitter Ads`.                       |
| `campaign_id`       | The unique ID of the campaign.                                        |
| `adgroup_id`        | The unique ID of the ad group.                                        |
| `ad_id`             | The unique ID of the ad.                                              |
| `campaign_name`     | The name of the campaign.                                             |
| `adgroup_name`      | The name of the ad group.                                             |
| `ad_name`           | The name of the ad.                                                   |
| `utm_source`        | The source of the traffic, such as `twitter`.                         |
| `utm_campaign`      | The campaign name, URL-encoded if necessary.                          |
| `utm_medium`        | The medium of the traffic, such as `paid`.                            |
| `utm_content`       | Content-specific identifier for the campaign.                         |
| `impressions`       | The total number of impressions for the ad.                           |
| `clicks`            | The total number of clicks for the ad.                                |
| `cost`              | The total cost of the ad campaign in the specified currency.          |
| `currency`          | The currency in which the ad costs are measured (e.g., `USD`).        |

## High-Level Integration Flow

1. **Validation**:
   * We validate the `accessToken` and `tokenSecret` to ensure they are associated with an advertiser account.
   * The start of the integration process is logged for debugging and tracking purposes.
2. **Ad Data Retrieval**:
   * We fetch ad data using `getPromotedTweets`, `getPromotedAccounts`, and `getMediaCreatives`.
   * Campaigns and line items are retrieved using `getCampaigns` and `getLineItems` for comprehensive data tracking.
3. **Analytics Jobs**:
   * Analytics jobs are created for ad placements (e.g., `ALL_ON_TWITTER` and `PUBLISHER_NETWORK`) via `startAnalyticsJob`.
   * Completed analytics jobs are processed using `readAsyncJobResult` to gather metrics.
4. **Data Formatting**:
   * Analytics and ad data are formatted using `formatData` to create a unified structure.
   * UTM parameters, impressions, clicks, and cost metrics are included in the formatted data.
5. **Data Insertion**:
   * Formatted data is stored in the metadata system using `insertToMetadata`.
   * The account’s last processed date is updated to prevent redundant data processing.

## Notes and Caveats

* **Token Handling**:
  * The integration uses `accessToken` and `tokenSecret` to authenticate requests.
* **Data Splitting**:
  * Date ranges are split into 60-day increments to manage large datasets efficiently.
