# Documentation

Learn the concepts of Freshpaint and how to use them effectively

Freshpaint is a tool for teams with limited technical resources to manage and control their customer data. Freshpaint enables non-technical users to set up their favorite analytics and marketing tools with limited input from a technical user.

## Common Use Cases

{% content-ref url="/pages/-MA7fP-NORUW1NBgRHKI" %}
[Add Autotrack to your website to collect data from your users](/readme/guides/quickstart)
{% endcontent-ref %}

{% content-ref url="/pages/ItrQh2J3uAEyLEBIDNwz" %}
[HIPAA Mode](/readme/hipaa-mode)
{% endcontent-ref %}

{% content-ref url="/pages/t0EpZDjQsQx3O8Bvouup" %}
[Send historical data to any destination with Time Machine](/readme/guides/time-machine)
{% endcontent-ref %}

## Getting Started

Learn what you have to do to get your Freshpaint account ready to send data to your destinations.

{% content-ref url="/pages/-MA7fXEzWqQH8ON4yjiu" %}
[Building Out Your Account](/readme/building-out-your-account)
{% endcontent-ref %}

## Everything else

Learn more about what Freshpaint has to offer here:

{% content-ref url="/pages/-MA7m48mwHOs5Ap1-kee" %}
[Overview of Features](/readme/overview-of-features)
{% endcontent-ref %}


# What is Freshpaint?

\
At Freshpaint, we’re helping healthcare companies grow without compromising patient privacy. Our platform makes it possible to use modern analytics and marketing tools while staying HIPAA compliant. Behind the scenes, we’re solving complex data problems so healthcare marketers can move fast, reach more people, and expand access to care.

### Traditional Customer Data Platforms Aren’t Designed For Healthcare

Customer Data Platforms promise to make sending data to any tool easy. That’s a problem for healthcare marketers because regulations around patient privacy prohibit sharing sensitive information.

Being a healthcare marketer requires more control over the data that’s shared. That’s where Freshpaint comes in

### HIPAA compliant at its core

Freshpaint’s Business Associate Agreement is more than just a piece of paper. That’s because it’s combined with our industry-first Healthcare Privacy Platform that helps prevent Protected Health Information from being shared with all your non-HIPAA compliant tools.

### Instrument your site without writing code

Most analytics tools require you to write code every time you want to collect a new piece of data. Once installed, Freshpaint automatically captures every click, pageview, and form submission. This makes it possible for non-technical users to route data from Freshpaint into any marketing or analytics tool.

### Block Data By Default

Instead of requiring you to filter out sensitive data, Freshpaint’s default state doesn’t share anything at all. Freshpaint’s unique opt-in approach is the safest way to prevent inadvertently sharing protected health information with marketing tools that aren’t HIPAA-compliant.

### Stitch Together Multiple Visitor Sessions

Analytics tools require identifiers, like IP addresses, to connect unique visitors to individual sessions. Since HIPAA regulations prohibit sharing identifiers, how do you get a complete view of the visitor journey? That's where Freshpaint comes in.


# HIPAA Mode

Freshpaint provides several features to restrict and manage Protected Health Information (PHI) in your customer data.

HIPAA mode is a feature that Freshpaint provides to give customers full control over what [Protected Health Information](https://www.hhs.gov/answers/hipaa/what-is-phi/index.html) (PHI) is sent to their destinations. Freshpaint allows you to configure explicit lists of properties, called allowlists, for each of your destinations so you opt into what you send and how you send it.

## What is PHI?

PHI is the combination of Personal Identifiable Information (PII) and health information. Examples of PII include:

* Names
* IP Addresses
* Non-anonymized user IDs
* Emails

Examples of health information include:

* Diagnoses
* Treatment information
* Medical test results
* Prescription information

## Enforced Allowlists

{% embed url="<https://www.youtube.com/watch?v=TaN1x1dwYoo>" %}
Watch this video to learn how to use allowlists in Freshpaint
{% endembed %}

The Enforced Allowlists feature allows you to send properties classified as PHI to your HIPAA-compliant destinations, and send only non-PHI properties to non-HIPAA compliant destinations. Freshpaint does this by allowing you to specify a list of properties that are known to not contain PHI. Whenever Freshpaint sees a property that is not in this allowlist, Freshpaint will remove the property before sending the event to non-HIPAA compliant destinations.

### Project Allowlist

Navigate to the Project Allowlist page to specify which properties are not considered PHI for your Freshpaint Project.

{% hint style="info" %}
Properties allowed at the Project level will be automatically applied to all Destination Allowlists.
{% endhint %}

<figure><img src="/files/1KGbZda5wcBNTXiISiyf" alt=""><figcaption></figcaption></figure>

### Destination Required Properties

In addition to the Project Allowlist, each destination that supports server-side connection mode has its own allowlist.

In order for Freshpaint to be able to send data to the destination, you must allow each of the required properties. These settings will not affect any other destination.

<figure><img src="/files/9H16et7UJI2SKvEPRjSO" alt=""><figcaption><p>Some destinations offer Required Properties for you to add to the allowlist</p></figcaption></figure>

For example, the Google Ads destination requires the `$gclid` and `conversion_label` properties. Without these properties, Google Ads will not be able to attribute conversions to your ad campaigns, so the destination will not be able to function.

<figure><img src="/files/R6WF2KJAW2Zz0DqaUyp9" alt=""><figcaption><p><code>$gclid</code> and <code>conversion_label</code> are Required Properties for Google Ads</p></figcaption></figure>

### Destination Recommended Properties

Certain destinations have additional functionality that is controlled by certain event properties. Freshpaint indicates these properties as "Recommended" and describes the functionality they enable.

<figure><img src="/files/OSteDqd5IboRcqFiRscn" alt=""><figcaption><p>Some destinations offer Recommended Properties for you to add to the allowlist</p></figcaption></figure>

For example, to enable the Conversions Report for Google Analytics 4, you would need to allow the `conversion` property.

<figure><img src="/files/zrYc6P6O95zGv30CNBA7" alt=""><figcaption><p>To enable the Conversions Report in Google Analytics 4, allow the <code>conversion</code> property</p></figcaption></figure>

### Destination Allowlist

In addition to required and recommended properties, each destination that supports server-side connection mode has a full allowlist, similar to the Project Allowlist. You can use this advanced feature if you need to add properties to the destination's allowlist that are not covered by the Required or Recommended properties.

{% hint style="info" %}
All of the Required and Recommended Properties that you have allowed will be shown on the Destination Allowlist.
{% endhint %}

<figure><img src="/files/O862b3FyhEjmp9uYHfmJ" alt=""><figcaption><p>Navigating to the Destination Allowlist</p></figcaption></figure>

Add properties to the destination's allowlist if they're known to be safe to send to that specific destination. For example you may add the Facebook Ad Click ID to the allowlist for Facebook Conversions API in order to track conversions from your ad campaigns.

<figure><img src="/files/mkQjcHZoCQBrdRcDvyzb" alt="" width="563"><figcaption><p>The Facebook Conversions API Destination Allowlist</p></figcaption></figure>

{% hint style="warning" %}
Required Properties, Recommended Properties, and Destination Allowlists are available in the latest version of Freshpaint HIPAA Mode. Contact <support@freshpaint.io> to learn more.
{% endhint %}

### Built-in Properties

Freshpaint captures a number of properties automatically for each event, for example the URL of the page on which the event occurred. These are known collectively as [built-in properties](/reference/faqs/what-data-does-freshpaint-collect/autotrack#properties-captured). You can use the PHI Allowlist to specify which ones are known not to contain PHI.

{% hint style="warning" %}
Built-in Property Allowlisting is available in the latest version of Freshpaint HIPAA Mode. Contact <support@freshpaint.io> to learn more.
{% endhint %}

<figure><img src="/files/rbD5uzGyqqik9rMeos3A" alt="" width="377"><figcaption><p>Built-in and Custom Property Allowlist</p></figcaption></figure>

Most of these built-in properties are documented under [What Data Does Freshpaint Collect?](/reference/faqs/what-data-does-freshpaint-collect/autotrack#properties-captured). Special attention should be paid to **URL, UTM Parameters, and Other Query Parameters**. Suppose an event occurs on `http://shoes.com/the/best/shoe?utm_term=shoes&page=2`. The following table illustrates the value of the `$current_url` property under different allowlist configurations.

<table><thead><tr><th width="100" data-type="checkbox">URL</th><th width="122" data-type="checkbox">UTM Term</th><th width="129" data-type="checkbox">Other Query Parameters</th><th>$current_url property</th><th>Notes</th></tr></thead><tbody><tr><td>false</td><td>false</td><td>false</td><td><code>http://shoes.com/url-redacted-by-freshpaint</code></td><td>When URL is not on the allowlist, Freshpaint will still send the domain name to destinations, along with a fake path that indicates the real path was redacted.</td></tr><tr><td>true</td><td>false</td><td>false</td><td><code>http://shoes.com/the/best/shoe</code></td><td>The domain name and path are preserved but all query parameters are removed</td></tr><tr><td>true</td><td>true</td><td>false</td><td><code>http://shoes.com/the/best/shoe?utm_term=shoes</code></td><td>The <code>page</code> query parameter is removed.</td></tr><tr><td>true</td><td>false</td><td>true</td><td><code>http://shoes.com/the/best/shoe?page=2</code></td><td>Since Other Query Parameters are allowlisted, any query parameters that aren't UTM parameters are preserved, in this case, <code>page=2</code>. The <code>utm_term</code> query parameter is removed.</td></tr><tr><td>true</td><td>true</td><td>true</td><td><code>http://shoes.com/the/best/shoe?utm_term=shoes&#x26;page=2</code></td><td>The entire URL is allowed to be sent to the destination.</td></tr></tbody></table>

### Custom Properties

Events may have additional custom properties beyond those automatically captured by Freshpaint, for example if you're using [Freshpaint Web SDK Reference](/reference/developer/freshpaint-sdk-reference#addeventproperties) to add data layer properties to your events. You can use the PHI Allowlist to specify the custom properties that are known not to contain PHI.

### User & Group Properties

There are separate allowlists for user properties, which are attached to [`freshpaint.identify`](/reference/developer/freshpaint-sdk-reference#identify) calls, and for group properties, which are attached to [`freshpaint.group`](/reference/developer/freshpaint-sdk-reference#group) calls.

<figure><img src="/files/FzgtHscDhIavxgUckRcY" alt="" width="563"><figcaption><p>Event, User, and Group Allowlists</p></figcaption></figure>

## ID Masking

ID Masking allows you to [identify users](/readme/setting-up-identify) in Freshpaint without sending the identifier to non-HIPAA compliant destinations. Freshpaint does this by *hashing* the user identifier before sending events to non-HIPAA compliant destinations. This anonymizes the user identifier, while still associating events with a single identified user and preserving functionality like identity resolution.

Here's an example. Suppose you identified a user by their email address:

```javascript
freshpaint.identify("some_distinct_id", {
  "email": "ada.lovelace@example.com",
  "browser": "Chrome"
});
```

Masking would send values like `ada.lovelace@example.com` in a hashed form, scrambled in such a way that a reader at the destination will be unable to determine the original value. This hashing is consistent for a given value. If `ada.lovelace@example.com` is hashed into `iuUwhqIm1kEriZsVlu5TsGgX6/y5Pwfn`, then you can count on it being that value every time in your destinations.

ID Masking is automatically performed on builtin user identifiers for non-HIPAA compliant destinations. To turn on ID Masking for additional properties, you must configure the allowlist for your destination. Add the property you want to allow, then check the `Hashed?` option.

<figure><img src="/files/ELXFsoKWPZ2wBc4qmaKq" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Freshpaint uses the [SHAKE3 hash algorithm](https://en.wikipedia.org/wiki/SHA-3) for ID masking
{% endhint %}

## Server-side Destinations

Freshpaint's HIPAA mode requires your destinations be configured with a server-side connection. If one of your destinations only supports a client-side connection, you will not be able to use them in HIPAA mode.

## Restricting PHI without HIPAA mode enabled

You may want to send events to a non-HIPAA compliant destination without applying ID Masking or Allowlists. This might be the case when:

* You want to send events to a non-HIPAA compliant destination that only supports Client-side connection mode, so you need to disable HIPAA mode to use the client-side destination.

{% hint style="success" %}
Example: you want to send events to Hotjar, which only supports client-side connections.
{% endhint %}

* You want to send events to a non-HIPAA compliant destination, and the destination needs the original user identifier, so you need to disable ID masking.

{% hint style="success" %}
Example: you want to send events to your email marketing platform, and you need to preserve the user's email address.
{% endhint %}

To avoid sending PHI to a non-HIPAA compliant destination, you must restrict PII, health information, or both. Note that this restriction is scoped to all API calls made for a user. For example:

* You attach PII (but not health information) to an anonymous user in a destination with a `Freshpaint.identify()` API call
* Later on, you send a `Freshpaint.track()` API call containing health information (but not PII) to the same destination for this anonymous user

You're still sending PHI to the destination, since the destination has received both PII and health information for the same user, even though this information was received in different requests.

When determining whether a destination may collect PHI, it's important to understand exactly what metadata and properties a destination collects, and whether these metadata and properties contain PII or health information.

For example, the Freshpaint [Bing Ads](https://help.ads.microsoft.com/#apex/3/en/53056/1/#exp151) destination, when configured in client-side connection mode, collects IP addresses, Freshpaint event names, and page URLs (alongside other metadata). Because an IP address is PII, it's important to ensure the event names and page URLs collected by Bing Ads do not include health information.

If you're unsure whether one of your destinations is collecting PHI, don't hesitate to reach out to <support@freshpaint.io>.

And of course, you should always consult with your legal team.


# Building Out Your Account

This series of guides will walk you through everything you need to completely setup your account. This series consists of the following guides:

## Setting up Your Destinations

Destinations are the places Freshpaint sends data to. Setting up Your Destinations walks you through how to setup a destination.

{% content-ref url="/pages/-MAbiLEGmIYGWwOFen2x" %}
[Setting up Your Integrations](/readme/setting-up-your-destinations)
{% endcontent-ref %}

## Setting up Your Events

Events are how you control data as it flows through Freshpaint. By defining events, you are able to select specific types of data that are important to you and control which destinations they are sent to. This guide walks you through the different ways you can create events in Freshpaint.

{% content-ref url="/pages/-MAbi6\_nuLVkM18dgjUf" %}
[Setting up Your Events](/readme/setting-up-your-events)
{% endcontent-ref %}

## Setting up Identify

Identify is how you stitch data for a user from multiple different places together. This guide walks you through how to attach information to users.

{% content-ref url="/pages/-MAbiGEe2YpMYAFwE0vv" %}
[User Identification](/readme/setting-up-identify)
{% endcontent-ref %}

## Setting up Properties

Out of the box Freshpaint collects a decent amount of data, but there may be some additional contextual information you want to attach to your events. The Setting up Properties guide walks you through how to attach more information to your events.

{% content-ref url="/pages/-MAbiTXcTQpT1UTK\_7K5" %}
[Setting up Properties](/readme/setting-up-properties)
{% endcontent-ref %}


# Onboarding Readiness Guide

Leverage this guide ahead of your kick-off call with Freshpaint to ensure we maximize success through the implementation process.

### How should this guide be used?

**Your journey with Freshpaint begins here!** This guide is your roadmap to a smooth and efficient Freshpaint onboarding experience. Use it to align your internal teams, gather the necessary technical and compliance approvals, and ensure all required platforms and credentials are ready before implementation begins.

Share this guide with key stakeholders such as engineering, product, marketing, and compliance to ensure everyone is prepared for a successful launch! 🚀

Freshpaint's safe by default approach to data sharing gives customers control over what data to share with analytics and marketing tools. This enables effective analytics and marketing approaches while remaining HIPAA compliant.

### Onboarding Checklist :white\_check\_mark:

Before diving into Freshpaint's onboarding process, it's essential to ensure your team is fully prepared. Completing these steps ahead of time will streamline your setup, reduce delays, and accelerate your time to value with Freshpaint.

* [ ] Identify and mobilize your Freshpaint onboarding and implementation stakeholders. This should include: Freshpaint admin(s), onboarding project manager, marketing and performance stakeholders including agency partners, and legal / privacy / compliance.
* [ ] Gather necessary information for implementation setup and access requirements.
* [ ] Review the Freshpaint implementation scope details for your services tier.
* [ ] Ensure your legal/compliance team has reviewed Freshpaint's required and recommended Allowlist properties prior to kickoff.
* [ ] Review Freshpaint's [product documentation](https://documentation.freshpaint.io/) to familiarize yourself with our implementation quick start guides and best practices.
* [ ] Review [Freshpaint's Privacy Hub](https://www.freshpaint.io/healthcare-privacy-hub) for articles, videos, and thought leadership about healthcare privacy.

### Who should be involved in onboarding?

Successful Freshpaint onboarding requires collaboration across multiple teams within your organization. From technical implementation to compliance approvals, each stakeholder plays a key role in ensuring a smooth setup. The table below outlines the primary participants and their responsibilities, helping you align the right people from the start. Engaging these teams early will streamline the process and accelerate your time to value with Freshpaint.

#### Key Stakeholder Roles

<table><thead><tr><th width="200.33333333333331" align="center">Key Stakeholder</th><th width="203.87109375" align="center">Description</th><th width="144.18359375" align="center">Level of Effort</th><th align="center">Stage/MileStone</th></tr></thead><tbody><tr><td align="center">Executive Sponsor</td><td align="center"><p>Champions Freshpaint strategically, aligning</p><p>it with business goals, securing resources,</p><p>and removing blockers to drive its adoption</p><p>and success.</p></td><td align="center"><p>1 to 2</p><p>hours</p></td><td align="center"><p>Kickoff(s)</p><p>Launch Validation</p></td></tr><tr><td align="center">Freshpaint<br>Admin/Owner</td><td align="center"><p>Authorized to manage Freshpaint projects,</p><p>environments, role-based access, and</p><p>configuration updates.</p></td><td align="center"><p>4 to 6</p><p>hour</p></td><td align="center">All</td></tr><tr><td align="center">Project Manager</td><td align="center"><p>Oversees implementation planning,</p><p>execution, and delivery, coordinating teams</p><p>and timelines to achieve project goals</p><p>efficiently.</p></td><td align="center"><p>10 to 20</p><p>hours</p></td><td align="center">All</td></tr><tr><td align="center"><p>Performance</p><p>Stakeholders</p><p>(Internal or Agency</p><p>Partner)</p></td><td align="center"><p>SME(s) of advertising and analytics</p><p>platforms. Familiarity with key performance</p><p>indicators (KPIs), ensuring alignment with the</p><p>context and expected outcomes of the data</p><p>captured by Freshpaint.</p></td><td align="center"><p>6 to 10</p><p>hours</p></td><td align="center"><p>Implementation</p><p>Pre-launch</p><p>Validation</p><p>Launch Validation</p></td></tr><tr><td align="center">Legal/Compliance</td><td align="center"><p>Ensures processes, data handling, and</p><p>systems comply with HIPAA, safeguarding</p><p>privacy and security, advising on risk,</p><p>overseeing audits, and upholding legal</p><p>standards.</p></td><td align="center"><p>1 to 2</p><p>hours</p></td><td align="center"><p>Implementation</p><p>Pre-launch</p><p>Validation</p></td></tr></tbody></table>

### Implementation Setup & Access Requirements

This section outlines the common platforms we integrate with, the necessary credentials for configuration, and level of access that your Freshpaint onboarding resource may require. Having these ready in advance will help your onboarding team configure Freshpaint efficiently and avoid setup delays.

Note: This table includes the most commonly configured destinations. For a full list of supported destinations and associated quick start guides, please visit <https://documentation.freshpaint.io/>.

<table><thead><tr><th width="151.70442708333331" align="center">Platform</th><th width="338.29296875">Configuration Requirements</th><th align="center">Requested Access for Freshpaint</th></tr></thead><tbody><tr><td align="center"><strong>Google Tag Manager*</strong></td><td><ul><li>Access to relevant container(s)</li><li>Audit tags - pause/remove tags no longer in use</li></ul><p>*only required if maintaining use of</p><p>GTM with Freshpaint</p></td><td align="center">Edit</td></tr><tr><td align="center"><strong>Google Analytics</strong></td><td><ul><li>Your Google Analytics Measurement ID</li><li>A test property in GA4 to validate data in parallel with your native setup (<a href="https://scribehow.com/viewer/Create_a_Freshpaint_Test_Property_in_Google_Analytics__PyzvKZoLTB6Rgt6au6nJzQ">instructions</a>)</li></ul></td><td align="center">Read/View</td></tr><tr><td align="center"><strong>Google Ads</strong></td><td><ul><li>Your Google Ads Conversion ID</li><li>Conversion Actions configured in your Google Ads account</li></ul></td><td align="center">Read/View</td></tr><tr><td align="center"><strong>Meta Ads</strong></td><td><ul><li><p>Your Facebook Pixel ID and</p><p>Access Token</p></li></ul></td><td align="center">Read/View</td></tr><tr><td align="center"><strong>Microsoft (Bing) Ads</strong></td><td><ul><li>Your Microsoft Ads UET Tag ID</li></ul></td><td align="center">Read/View</td></tr></tbody></table>

### Required & Recommended Allowlist Properties

Before onboarding, it's essential to review Freshpaint's recommended Allowlist properties with your legal and compliance teams. This review ensures alignment on the data that will be shared with your marketing and analytics tools during setup and configuration. By confirming these selections in advance, you can help streamline the implementation process and ensure Freshpaint is configured to meet your organization's data governance standards.

#### Required Properties

Freshpaint's server-side connection mode may require destination-specific properties indicated as "Required" that are essential for functionality.

#### Recommended Properties

Destinations may also have additional functionality that is controlled by certain event properties. Freshpaint indicates these properties as "Recommended" and describes the functionality they enable.

[Click here for Freshpaint's Destination Allowlist overview](https://6516988.fs1.hubspotusercontent-na1.net/hubfs/6516988/Freshpaint%20Required%20and%20Recommended%20Data%20Properties.pdf)

### What to expect from your Freshpaint Onboarding

Your Freshpaint onboarding is designed to provide hands-on support, technical guidance, and best practices to ensure a smooth and successful implementation. Here's what you can expect:

* **Dedicated Onboarding Support** – A Customer Success Engineer will guide you through the entire onboarding journey, ensuring you stay on track.
* **Best Practices & Recommendations** – Expert guidance on setting up your Freshpaint account for optimal tracking and data governance.
* **Technical Support & Configuration** – Assistance with event tracking, tool integrations, and troubleshooting to ensure everything is set up correctly.
* **Ongoing Customer Support** – Beyond onboarding, your Freshpaint team includes your named Account Manager and Freshpaint's technical support staff.

#### Key Implementation Milestones

{% columns %}
{% column width="50%" %}

* [x] **Partnership Kickoff**

Introduction to the partnership, understand key milestones in Freshpaint's customer journey, and create your success plan.

* [x] **Working Sessions**

These sessions are essential for ensuring a successful implementation and require active participation from your team.

* [x] **Launch Validation**

Review onboarding milestones and success criteria, and align on next steps for a successful partnership. This marks the completion of you onboarding engagement with Freshpaint.
{% endcolumn %}

{% column width="50%" %}

* [x] **Implementation Call**

Introduction to implementation, confirmation on initial scope and requirements, and jobs to be done.

* [x] **Technical Enablement**

A training session for Freshpaint Admin/Owner(s) on account setup, configuration, and best practices.

* [x] **Project Management**

Your Freshpaint onboarding includes regular status emails and a shared project tracker, providing clear visibility into progress, key milestones, and outstanding implementation tasks.
{% endcolumn %}
{% endcolumns %}

### Freshpaint Standard Onboarding Scope

#### Level 1 Support & Services

*Onboarding scope to be completed within 6 months of implementation kickoff*

<table><thead><tr><th width="360.4739583333333" align="center">Onboarding Delivery</th><th width="338.29296875" align="center">Description</th></tr></thead><tbody><tr><td align="center"><strong>Maximum Projects / Domains</strong></td><td align="center">1</td></tr><tr><td align="center"><p><strong>Google Tag Manager - Tag</strong></p><p><strong>Migration</strong></p></td><td align="center"><p>All supported tags included (based on contract</p><p>entitlements)</p></td></tr><tr><td align="center"><p><strong>Net New Event Tags / Freshpaint</strong></p><p><strong>Event Creation</strong></p></td><td align="center">Up to 5 Events</td></tr><tr><td align="center"><strong>Onboarding Milestones</strong></td><td align="center"><p>1 x Implementation Call (60 min)</p><p>5 x Working Sessions (60 min)</p><p>1 x Technical Enablement (60 min)</p><p>1 x Launch Validation (60 min)</p></td></tr><tr><td align="center"><strong>Destinations / Entitlements</strong></td><td align="center">Analytics, Direct-response Ads (Google, Meta)</td></tr><tr><td align="center"><strong>Call Tracking</strong></td><td align="center">CallRail <em>(if applicable)</em></td></tr><tr><td align="center"><strong>Project Management</strong></td><td align="center"><p>Optional Bi-Weekly Syncs (30 min)</p><p>Weekly Email Status Updates</p><p>Monday.com Onboarding Tracker</p></td></tr></tbody></table>

#### Level 2 Support & Services

*Onboarding scope to be completed within 6 months of implementation kickoff*

<table><thead><tr><th width="360.4739583333333" align="center">Onboarding Delivery</th><th width="338.29296875" align="center">Description</th></tr></thead><tbody><tr><td align="center"><strong>Maximum Projects / Domains</strong></td><td align="center">Up to 2</td></tr><tr><td align="center"><p><strong>Google Tag Manager - Tag</strong></p><p><strong>Migration</strong></p></td><td align="center"><p>All supported tags included (based on contract</p><p>entitlements)</p></td></tr><tr><td align="center"><p><strong>Net New Event Tags / Freshpaint</strong></p><p><strong>Event Creation</strong></p></td><td align="center">Up to 10 Events</td></tr><tr><td align="center"><strong>Onboarding Milestones</strong></td><td align="center"><p>1 x Implementation Call (60 min)</p><p>8 x Working Sessions (60 min)</p><p>2 x Technical Enablement (60 min)</p><p>1 x Launch Validation (60 min)</p></td></tr><tr><td align="center"><strong>Destinations / Entitlements</strong></td><td align="center"><p>Analytics, Direct-response Ads (Google,</p><p>Facebook, Microsoft, TikTok, LinkedIn,</p><p>Pinterest, and X)</p></td></tr><tr><td align="center"><strong>Additional Feature Support</strong></td><td align="center">Embedded Video, Web Tracker Monitoring</td></tr><tr><td align="center"><strong>Call Tracking</strong></td><td align="center">CallRail or Invoca <em>(if applicable)</em></td></tr><tr><td align="center"><strong>Project Management</strong></td><td align="center"><p>Weekly Syncs (30 min)</p><p>Weekly Email Status Updates</p><p>Monday.com Onboarding TrackerMaximum Projects / Domains</p></td></tr></tbody></table>

#### Level 3 Support & Services

*Onboarding scope to be completed within 6 months of implementation kickoff*

<table><thead><tr><th width="360.4739583333333" align="center">Onboarding Delivery</th><th width="338.29296875" align="center">Description</th></tr></thead><tbody><tr><td align="center"><strong>Maximum Projects / Domains</strong></td><td align="center"><em>To be scoped with customer</em></td></tr><tr><td align="center"><p><strong>Google Tag Manager - Tag</strong></p><p><strong>Migration</strong></p></td><td align="center"><p>All supported tags included (based on contract</p><p>entitlements)</p></td></tr><tr><td align="center"><p><strong>Net New Event Tags / Freshpaint</strong></p><p><strong>Event Creation</strong></p></td><td align="center"><em>To be scoped with customer</em></td></tr><tr><td align="center"><strong>Onboarding Milestones</strong></td><td align="center"><p>1 x Implementation Call (60 min)</p><p>Ad Hoc Working Sessions (60 min)</p><p>2 x Technical Enablement (60 min)</p><p>1 x Launch Validation (60 min)</p></td></tr><tr><td align="center"><strong>Destinations / Entitlements</strong></td><td align="center"><p>Analytics, Direct-response Ads (Google,</p><p>Facebook, Microsoft, TikTok, LinkedIn,</p><p>Pinterest, and X), GCM 360 Floodlight support,</p><p>Demand-side platform support</p></td></tr><tr><td align="center"><strong>Additional Feature Support</strong></td><td align="center"><p>Embedded Video, Embedded Maps, Web</p><p>Tracker Monitoring, SSO, RBAC</p></td></tr><tr><td align="center"><strong>Call Tracking</strong></td><td align="center">CallRail or Invoca <em>(if applicable)</em></td></tr><tr><td align="center"><strong>Project Management</strong></td><td align="center"><p>Weekly Syncs (30 min)</p><p>Weekly Email Status Updates</p><p>Monday.com Onboarding Tracker</p><p>Named Customer Success Engineer</p></td></tr></tbody></table>


# Overview of Features

A high-level overview of Freshpaint's main features.

## Sources

The sources page is where you handle getting data into Freshpaint.

![](/files/-MAm5-EqWiIo721vR0xD)

See the [docs on sources](/integrations/sources) for more information about the different sources Freshpaint supports and how to set them up.

## Destinations

The destinations page is where you control where the data in Freshpaint gets sent to.

![](/files/-MAm5_3-DQG6aMLd4UvW)

Freshpaint supports three kinds of destinations:

* Apps - These are SaaS tools that will process your data in some way.
* Warehouses - These are destinations that are data warehouses. They give you the flexibility to directly query your data.
* Advertising - These are destinations that allow you to target ads to specific users.

For more information about the different sources Freshpaint supports and the data you can send to them, see the [docs on destinations](/integrations/destinations).

## Transformations

Transformations lets you modify your events before they are sent to a destination.

![](/files/-MLOH8Pn9ioPn9fH06fj)

With transformations, you can rename events, rename properties, cast a string to a number, and more, before your data is sent to a destination.

For more information, check out the [transformations docs](/admin-panel/transformations).

## Event Library

The event library is where you manage what data gets sent to what destinations.

![](/files/-MAm6cmjCkR-BrtbG3Pw)

With the event library, you can view all of your existing event definitions, make changes to them, and control which events are sent to which destinations.

For more information about the event schema dashboard see the [event library docs](/admin-panel/events).

## Liveview

Liveview is how you can debug and inspect your Freshpaint instrumentation.

![](/files/-MAS2dbpTH8VZ_zDrKCy)

With liveview, you can see all the raw actions your users are performing on your site as well as when a specific event definition is performed on your site. You can even use live view to define events based on the raw actions performed.

See the [docs on liveview](/admin-panel/investigate-testing-and-debugging/liveview) for more information.

## Trace View

The Trace viewing tools lets you see how Freshpaint processed your users' events. We currently have two tools that let you inspect and discover what happened when processing your events:

(1) Trace View Summary: This tool lets you see a summary view of all the events that happened in a particular time frame.

<figure><img src="/files/6ohdfwq6TjeqdT9RtAJN" alt=""><figcaption><p>The Trace View Summary tool can be found on the Left main menu, under the "INVESTIGATE" section. Clicking the "VIEW" button on a Trace takes you to the second tool: the Trace Details View.</p></figcaption></figure>

(2) Trace Details View: This tool lets you drill down into a particular trace and view each step.

<figure><img src="/files/gUMiEMM8mdi1sDIqTNDq" alt=""><figcaption><p>The Trace Details View is accessed through the Trace View Summary tool. By clicking the "VIEW" button in the Trace View Summary, you are taken to an individual trace.</p></figcaption></figure>

To see more information about the Tracing tools and how to use them, see the [docs on Tracing](/admin-panel/investigate-testing-and-debugging/traces) for more information.

## Visual Tagger

The visual tagger provides a point and click interface for defining events. You don't have to write code to use it!

![](/files/-MASZFecErGrHcbkBVcA)

You just click on the part of your page you want to create an event definition for and the visual tagger will create it for you.

See the [docs on the visual tagger](broken://pages/-MA7m_EuXnptGT2gCPpE) for more information.

## Time Machine

The time machine lets you send old data that matches a newly created event definition to a destination. Freshpaint automatically collects every user action on your site once installed. If you create a new event definition six months after installing, you can use the time machine to send every user action ever performed on your site that matches the event definition to a destination.

See the [docs on the time machine](/admin-panel/events/time-machine) for more information.

## Teams Page

The teams page is where you can invite new users to your Freshpaint account and see who the members of your team are.

![](/files/-MAm9Srj0ccgy6Zoyxx9)

See the [docs on the teams page](/admin-panel/teams) for more information.


# Guides

Here you'll find a collection of guides to use cases that we've found our customers have. Don't see something here? Let us know!


# Add Autotrack to your website to collect data from your users

Automatically track data on your website and send to your customer and marketing tools

This guide will walk you through setting up Autotrack for your website. Once completed you'll be sending data from your website into a Freshpaint destination. Throughout this guide, we will use Google Analytics as the example, but the same steps work with any other destination supported by Freshpaint. This quickstart guide is made up of three sections:

{% content-ref url="/pages/-MA83ZkLUvNKjT9Y4LxX" %}
[Installing the Freshpaint Javascript SDK](/readme/guides/quickstart/installing-freshpaint)
{% endcontent-ref %}

{% content-ref url="/pages/-MA8cXAqP5IdBZ4iUnaf" %}
[Configuring a Destination](/readme/guides/quickstart/configuring-a-destination)
{% endcontent-ref %}

{% content-ref url="/pages/-MA83dFVSQy\_15USZUz5" %}
[Labeling User Actions](/readme/guides/quickstart/labeling-user-actions)
{% endcontent-ref %}

## User Identification

Once you have confirmed that Freshpaint is successfully installed, [setting up identify ](https://documentation.freshpaint.io/readme/setting-up-identify)is how you send information to Freshpaint and your destinations about who your users are.


# Installing the Freshpaint Javascript SDK

Installing the Freshpaint Javascript SDK to the production website has to be done by an engineer. It usually takes about five minutes to install. For deploying to production you should [invite a technical teammate](/admin-panel/teams) to your account and have them install Freshpaint. Once installed (either locally or on production), a non-technical user can use Autotrack within the [Web source ](/integrations/sources/web)to control and manage data without assistance from a technical user.

### Installing the Freshpaint SDK Directly Onto Your Site

To install Freshpaint, go to the [sources page](https://app.freshpaint.io/sources) in Freshpaint:

<figure><img src="/files/Fj0kR8m3QGZOcZ7XoDF1" alt=""><figcaption></figcaption></figure>

From the sources page click on **configure** next to the [Web source](/integrations/sources/web). This will pull up the code for the Freshpaint SDK:

<figure><img src="/files/83jUGUEcvuH9wqhL1Wqq" alt=""><figcaption></figcaption></figure>

Copy the snippet into the `<head>` of your site. That's it!

{% hint style="info" %}
If your application uses [Next.js](https://nextjs.org/docs/basic-features/script), you will need to add an **id** attribute to the script tag of the Autotrack snippet, such as \<script type="text/javascript" **id="freshpaint-script"**>.
{% endhint %}

### Installing the Freshpaint SDK via Google Tag Manager (GTM)

1. In your GTM Workspace, create a new tag using the **Custom HTML** tag type.
2. Next, copy and paste the snippet in the `HTML` field and set the firing trigger to `Initialization - All Pages`.
3. Save and test, using GTM's Preview Mode

### Installing the Freshpaint SDK via Adobe Launch

1. Create a new rule, and name the rule according to your existing rule naming convention, if any. Ex: "Freshpaint SDK - Production"
2. Add an event
   1. Extension: Core
   2. Event Type: Library Loaded (Page Top)
   3. Add additional conditions if you do not want the Freshpaint SDK to fire on all

      pages/URLs. For example, ensuring the HTML code only fires for its intended

      environment
3. Add an action
   1. Extension: Core
   2. Action Type: Custom Code
   3. Language: HTML
   4. Code: add your Freshpaint SDK snippet
4. Save and test
   1. Save the library and build it in the environment you use for testing
   2. Confirm Freshpaint is firing by opening the Console of your browser’s developer tools and typing `freshpaint`. Check that the object returns an array similar to the screenshot below:

<figure><img src="/files/GsvlWwLlMFHYrqWr583F" alt=""><figcaption></figcaption></figure>

## Verifying the Installation

To verify that Freshpaint is installed correctly, navigate to the Freshpaint [Live View](https://app.freshpaint.io/events/liveview). Live View will now provide a live feed of every user action performed on your site. If you navigate to your site in another tab and click around, you should see the actions you're performing show up in the liveview:

![](/files/-MAS2dbpTH8VZ_zDrKCy)

Once you see data coming through, you have successfully installed Freshpaint.

{% hint style="info" %}
Once you have the [Web source](/integrations/sources/web) installed on your site, [Autotrack](/integrations/sources/web/javascript) will automatically be implemented. You will also have access to [Precision Tracking](/integrations/sources/web/precision-tracking) if you choose to manually track your events.
{% endhint %}

## User Identification

Once you have confirmed that Freshpaint is successfully installed, you should [identify your users](https://documentation.freshpaint.io/readme/setting-up-identify). This is how you send information to Freshpaint and your destinations about who your users are.


# Installing the Freshpaint SDK with a Content Security Policy (CSP)

You may be using a Content Security Policy (CSP) in order to enhance the security of your webpage. Since this restricts how JavaScript resources are loaded, you'll need an engineer to follow a few more steps. You'll know this is an issue when the following console error is triggered when you try to install the Freshpaint snippet:

<figure><img src="/files/mS9bUdmaXpZWwy6TO9ag" alt=""><figcaption></figcaption></figure>

An engineer will need to use the hash given in your console error and add it to the allowlist for the 'script-src' in your CSP:

<figure><img src="/files/B8Z4AmrAxL59ggiRuH8s" alt=""><figcaption></figcaption></figure>

The following urls will need to be allowlisted on your CSP in order to load the Freshpaint snippet:

* `https://perfalytics.com/static/js/freshpaint.js`
* `https://perfalytics.com/static/js/integrations.js`
* `https://perfalytics.com/static/js/editor.js`

The following domains will also need to be allowlisted:

**script-src:**

* `https://freshpaint-cdn.com`
* `https://perfalytics.com`
* `https://*.perfalytics.com`

**script-src-elem:**

* `https://freshpaint-cdn.com`
* `https://perfalytics.com`
* `https://*.perfalytics.com`

{% hint style="info" %}
The **script-src-elem** directive only needs to be added when different policies are needed for `script` elements, versus other script contexts. Valid sources can be specified for all JavaScript script sources using the **script-src** directiv&#x65;**.**

For more information, please [read here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy/script-src-elem).
{% endhint %}

**connect-src:**

* `https://perfalytics.com`
* `https://*.perfalytics.com`
* `https://freshpaint-impression.com`
* `https://*.freshpaint-impression.com`
* `https://freshpaint-proxy.com`
* `https://*.freshpaint-proxy.com`
* `https://freshpaint-cdn.com`
* `https://*.freshpaint-cdn.com`
* `https://*.freshpaint.io`

{% hint style="info" %}
Why this is needed: The Freshpaint SDK posts client error telemetry to `https://freshpaint-proxy.com/v2/telemetry`. Without this host on `connect-src`, browsers will block the request and the implementation will report a CSP violation in the console.
{% endhint %}

**style-src:**

* `https://freshpaint-cdn.com`

{% hint style="info" %}
Required when using [Freshpaint Consent Manager](https://documentation.freshpaint.io/integrations/consent-management/freshpaint-consent-manager).
{% endhint %}

**'unsafe-eval':**

[Freshpaint Tag Manager](https://documentation.freshpaint.io/admin-panel/events/advanced-options/tag-manager) and [Dynamic Event Properties](https://documentation.freshpaint.io/readme/setting-up-properties#dynamic-properties) both rely on the `unsafe-eval` source expression in order to execute your associated JavaScript. If you are using these features, you must add this expression to your CSP.

{% hint style="danger" %}
Using `unsafe-eval` in a Content Security Policy (CSP) allows the execution of arbitrary JavaScript code, increasing the risk of cross-site scripting (XSS) vulnerabilities. Only add this if using the Freshpaint Tag Manager or Dynamic Event Properties features.
{% endhint %}

{% hint style="warning" %}
If you have adblocker bypass enabled, the urls you will need to allowlist on your CSP will be specific to your account. You'll have to add the specific urls that appear in your console errors to your CSP. For example:
{% endhint %}

* `https://<custom_subdomain>.cloudfront.net/static/js/freshpaint.js`
* `https://<custom_subdomain>.execute-api.us-west-2.amazonaws.com/prod`
* `https://<custom_subdomain>.cloudfront.net/static/js/integrations.js`
* `https://<custom_subdomain>.cloudfront.net/static/js/editor.js`

If you have client-side app destinations integrated, those will have to be added to the allowlist on the CSP as well. Here is an example of a CSP with ad-blocker bypass enabled with the correct urls allowlisted with a Freshpaint client-side Mixpanel destination integration:

```
<meta http-equiv="Content-Security-Policy" content="img-src 'self';
     script-src 'self' 'sha256-topW5bAl+v+kyY7bBFMyXdN9/0es3zVP+TAWbEMFDAE='      https://<custom_subdomain>.cloudfront.net/static/js/freshpaint.js https://<custom_subdomain>.execute-api.us-west-2.amazonaws.com/prod https://<custom_subdomain>.cloudfront.net/static/js/integrations.js http://cdn.mxpnl.com; style-src 'self'">
```


# Installing the Freshpaint Javascript SDK with Server-Side Rendering (SSR) + React

Installing the Freshpaint Javascript SDK with the use of server-side rendering framework, such as Remix JS, + React hydration

Due to the way server-side rendering with React and the Freshpaint SDK work, you may see console errors when attempting to install Freshpaint to your app. In order to avoid this error, the loading of the script must be delayed as such that React has time to hydrate fully first. This can be achieved by loading the script in a [useEffect() hook](https://reactjs.org/docs/hooks-effect.html).

Normally, React takes the component representing the app and a DOM node indicating where in the page the app will exist and attaches a running app to that empty node.

In server-side rendering, the server returns a ready-to-render html page and Javascript scripts required to make the page interactive. React then hydrates, meaning that it works in a virtual DOM to match the existing content returned from the server with what the application renders. This increases efficiency by supplanting the need to manipulate the DOM unnecessarily.

The Freshpaint SDK may load a number of additional scripts subsequently after installation depending on factors such as destination integrations. Due to this, you will see console errors in your [Remix ](https://remix.run/docs/en/v1)or other server-side rendering app as the scripts are being loaded prior to full React hydration. This means the expected content returned from the server will not match the virtual content React works in which results in the error.


# Autocapture + React

{% hint style="info" %}
If you are not using React, you can skip to the next part of the quickstart guide.
{% endhint %}

The data we autocapture is based on the current state of the elements on your webpage. With React, a lot of useful information is lost during the compilation process, making the data available on the elements less readable and less useful. You can preserve some of the context from your original React components by using the [Annotate React](https://github.com/freshpaint-io/freshpaint-babel-plugin-annotate-react) babel plugin.

### Installation

```
npm i @freshpaint/babel-plugin-annotate-react --save
```

If you use yarn:

```
yarn add @freshpaint/babel-plugin-annotate-react
```

#### Add the plugin to your babel config:

```
plugins: [
  "@freshpaint/babel-plugin-annotate-react"
]
```


# Configuring a Destination

Now that you've installed Freshpaint, Freshpaint is automatically collecting every user action performed on your site through the Autotrack source. To start making use of this data, you can configure a destination as a place to send the data to. For this quick start guide, we'll show you how to setup Google Analytics 4 Proxy but similar steps work for other destinations.

{% hint style="warning" %}
If you already have Google Analytics 4 installed on your site, make sure to remove it before you turn it on through Freshpaint. If you configure Google Analytics 4 Proxy through Freshpaint at the same time you have it installed directly on your site, your Google Analytics account will start counting every user twice.
{% endhint %}

To turn on Google Analytics 4 Proxy, navigate to the [destinations > apps page](https://app.freshpaint.io/destinations/apps) and search for the Google Analytics 4 Proxy destination:

<figure><img src="/files/ZMqv4fQnMZmbLkfMR21p" alt=""><figcaption></figcaption></figure>

Go to the [Google Analytics 4 Proxy configuration page](https://app.freshpaint.io/destinations/apps/google-analytics-4-proxy) in Freshpaint and click Configure. Then, configure the app credentials by providing your Measurement ID. You can find your Measurement ID in your Google Analytics account by following these steps: go to Admin > Data Streams > \[select data stream from list] and copy the Measurement ID value:

<figure><img src="/files/E9Wsv72yEAStIwE7suru" alt=""><figcaption></figcaption></figure>

<figure><img src="https://lh3.googleusercontent.com/OtqLytIraoaVcIJy1oyXwZT_TFnIa_tA1NLjgu1Irw4biLJ4G9256mTkvu-CzyFZFBrKeHT0bt5dVHOzhh7mkOVJrSK7_hAZvSNPkO2wGaZI44LDbZFbQJnGC_smeUqu5ebEt4ErVLUVqjLogrJFyeMJIQ=s2048" alt=""><figcaption></figcaption></figure>

### That's it! Now all you need to do to send an event to Google Analytics 4 Proxy is enable the destination in the Freshpaint event definition:

Navigate to your Freshpaint event, and toggle the destination on to enable the event to be sent to the Google Analytics 4 Proxy destination.

<figure><img src="/files/MPGilZGXka2J5qjoAEOS" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
You will need to follow extra steps to finish setting up a destination if you are a HIPAA account. You can look at the extra steps needed for Google Analytics 4 Proxy [here](/integrations/destinations/apps/google-analytics-4-proxy/google-analytics-4-proxy-quick-start-guide).
{% endhint %}

The fastest way to confirm if the integration is working is to:

1. Send an event to GA4 via the toggle like in the screenshot above
2. Trigger the event you just toggled to send to GA4
3. Wait a few minutes, then check GA4's Realtime overview for the events. To navigate here, go to Reports > Realtime and scroll down to view the events:

<figure><img src="/files/yfCZ0WjXWcWUOPVT4FfR" alt=""><figcaption></figcaption></figure>

There are other reports in Google Analytics you may be interested in verifying. You can read more about how to do that [here](/integrations/destinations/apps/google-analytics-4-proxy/google-analytics-4-proxy-quick-start-guide).

{% hint style="info" %}
If you are using a client-side integration, by default the only data sent to a destinations is the same data that is natively collected by the destination. Out of the box, Freshpaint does not send any additional data to a destination. In the next section, we'll look at how you can use Freshpaint to send additional data to a destination without writing code.
{% endhint %}

{% hint style="info" %}
If you are setting up a client-side destination, it takes 2 minutes for the Freshpaint CDN to clear and the new destination to show up on your website.
{% endhint %}


# Labeling User Actions

Labelling user actions, also referred to as "defining events", is the main way you manage data in Freshpaint. Once you have labelled a specific user action, you can then send all instances of that user action into the destinations supported by Freshpaint. There are several different types of actions you can define with Freshpaint. As an example, we'll walk through how we at Freshpaint defined an event for when a user clicks the **Features** button on our [home page](https://freshpaint.io):

![](/files/-MASXoIC1q5mFl--36kd)

The primary way to define an event is to use the Freshpaint visual tagger. To start the visual tagger, go to [Events > Visual Tagger](https://app.freshpaint.io/events/editor) in the Freshpaint app. Then enter the URL of your website and click **Launch Tagger**. This will open your website in the visual tagger:

![](/files/-MASYV84ID7h9YmAPMaa)

You can use the visual tagger to label user actions that are click events. To label a specific user action, just click on the element of your page that you want to define an action on. In our case, we want to define an event on the **Features** button:

![](/files/-MASZFecErGrHcbkBVcA)

Once you click on the element of your website you care about, the visual tagger will highlight that element and all similar elements on the page.

![](/files/-MASZcIzKPOEhxU2b_Ty)

The visual tagger will show the number of elements on the page that are similar to the element you clicked on:

![](/files/-MASZvdVY3sSjlBz7Uwz)

To narrow down to a specific element on the page, you can use filters. The visual tagger supports three kinds of filters:

* An href filter - this limits the matching elements to only those elements with the same link as the clicked on element.
* A text filter - this limits the matching elements to only those elements with the same text as the clicked on element.
* A path filter - this limits the matching elements to only those on the current page.

In most cases, an href filter will do what you need. In this case, limiting by href limits the event definition to just the **Features** button:

![](/files/-MASa8En3qUMokggvs6i)

Once the definition fits the elements you care about, give the event a name and click **Save Event**. This will label the user action in Freshpaint. In our case, we will call the event **Click - Features**.

## Verifying the Event Definition

To verify the event definition you can use the Freshpaint [liveview](https://app.freshpaint.io/events/liveview). Previously all the actions in the liveview were unlabelled. Now that you've created an event definition, when that action is performed on your site, it will show up bolded in the liveview. For example, now when someone clicks on the **Features** button, a **Click - Features** event shows up in the liveview:

![](/files/-MASd77GBtBDSgpMY-Em)

## Sending data to Destinations

Now that you've labelled a user action, you can now send that event into any of your destinations whenever a user performs that action. To send that event to a destination, go to the [Events Library](https://app.freshpaint.io/events/schema) page. The Library page is where you manage all your event definitions and the destinations they are being sent to. If you select the event you just defined and scroll to the bottom, you will see the Event Destinations Panel:

![](/files/-MASfhF2OZp4PK650OQL)

This is where you control what destinations this event is being sent to. Once you turn on a destination, Freshpaint will forward that event to the destination every time that event occurs. Once I turn on the Google Analytics destination for the **Click - Features** event, Freshpaint will forward that event to Google Analytics every time a user performs the **Click - Features** event. For example, once I turn it on and go to the **Realtime > Events** view in Google Analytics, I see:

![](/files/-MAShZJygbnSwaN2nca1)


# How do I install Freshpaint with Typescript?

You can find our typescript declaration file in the Web SDK reference: [Freshpaint Web SDK Reference](/reference/developer/freshpaint-sdk-reference#typescript-declaration-file)


# Send historical data to any destination with Time Machine

Once installed, Freshpaint automatically collects every user action on your site. Even if you only realize a specific user action is important six months after installing, Freshpaint will already have collected that user action for you. After creating a new event definition, you can get access to the historical instances of that event through the time machine feature. When you use the time machine, Freshpaint will send all events that match the given event definition to a specified destination.

To use the time machine feature, after creating an event definition, go to the [events schema](https://app.freshpaint.io/events/schema) page and select the new event.

![](/files/7cwV707pJJzOOQCgyywt)

Then scroll down to the event destinations view and click **Backfill** for the given destination.

![](/files/-MAi_qd98wyRZ3lEGSrN)

This will forward all historical instances for the given event in Freshpaint to the destination.

### **Backfill Specific Data Ranges**

You also have the ability to isolate backfills to a date range you can define. Freshpaint customers have shared that the value of a backfill can often be realized within a much shorter, specific time period. Shorter backfills mean less data clutter, and greater separation of signal from noise.

To do this simply toggle on the "Limit the backfill period" option, then enter a start and end date for the backfill. You cannot backfill data prior to when Freshpaint was installed on your site.

![Limit the backfill period by a specific data range you can define](/files/X67KGit5d6AFGiyWvtz8)

{% hint style="warning" %}
If you are already sending an event to a destination before you backfill the event, we recommend deleting the event out of the destination before you use the Time Machine.
{% endhint %}

## Supported Destinations

The Time Machine is supported for the following destinations:

* Amplitude
* Azure Synapse Analytics
* BigQuery
* Customer.io
* Iterable
* Klaviyo
* Mixpanel
* MySQL
* Panolpy
* Postgres
* Redshift
* S3
* Snowflake
* Stonly

Time machine for warehouses is enabled automatically. When you send an event to a warehouse, Freshpaint will send every instance of the event to your warehouse, even the instances that occurred before you created the event definition.


# Next.js Quickstart Guide

Installing the Freshpaint Javascript SDK in a Next.js application

[Next.js](https://nextjs.org/) is a popular front-end framework for building React-based applications optimized for server-side rendering (SSR) and static website generation. While we usually recommend using React's [`useEffect`](https://react.dev/reference/react/useEffect) [hook as a way to initialize the Freshpaint SDK](https://documentation.freshpaint.io/readme/guides/quickstart/installing-the-freshpaint-javascript-sdk-with-server-side-rendering-ssr-+-react), **Next.js requires its own special approach to integrating Freshpaint with your application.** Next.js provides a built in component called [`Script`](https://nextjs.org/docs/pages/api-reference/components/script) that is used to add additional JavaScript to the page.

Below is an example of a Next.js component you might create to add the Freshpaint SDK to the page and initialize it for your site's Freshpaint environment.

```tsx
import React from 'react'
import Script from 'next/script';

export default function FreshpaintSnippet() {
  return (
    <>
      <Script
        id="freshpaint-snippet"
        dangerouslySetInnerHTML={{
          __html: `
            (function(){function p(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,a=new Array(e);t<e;t++)a[t]=r[t];return a}function v(r){if(Array.isArray(r))return p(r)}function h(r){if(typeof Symbol!="undefined"&&r[Symbol.iterator]!=null||r["@@iterator"]!=null)return Array.from(r)}function A(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function I(r,e){if(r){if(typeof r=="string")return p(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);if(t==="Object"&&r.constructor&&(t=r.constructor.name),t==="Map"||t==="Set")return Array.from(t);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return p(r,e)}}function y(r){return v(r)||h(r)||I(r)||A()}var E=function(r,e){if(!e.__SV){try{var t,a,m=window.location,c=m.hash,x=function(n,o){return t=n.match(new RegExp(o+"=([^&]*)")),t?t[1]:null};c&&x(c,"fpState")&&(a=JSON.parse(decodeURIComponent(x(c,"fpState"))),a.action==="fpeditor"&&(window.sessionStorage.setItem("_fpcehash",c),history.replaceState(a.desiredHash||"",r.title,m.pathname+m.search)))}catch(S){}e.__loaded=!1,e.config=!1,e.__SV=2,window.freshpaint=new Proxy(e,{get:function(n,o){return n[o]!==void 0?n[o]:o==="init"?function(l,u,i){var _,d;(_=n)[d="_i"]||(_[d]=[]),n._i.push([l,u||{},i||"freshpaint"])}:function(){for(var l=arguments.length,u=new Array(l),i=0;i<l;i++)u[i]=arguments[i];var _=[o].concat(y(u));return n.push(_),new Proxy(_,{get:function(f,w){return f[w]?f[w]:function(){for(var b=arguments.length,g=new Array(b),s=0;s<b;s++)g[s]=arguments[s];f.length=0,f.push([o].concat(y(u))),f.push([w].concat(y(g)))}}})}}})}};E(document,window.freshpaint||[]);})();
            freshpaint.init("YOUR FRESHPAINT ENVIRONMENT ID HERE");
            freshpaint.page();
          `
        }}
      />
      <Script src="https://freshpaint-cdn.com/js/YOUR FRESHPAINT ENVIRONMENT ID HERE/freshpaint.js" />
    </>
  )
}
```

### Finding your Freshpaint Web snippet

The contents of each `Script` component's JavaScript source correspond to the two `script` tags found in the Freshpaint application under the **Web** integration of the **Sources** page at <https://app.freshpaint.io/sources>. You should see the modal containing your Freshpaint snippets below by clicking the **Configure** button next to the **Web** integration:

![](/files/N9NiivYaku1eqi4wrEmc):

Let's take a look at each `Script` component in more detail.

### The first Script component

```tsx
      <Script
        id="freshpaint-snippet"
        dangerouslySetInnerHTML={{
          __html: `
            (function(){function p(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,a=new Array(e);t<e;t++)a[t]=r[t];return a}function v(r){if(Array.isArray(r))return p(r)}function h(r){if(typeof Symbol!="undefined"&&r[Symbol.iterator]!=null||r["@@iterator"]!=null)return Array.from(r)}function A(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function I(r,e){if(r){if(typeof r=="string")return p(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);if(t==="Object"&&r.constructor&&(t=r.constructor.name),t==="Map"||t==="Set")return Array.from(t);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return p(r,e)}}function y(r){return v(r)||h(r)||I(r)||A()}var E=function(r,e){if(!e.__SV){try{var t,a,m=window.location,c=m.hash,x=function(n,o){return t=n.match(new RegExp(o+"=([^&]*)")),t?t[1]:null};c&&x(c,"fpState")&&(a=JSON.parse(decodeURIComponent(x(c,"fpState"))),a.action==="fpeditor"&&(window.sessionStorage.setItem("_fpcehash",c),history.replaceState(a.desiredHash||"",r.title,m.pathname+m.search)))}catch(S){}e.__loaded=!1,e.config=!1,e.__SV=2,window.freshpaint=new Proxy(e,{get:function(n,o){return n[o]!==void 0?n[o]:o==="init"?function(l,u,i){var _,d;(_=n)[d="_i"]||(_[d]=[]),n._i.push([l,u||{},i||"freshpaint"])}:function(){for(var l=arguments.length,u=new Array(l),i=0;i<l;i++)u[i]=arguments[i];var _=[o].concat(y(u));return n.push(_),new Proxy(_,{get:function(f,w){return f[w]?f[w]:function(){for(var b=arguments.length,g=new Array(b),s=0;s<b;s++)g[s]=arguments[s];f.length=0,f.push([o].concat(y(u))),f.push([w].concat(y(g)))}}})}}})}};E(document,window.freshpaint||[]);})();
            freshpaint.init("YOUR FRESHPAINT ENVIRONMENT ID HERE");
            freshpaint.page();
          `
        }}
      />
```

In the code above, there are a few important things to note:

1. Next.js requires that a unique `id` attribute be defined on any `Script` component that does NOT use the `src` attribute to reference a remote JavaScript source file. This must be defined or Next.js will not be able to properly render the `script` HTML element onto the page.
2. The value of the prop `dangerouslySetInnerHTML.__html` comes from the first `script` tag in your Freshpaint environment's **Web** integration snippet (described in the section above).

### The second Script component

```tsx
<Script src="https://freshpaint-cdn.com/js/YOUR FRESHPAINT ENVIRONMENT ID HERE/freshpaint.js" />
```

In the code above, the value of the `src` attribute comes from the second `script` tag in your Freshpaint environment's **Web** integration snippet (described in the section above).

### Rendering the FreshpaintSnippet component in your Next.js application

The best location to render your new `FreshpaintSnippet` component in your Next.js application will depend upon what kind of Next.js application you are building, and the structure of your application. In general, we recommend rendering the `FreshpaintSnippet` component in one of the "root" components of your application. Your `FreshpaintSnippet` should only render onto the page one time, and should remain rendered on the page for the lifetime of your Next.js application.


# Android Quickstart Guide

This guide will walk you through how to set up the Freshpaint Android SDK. After completing this guide, you'll be sending data from your Android app to a Freshpaint destination. We'll be using Amplitude as an example, but the same process works for the other destinations supported by Freshpaint. There are three steps to get set up with Android:

{% hint style="info" %}
The Freshpaint Android SDK does not support autotrack. That means you will have to instrument any events you want to track with precision tracking.
{% endhint %}

{% content-ref url="/pages/-MQmnoPAMHd8iRQWfDdB" %}
[Installing the Freshpaint Android SDK](/readme/guides/android-quickstart-guide/installing-the-freshpaint-android-sdk)
{% endcontent-ref %}

{% content-ref url="/pages/-MQmnp-9JyN3pO9fgJw\_" %}
[Configuring a Destination](/readme/guides/android-quickstart-guide/configuring-a-destination)
{% endcontent-ref %}

{% content-ref url="/pages/-MQmnpG1cVLr1ivu8q3Q" %}
[Instrumenting Your App](/readme/guides/android-quickstart-guide/instrumenting-your-app)
{% endcontent-ref %}


# Installing the Freshpaint Android SDK

To install the Freshpaint Android SDK, add the following dependency to your gradle file:

```groovy
implementation 'io.freshpaint.android:freshpaint:2.1.0'
```

To import the SDK, use:

```java
import io.freshpaint.android.Freshpaint;
import io.freshpaint.android.Properties;
```

Then to initialize the SDK, you should run:

```java
Freshpaint freshpaint = new Freshpaint.Builder(getApplicationContext(), "<your environment id>")
    .trackApplicationLifecycleEvents()
    .trackDeepLinks()
    .recordScreenViews()
    .build();

Freshpaint.setSingletonInstance(freshpaint);
```

You can get your environment id from the [Freshpaint sources page](https://app.freshpaint.io/sources).

You should run the initialization code in either the `onCreate` method of your class that extends Application, or in the `onCreate` method of your main activity class.

## Application Lifecycle Events

The SDK can optionally track app lifecycle events automatically when you enable `trackApplicationLifecycleEvents()`, including `Application Installed`, `Application Opened`, `Application Backgrounded`, and `Application Updated`.

## Deep Link Tracking

When `trackDeepLinks()` is enabled, the SDK reads the `Intent` URI from an Activity when it is created and sends a `Deep Link Opened` event. The full deep link URL is included in event context as `url`.

The SDK also captures attribution query parameters from the deep link, including UTM parameters and common ad click IDs such as `gclid`, `gbraid`, `wbraid`, `fbclid`, `ttclid`, and others. These values are added to event context, not event properties. UTM values expire after 24 hours; click IDs are retained for attribution.

You must define your own Android deep link or App Link `intent-filter`; the SDK does not add schemes, hosts, paths, or domain verification.

If lifecycle tracking is also enabled, captured deep-link attribution can enrich the first-open `Application Installed` event context.

## User Consent and Ad Tracking

The Freshpaint Android SDK respects the device-level “Limit Ad Tracking” setting. When ad tracking is limited, the SDK does not collect or send the Google Advertising ID (GAID) and sets `limit_ad_tracking` to `true` in the device context.

When ad tracking is allowed and Google Play Services returns an advertising ID, the SDK may include `advertisingId` in event context. The SDK also declares the Android 13+ `com.google.android.gms.permission.AD_ID` permission through its manifest.

Freshpaint does not manage user consent for your app. If your app needs consent before collecting analytics or advertising identifiers, collect that consent before initializing or using the SDK. You can also opt a device out of event collection:

```java
Freshpaint.with(getApplicationContext()).optOut(true);
```

## Verifying Your Instrumentation

To verify your Freshpaint installation, navigate to the Freshpaint [Live View](https://app.freshpaint.io/events/liveview). After opening your app, you should see an `Application Opened` event show up in Live View:

![](/files/-MQTFujhym67mQlXhxP9)

Note, the Freshpaint SDK batches events, so it can take a minute for the event to show up.


# Configuring a Destination

Now that you've installed Freshpaint, the next step is to start making use of the data. For this quickstart guide, we'll show you how you can send data from Freshpaint to Amplitude, but the same steps work for other destinations.

To turn on Amplitude, navigate to the [destinations > apps page](https://app.freshpaint.io/destinations/apps). You should see Amplitude at the top:

![](/files/-MH8PtJGtNO9PmEBddz7)

Click on **configure** and a window will popup for you to enter your Amplitude API Key:

![](/files/-MH8Q2mfPTiQKAafuhTb)

To get your Amplitude tracking ID, in a new tab, sign into [Amplitude](https://amplitude.com). In the bottom left click **Settings** and then in the top left click **Projects**. After that, click the project you want to send data into. You'll then see your API Key in the middle of the page. Copy and paste that into Freshpaint, and click **Save**.

Once you've clicked **Save**, you are done! You can now send events from Freshpaint to Amplitude. Check out the next section on how to label user actions to see how exactly you can send data into destinations.


# Instrumenting Your App

To instrument an event for Freshpaint, add the following bit of code whenever there's an event you want to track:

```java
Freshpaint
    .with(getActivity().getApplicationContext())
    .track("Example Event", new Properties().putValue("Example Property", "Example Value"));
```

## Verifying the Instrumentation

To verify the instrumentation you can use the Freshpaint Live View. After firing an event, you should see it show up in Freshpaint after a minute:

![](/files/-MQn_tYuK0H0LAj2F3R2)

You can then click the event to look at the properties of the event and confirm they are correct:

![](/files/-MQna2NdIiE_wA5ni8cG)

By default, Freshpaint automatically forwards any event instrumented with the Android SDK to any enabled destinations. If you now take a look in Amplitude, you will see the events you created being sent:

![](/files/-MQnaOvoVUkqyA3dl9Mv)

If you'd like to disable this behavior, you can do so by clicking into the event definition, clicking "Settings" and then enabling the "Override hardcoded destinations" toggle. This will disable all active destinations for this event.

<figure><img src="/files/ifCris8ZtdGj5wFThjcu" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
You'll need to go back into the event definition and re enable any destinations as they will now all be disabled.
{% endhint %}


# iOS Quickstart Guide

This guide will walk you through how to set up the Freshpaint iOS SDK. After completing this guide, you'll be sending data from your iOS app to a Freshpaint destination. We'll be using Amplitude as an example, but the same process works for the other destinations supported by Freshpaint. There are three steps to get set up with iOS:

{% hint style="info" %}
Freshpaint web-style autotrack is not supported; app events must generally be instrumented manually.
{% endhint %}

{% content-ref url="/pages/-MQTAIVe-\_V7p\_OEGScu" %}
[Installing the Freshpaint iOS SDK](/readme/guides/ios-quickstart-guide/installing-the-freshpaint-ios-sdk)
{% endcontent-ref %}

{% content-ref url="/pages/-MQTAHxr\_vgwlEWGm3A8" %}
[Configuring a Destination](/readme/guides/ios-quickstart-guide/configuring-a-destination)
{% endcontent-ref %}

{% content-ref url="/pages/-MQTAHRaZroI6EpIUiOB" %}
[Instrumenting Your App](/readme/guides/ios-quickstart-guide/instrumenting-your-app)
{% endcontent-ref %}


# Installing the Freshpaint iOS SDK

To install the Freshpaint iOS SDK, add the following to your app's Podfile:

```ruby
pod 'Freshpaint', '0.5.0'
```

Then run:

```bash
pod install --repo-update
```

To import the Freshpaint SDK use:

{% tabs %}
{% tab title="Swift" %}

```swift
import FreshpaintSDK
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
#import <FreshpaintSDK/FPAnalytics.h>
```

{% endtab %}
{% endtabs %}

Then to initialize the SDK, add the following code to your application delegate's `didFinishLaunchingWithOptions`:

{% tabs %}
{% tab title="Swift" %}

```swift
func application(
    _ application: UIApplication, 
    didFinishLaunchingWithOptions 
    launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    ...
    let config = FreshpaintConfiguration(writeKey: "<your environment id>");
    config.trackApplicationLifecycleEvents = true
    config.recordScreenViews = true
    Freshpaint.setup(with: config)
    ...
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    FPAnalyticsConfiguration *configuration = [FPAnalyticsConfiguration configurationWithWriteKey:@"<your environment id>"];
    configuration.trackApplicationLifecycleEvents = YES;
    configuration.recordScreenViews = YES;
    [FPAnalytics setupWithConfiguration:configuration];
    ...
}
```

{% endtab %}
{% endtabs %}

You can get your environment id by going to the [Freshpaint sources page](https://app.freshpaint.io/sources).

## Application Lifecycle Tracking

The SDK can optionally track app lifecycle events automatically. On first launch, the SDK sends `Application Installed` by default (`autoTrackFirstOpen` is enabled by default) with install attribution fields such as `device_id`, `idfv`, and `att_status`. To also track `Application Opened`, `Application Backgrounded`, and `Application Updated`, set `trackApplicationLifecycleEvents` to `true` during initialization. Set `autoTrackFirstOpen` to `false` to disable first-open tracking, or leave `trackApplicationLifecycleEvents` at its default (`false`) to skip the remaining lifecycle events.

## Deep Link Tracking

Freshpaint can automatically track deep links when your app is opened from a custom URL scheme or Universal Link. When enabled, the SDK sends a `Deep Link Opened` event and includes the opened URL in the event properties.

First, enable deep link tracking when you configure the SDK:

{% tabs %}
{% tab title="Swift" %}

```swift
let config = FreshpaintConfiguration(writeKey: "<your environment id>")
config.trackDeepLinks = true
Freshpaint.setup(with: config)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
FPAnalyticsConfiguration *configuration = [FPAnalyticsConfiguration configurationWithWriteKey:@"<your environment id>"];
configuration.trackDeepLinks = YES;
[FPAnalytics setupWithConfiguration:configuration];
```

{% endtab %}
{% endtabs %}

Then forward deep link callbacks from your app to Freshpaint.

{% tabs %}
{% tab title="Swift" %}

```swift
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL { url in
                    Freshpaint.shared().open(url, options: [:])
                }
                .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
                    Freshpaint.shared().continueUserActivity(activity)
                }
        }
    }
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
    [[FPAnalytics sharedAnalytics] openURL:url options:options];
    return YES;
}
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
 restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    [[FPAnalytics sharedAnalytics] continueUserActivity:userActivity];
    return YES;
}
```

{% endtab %}
{% endtabs %}

For Universal Links, Freshpaint records the `url`, the activity `title` when available, and any values from the activity's `userInfo`. For custom URL scheme links, Freshpaint records the `url` and any values passed in the `options` dictionary.

## User Consent

Freshpaint gives you control over when analytics data is collected and when advertising identifiers are included. If your app requires user consent before analytics collection, wait to initialize Freshpaint until after consent is granted, or disable tracking immediately after setup and enable it only after the user opts in.

{% tabs %}
{% tab title="Swift" %}

```swift
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL { url in
                    Freshpaint.shared().open(url, options: [:])
                }
                .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
                    Freshpaint.shared().continueUserActivity(activity)
                }
        }
    }
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
    [[FPAnalytics sharedAnalytics] openURL:url options:options];
    return YES;
}
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
 restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    [[FPAnalytics sharedAnalytics] continueUserActivity:userActivity];
    return YES;
}
```

{% endtab %}
{% endtabs %}

Calling `disable()` stops Freshpaint from processing new analytics calls. Calling `enable()` allows tracking calls to be processed again.

#### Advertising Consent and ATT

The SDK also supports Apple's App Tracking Transparency (ATT) flow. Freshpaint does not request ATT permission automatically by default. If you want the SDK to request ATT automatically when the app becomes active, set `autoRequestATT` to `true`.

Freshpaint only includes the advertising identifier through its ATT-aware APIs when ATT is authorized. If you provide an `adSupportBlock`, make sure your app has the required user permission before returning an advertising identifier.

{% tabs %}
{% tab title="Swift" %}

```swift
let config = FreshpaintConfiguration(writeKey: "<your environment id>")
config.autoRequestATT = true
config.adSupportBlock = {
    Freshpaint.advertisingIdentifier()
}
Freshpaint.setup(with: config)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
FPAnalyticsConfiguration *configuration = [FPAnalyticsConfiguration configurationWithWriteKey:@"<your environment id>"];
configuration.autoRequestATT = YES;
configuration.adSupportBlock = ^{
    return [FPAnalytics advertisingIdentifier];
};
[FPAnalytics setupWithConfiguration:configuration];
```

{% endtab %}
{% endtabs %}

You can also request ATT permission yourself and enable Freshpaint only after your consent flow is complete.

## Verifying Your Instrumentation

To verify your Freshpaint installation, navigate to the Freshpaint [Live View](https://app.freshpaint.io/events/liveview). After opening your app, you should see an `Application Opened` event show up in Live View:

![](/files/-MQTFujhym67mQlXhxP9)

Note, the Freshpaint SDK batches events, so it can take a minute for the event to show up.


# Configuring a Destination

Now that you've installed Freshpaint, the next step is to start making use of the data. For this quickstart guide, we'll show you how you can send data from Freshpaint to Amplitude, but the same steps work for other destinations.

To turn on Amplitude, navigate to the [destinations > apps page](https://app.freshpaint.io/destinations/apps). You should see Amplitude at the top:

![](/files/-MH8PtJGtNO9PmEBddz7)

Click on **configure** and a window will popup for you to enter your Amplitude API Key:

![](/files/-MH8Q2mfPTiQKAafuhTb)

To get your Amplitude tracking ID, in a new tab, sign into [Amplitude](https://amplitude.com). In the bottom left click **Settings** and then in the top left click **Projects**. After that, click the project you want to send data into. You'll then see your API Key in the middle of the page. Copy and paste that into Freshpaint, and click **Save**.

Once you've clicked **Save**, you are done! You can now send events from Freshpaint to Amplitude. Check out the next section on how to label user actions to see how exactly you can send data into destinations.


# Instrumenting Your App

To instrument an event for Freshpaint, add the following bit of code whenever there's an event you want to track:

{% tabs %}
{% tab title="Swift" %}

```swift
Freshpaint.shared().track(
    "Example Event", 
    properties: ["Example Property": "Example Value"]
)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[[FPAnalytics sharedAnalytics]
              track:@"Example Event" 
              properties:@{ @"Example Property": @"Example Value" }];
```

{% endtab %}
{% endtabs %}

## Verifying the Instrumentation

To verify the instrumentation you can use the Freshpaint Live View. After firing an event, you should see it show up in Freshpaint after a minute:

![](/files/-MQTIzSXRLwhtztWidp1)

You can then click the event to look at the properties of the event and confirm they are correct:

![](/files/-MQTJJsTg4UvoN04X04e)

By default, Freshpaint automatically forwards any event instrumented with the iOS SDK to any enabled destinations. If you now take a look in Amplitude, you will see the events you created being sent:

![](/files/-MQTL6JYeYlTkGen3pbR)

If you'd like to disable this behavior, you can do so by clicking into the event definition, clicking "Settings" and then enabling the "Override hardcoded destinations" toggle. This will disable all active destinations for this event.

<figure><img src="/files/ifCris8ZtdGj5wFThjcu" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
You'll need to go back into the event definition and re enable any destinations as they will now all be disabled.
{% endhint %}


# React Native Quickstart Guide

This guide will walk you through setting up Freshpaint for your React Native app. After completing this guide, you'll be sending data from your mobile app to a Freshpaint destination. We'll be using Amplitude as an example destination, but the same process works for the other destinations supported by Freshpaint. There are four steps to get started with Freshpaint React Native:

{% hint style="success" %}
The Freshpaint React Native SDK supports autocapture. After the SDK is installed and initialized, and autocapture instrumentation is configred, your app can automatically send interaction data to Freshpaint. Events can be then defined in Freshpaint without shipping new app code for every event.
{% endhint %}

{% content-ref url="/pages/-MH8GJXHBOVIbKY1F\_Mj" %}
[Installing the Freshpaint React Native SDK](/readme/guides/react-native-quickstart-guide/installing-the-freshpaint-react-native-sdk)
{% endcontent-ref %}

{% content-ref url="/pages/-MH8GJ4vDr-YaNKuGcVI" %}
[Configuring a Destination](/readme/guides/react-native-quickstart-guide/configuring-a-destination)
{% endcontent-ref %}

{% content-ref url="/pages/-MH8GIMq7UTNkROnJQA7" %}
[Labeling User Actions](/readme/guides/react-native-quickstart-guide/labeling-user-actions)
{% endcontent-ref %}

{% content-ref url="/pages/IXqJp6kFHnd0a3IvTVmq" %}
[Configuring Property Capture](/readme/guides/react-native-quickstart-guide/configuring-property-capture)
{% endcontent-ref %}


# Installing the Freshpaint React Native SDK

## Getting Started

The first step installing the Freshpaint React Native SDK is to install the `@freshpaint/freshpaint-react-native` node module. If you are not using Expo and are using the React Native CLI instead, you'll also need to install and link the `@react-native-community/async-storage` dependency. For modern React Native projects, native dependencies are autolinked.

{% tabs %}
{% tab title="Expo" %}

```
npx expo install --save @freshpaint/freshpaint-react-native
```

{% endtab %}

{% tab title="React Native CLI" %}

```
npm install --save @freshpaint/freshpaint-react-native
npm install --save @react-native-async-storage/async-storage
npx react-native link @react-native-async-storage/async-storage
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
For iOS projects, run `pod install` after installing the SDK. The SDK includes native modules for attribution and install-related data collection.
{% endhint %}

Next, you'll need to setup the Freshpaint React Native babel plugin. This allows Freshpaint to instrument supported React Native components during your app build. To setup the plugin, add the following bit of code to either your `.babelrc` or `babel.config.json`:

```javascript
{
  plugins: [
    'add-react-displayname', 
    './node_modules/@freshpaint/freshpaint-react-native/plugin.js',
  ],
  ...
}
```

{% hint style="info" %}
Restart Metro with a cleared cache and rebuild the app so Babel instrumentation is applied.
{% endhint %}

Then to initialize the Freshpaint SDK, you call `freshpaint.init` at the top level with your environment ID. This is normally done in the `App.js` file. You can get your Freshpaint environment ID from the Freshpaint sources page.

```javascript
import Freshpaint from '@freshpaint/freshpaint-react-native';

Freshpaint.init('<your environment id>');
```

At this point you'll need to clear any build caches for your app:

{% tabs %}
{% tab title="Expo" %}

```bash
expo r -c
```

Then restart the expo app on your phone.
{% endtab %}

{% tab title="React Native CLI" %}

```
npx react-native start --reset-cache
```

{% endtab %}
{% endtabs %}

After that Freshpaint will automatically collect the following actions:

* Touches and presses
* Text input edits
* Switch toggles
* Paged ScrollView interactions

{% hint style="warning" %}
Text input autocapture support depends on the React Native/TextInput implementation used by your app.
{% endhint %}

## How it Works

Generally, the React-Native integration works by sending the data to Freshpaint, which then captures that data and sends the data to your destination. The data is sent from Freshpaint to your destination server-side, even if your app destination is configured to be client-side. You can read more about server-side and client-side connection modes [here](https://documentation.freshpaint.io/sources/server-side).

## Capturing Screen Views

If you are using React Navigation, Freshpaint can also autocapture screen views. To set this up, wrap the `NavigationContainer` provided by React Navigation with `Freshpaint.withReactNavigationAutotrack`:

```javascript
import Freshpaint from '@freshpaint/freshpaint-react-native';
import { NavigationContainer } from '@react-navigation/native';

const FreshpaintNavigationContainer = Freshpaint.withReactNavigationAutotrack(NavigationContainer);
```

Then use `FreshpaintNavigationContainer` in place of `NavigationContainer`:

```javascript
function App() {
  return (
    <FreshpaintNavigationContainer>
      ...
    </FreshpaintNavigationContainer>
  );
}
```

## Application Lifecycle Events

The SDK automatically tracks application lifecycle events when you initialize with `Freshpaint.init()`—no additional configuration flag is required. On the first app launch, the SDK fires an `Application Installed` event with full MMP attribution data.

## Deep Link Tracking

Freshpaint automatically listens for deep links after `Freshpaint.init(...)`. When the app is opened from a deep link, the SDK sends a `Deep Link Opened` event with the opened URL and supported attribution parameters.

You still need to configure deep linking in your app, such as URL schemes, Universal Links, Android App Links, or Expo linking configuration. Freshpaint does not route users inside your app; it observes URLs received through React Native’s `Linking` API.

Supported attribution parameters include UTM parameters and common ad click IDs such as `gclid`, `gbraid`, `wbraid`, `fbclid`, `ttclid`, and `msclkid`. The initial launch URL may also contribute attribution properties to the one-time `Application Installed` event.

## User Consent and Ad Tracking

The React Native SDK respects platform-level ad tracking controls.On iOS, the SDK supports App Tracking Transparency (ATT). By default, Freshpaint does not automatically show the ATT prompt. To let the SDK request ATT during initialization, pass `autoRequestATT: true`:

```javascript
Freshpaint.init('YOUR_ENVIRONMENT_ID', {autoRequestATT: true,});
```

When `autoRequestATT` is enabled, Freshpaint requests ATT before sending the one-time `Application Installed` event. If the user authorizes tracking, attribution events may include the advertising identifier. If tracking is denied or restricted, the advertising identifier is not included.

Apps that manage their own consent flow can leave `autoRequestATT` disabled and call the ATT methods directly:

```javascript
const status = await Freshpaint.getTrackingAuthorizationStatus();
const updatedStatus = await Freshpaint.requestTrackingAuthorization();
```

On Android, Freshpaint respects the device’s Limit Ad Tracking setting. When ad tracking is limited, advertising identifiers are not collected. When ad tracking is allowed, Freshpaint uses the Google Advertising ID when available and avoids sending both GAID and Android ID together.

Freshpaint’s ad tracking behavior is based on platform-level controls. If your app has its own privacy consent flow, coordinate SDK initialization and ATT prompting with that flow.

## Verifying your Instrumentation

To verify your Freshpaint instrumentation, navigate to the Freshpaint [Live View](https://app.freshpaint.io/events/liveview). As you navigate around your app and click on various buttons, you should see events show up in the Live View:

![](/files/-MH8O2GLGYuBQ-G0zQ1A)

You can click one of the events to dig into the specific properties captured. For example, you can see the full React component hierarchy of the captured event:

![](/files/-MH8OdkeLx_RV4GMGM0j)


# Configuring a Destination

Now that you've installed Freshpaint, Freshpaint is automatically collecting every user action performed in your app. To start making use of this data, you can configure a destination as a place to send the data to. For this quickstart guide, we'll show you how to setup Amplitude, but the same steps work for other destinations.

To turn on Amplitude, navigate to the [destinations > apps page](https://app.freshpaint.io/destinations/apps). You should see Amplitude at the top:

![](/files/-MH8PtJGtNO9PmEBddz7)

Click on **configure** and a window will popup for you to enter your Amplitude API Key:

![](/files/-MH8Q2mfPTiQKAafuhTb)

To get your Amplitude tracking ID, in a new tab, sign into [Amplitude](https://amplitude.com). In the bottom left click **Settings** and then in the top left click **Projects**. After that, click the project you want to send data into. You'll then see your API Key in the middle of the page. Copy and paste that into Freshpaint, and click **Save**.

Once you've clicked **Save**, you are done! You can now send events from Freshpaint to Amplitude. Check out the next section on how to label user actions to see how exactly you can send data into destinations.


# Labeling User Actions

To label events for React Native, you can use the [Freshpaint Events Library page](https://app.freshpaint.io/events/schema). When Creating a new event, select `React Native` as the library for the event:

![](/files/-MH8RXe4PgiF3Vsplogv)

To specify an event, you use a CSS selector, but instead of tags, you use the names of the React Components. As an example, let's say you have the following component:

```javascript
function MyComponent() {
  return (
    <Button title="Press Here" />
  );
};
```

You can then use the following "CSS Selector" to define an event for touches on the button:

```
MyComponent Button
```

You can also use CSS attribute selector to filter on the component properties. For example, you could define the same event by using:

```
Button[title="Press Here"]
```

Out of the box, Freshpaint collects a whitelist of properties from your events. See the [page on what data the React Native collects](https://docs.freshpaint.io/faqs/what-data-does-freshpaint-collect/data-collected-on-react-native#attributes-captured-by-default) for a complete overview of all the data collected.

## Verifying the Event Definition

To verify the event definition you can use the Freshpaint [Live View](https://app.freshpaint.io/events/liveview). Previously all the actions in the Live View were unlabeled. Now that you've created an event definition, when that action is performed on your site, it will show up bolded in the Live View. For example, after defining an event on the above button, now when someone clicks it, you'll see the name of the event:

![](/files/-MH8T6RGS6jtlly1dZMJ)

## Sending Data to Destinations

Now that you've labelled a user action, you can now send that event into any destination that supports React Native events. To send that event to a destination, go to the event in the [Events Library](https://app.freshpaint.io/events/schema) page and scroll down to the Event Destinations panel:

![](/files/-MQTK6ifdk9DfdfUgwwP)

After flipping the toggle for a destination, Freshpaint will start sending the event to the destination. For Amplitude, if you go to the user lookup, you'll now see the event you just created coming in:

![](/files/-MH8UPB1xnX_BY7-ZYnE)


# Configuring Property Capture

Freshpaint comes configured with an initial set of prop-capture configurations for commonly used components. If you would like to capture a non-default property, this can be achieved by adding a small piece of configuration code to the app.

Freshpaint will check for a `freshpaintOptions` property that contains a set of properties to include or exclude. See below for the structure of the property:

```
freshpaintOptions = {
    eventProps: {
    include: [ '<inc_prop_1>', '<inc_prop_2>', ..., '<inc_prop_n>' ],
    exclude: [ '<exc_prop_1>', '<exc_prop_2>', ..., '<exc_prop_n>' ],
    }
}
```

The properties listed in the `include` list will be included in the event. The properties in the `exclude` list will be excluded from the event if they would have otherwise been included by either the `include` list or as a [built-in property](https://documentation.freshpaint.io/faqs/what-data-does-freshpaint-collect/data-collected-on-react-native#attributes-captured-by-default).

**Stateless, Functional Component Example:**

```javascript
import React from 'react';
import { Text, TouchableOpacity, View } from 'react-native';

const ProductItem = ({title, description, onPress}) => {
  return (
      <TouchableOpacity onPress={onPress}>
        <View>
          <Text>{title}</Text>
          <Text>{description}</Text>
        </View>
      </TouchableOpacity>
  );
}

ProductItem.freshpaintOptions = {
  eventProps : { include: [ 'title', 'description' ] }
};

export { ProductItem };
```

**Stateful Component Example:**

```javascript
import React, { Component } from 'react';
import { Text, TouchableOpacity, View } from 'react-native';

export default class ProductItem extends Component {
  freshpaintOptions = {
    eventProps : { include: [ 'title', 'description' ] }
  };    

  render() {
    return (
      <TouchableOpacity onPress={onPress}>
        <View>
          <Text>{title}</Text>
          <Text>{description}</Text>
        </View>
      </TouchableOpacity>
    );
  }
}
```

{% hint style="info" %}
The use of a custom prop configuration will result in additional properties being captured in the `Hierarchy` event property. You can check these out in live view as seen in the screenshot below:
{% endhint %}

<figure><img src="/files/uq4kn9s6A4fpNtvqQLGI" alt=""><figcaption></figcaption></figure>


# Setting up Properties

Sometimes you will want to attach data to events that isn't automatically captured by autotrack. There are several ways you can attach properties to events.

You can use the techniques below to capture properties like the search term when a user performs a search, or the price of an item when a user adds it to their shopping card. Here's a table of which methods are supported by which SDKs:

|                                                                                                                                               | Web     | React Native | iOS     | Android |
| --------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------ | ------- | ------- |
| [Dynamic Properties](https://documentation.freshpaint.io/readme/setting-up-properties#dynamic-properties)                                     | **YES** | no           | no      | no      |
| [Data Layer Properties](https://documentation.freshpaint.io/readme/setting-up-properties#data-layer-properties)                               | **YES** | **YES**      | no      | no      |
| [Precision Tracked Properties](https://documentation.freshpaint.io/readme/setting-up-properties#attaching-properties-with-precision-tracking) | **YES** | **YES**      | **YES** | **YES** |
| [React Attribute Autotrack](https://documentation.freshpaint.io/readme/setting-up-properties#react-native-attribute-autotrack)                | no      | **YES**      | no      | no      |

{% hint style="info" %}
Property values are limited to 255 characters.
{% endhint %}

## Dynamic Properties

Dynamic Properties enable you to collect additional metadata via Freshpaint's Autotrack beyond what's automatically collected by default. Freshpaint's Dynamic Properties can grab any visible data on the page and attach that data to your events.

Dynamic properties do not require code to setup and are the easiest way to add additional data to events.

Examples of what you can collect with Dynamic Properties:

* Collect Item Price, Item Name, and other data when a product is added to a user's cart
* Collect search terms entered by your users when they execute a search

To add a dynamic property to an event, click **Add Dynamic Property** in the event definition dashboard which can be found by click on an individual event definition within the [event library](https://app.freshpaint.io/events/library):

<figure><img src="/files/pMpGVEBeF1UgJsrQIbLd" alt=""><figcaption></figcaption></figure>

Specify the name of the property and a CSS selector that points to the element on the page with the information you want to capture. Whenever the event is triggered, Freshpaint will look up the element with the given CSS selector and attach the text of that element as a property to the event.

You may see read-only JavaScript type properties here, created by Freshpaint support.

JavaScript Dynamic Properties allow you to specify a JavaScript function body to set the property value, with the native event available as input. They also support suppressing delivery for configured destinations on this event, via the SUPPRESS\_EVENT value.

JavaScript Dynamic Properties require you [modify your Content Security Policy](https://documentation.freshpaint.io/readme/guides/quickstart/installing-the-freshpaint-sdk-with-a-content-security-policy-csp) to include the `unsafe-eval` expression.

Please contact support if you'd like to learn more about this capability.

{% hint style="info" %}
Dynamic Properties are not retroactive at this time
{% endhint %}

## Data Layer Properties

Data layer properties are properties given to Freshpaint that are then attached to all Freshpaint events. Data layer properties allow you to attach additional, contextual information, to your events.

You can create data layer properties by using the `addEventProperties`, `addPageviewProperties`, and`addInitialEventProperties`.

### addEventProperties

The `addEventProperties` function call creates a data layer property. That property will now be sent with all events going forward. As an example, you can call `addEventProperties` as follows:

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.addEventProperties({"ab test variant": "a"});
```

{% endtab %}

{% tab title="React Native" %}

```javascript
Freshpaint.addEventProperties({"ab test variant": "a"});
```

{% endtab %}
{% endtabs %}

The `ab test variant` property will now have the value `a` until `removeEventProperty` is called or `addEventProperties` is called with a new value of `ab test variant`. When you call `addEventProperties` with a new value of `ab test variant`, that value will overwrite the existing value.

See the [API docs on addEventProperties](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#addeventproperties) for more information.

### addPageviewProperties

The `addPageviewProperties` call lets you create data layer properties that are sent until the user leaves the current page. Once the user leaves the current page, any properties created with `addPageviewProperties` will now longer be sent. As an example, the call:

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.addPageviewProperties({"product name": "diamond ring", "price": 100});
```

{% endtab %}

{% tab title="React Native" %}
Not supported.
{% endtab %}
{% endtabs %}

will send the property `product name` with the value `diamond ring` and the property `price` with the value `100` as part of all events that occur on the current page. Once the user leaves the current page, the `product name` and `price` properties will no longer be sent. `addPageviewProperties` should be used for any properties that are specific to the page the user is currently on.

{% hint style="warning" %}
If you call `addPageviewProperties` you should call it as part of the Freshpaint snippet. Specifically you should call `addPageviewProperties` immediately after the `freshpaint.init()` call and before the call to `freshpaint.page()`. This ensures any pageview properties you set are attached to the pageview event created by Freshpaint.
{% endhint %}

See the [docs on addPageviewProperties](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#addpageviewproperties) for more information.

### addInitialEventProperties

The `addInitialEventProperties` call works like `addEventProperties` except it will not override a property if that property already has a value. As an example, if you want to attach the initial page a user landed on as a property, you can do that like so:

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.addInitialEventProperties({"initial landing page": "/article"});
```

{% endtab %}

{% tab title="React Native" %}

```javascript
Freshpaint.addInitialEventProperties({"initial landing page": "/article"});
```

{% endtab %}
{% endtabs %}

Now if you call `addInitialEventProperties` again with a different value of `initial landing page`, the property `initial landing page` will still be set to `/article`.

See the [API docs on addInitialEventProperties](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#addinitialeventproperties) for more information.

### removeEventProperty

To remove a data layer property, you can call the `removeEventProperty` api method. The call

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.removeEventProperty("pricing plan");
```

{% endtab %}

{% tab title="React Native" %}

```javascript
Freshpaint.removeEventProperty("pricing plan");
```

{% endtab %}
{% endtabs %}

will stop sending the property `pricing plan` going forward.

## Attaching Properties with Precision Tracking

If you send an event into Freshpaint with a manual track call, you can pass in a map of properties as the second argument:

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.track("Purchase", {"price": 500});
```

{% endtab %}

{% tab title="React Native" %}

```javascript
Freshpaint.track("Purchase", {"price": 500});
```

{% endtab %}

{% tab title="iOS Swift" %}

```swift
Freshpaint.shared().track(
    "Purchase", 
    properties: ["price": 500]
)
```

{% endtab %}

{% tab title="iOS Objective-C" %}

```objectivec
[[FPAnalytics sharedAnalytics]
              track:@"Purchase" 
              properties:@{ @"price": @500 }];
```

{% endtab %}

{% tab title="Android" %}

```java
Freshpaint
    .with(getActivity().getApplicationContext())
    .track("Purchase", new Properties().putValue("price", 500));
```

{% endtab %}
{% endtabs %}

See the [API docs on `freshpaint.track()` for more information.](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track)

## React Native Attribute Autotrack

For React Native, Freshpaint will automatically capture a whitelist of properties from your React components. For a complete list of properties collected by Freshpaint, see the docs on what information is collected by the React Native SDK. You can also whitelist your own properties. You can use these properties to narrow down event definitions when defining events. For example, Freshpaint captures the `title` property of React Native buttons, allowing you to define a CSS selector like so:

```
Button[title="Press Here"]
```

To whitelist your own properties, attach a `freshpaintOptions` argument to the component class with the attributes you would like to whitelist or blacklist. For example, if you have a functional component like:

```javascript
function MyComponent({ arg }) {
  ...
}
```

You can capture the `arg` property by adding the following bit of code:

```javascript
MyComponent.freshpaintOptions = {
  eventProps: {
    include: ['arg'],
  }
};
```

If you are using a class component, you instead set the `freshpaintOptions` property of the class like so:

```javascript
class MyComponent extends Component {
  freshpaintOptions = {
    eventProps: {
      include: ['arg'],
    }
  };
}
```


# Setting up Your Integrations

Now that you've gone through and set up your account, we recommend going through and setting up all the integrations you'll need.

To set up a new Integration, from the [Integrations Overview](https://app.freshpaint.io/destinations/overview) page, go to the [Integrations Catalog](https://app.freshpaint.io/destinations/catalog),

<figure><img src="/files/lGxPyzyzlJmOBTYTW8dA" alt=""><figcaption></figcaption></figure>

From the Integration Catalog, find your the desired tool and click **set up**.

<figure><img src="/files/BvrDbkZqHcQ8ZJU085a9" alt=""><figcaption></figcaption></figure>

Setting up each Integration will be slightly different. Look for the "**Configure**" sections, which will prompt you for information and credentials for that specific Integration. After configuring, you must [enable the Integration](/readme/setting-up-your-destinations/enabling-and-disabling-a-destination) before Freshpaint will begin sending data.

<figure><img src="/files/m9MXfaoC98WG0466PQcR" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
If you already have a Integration tool installed on your site, make sure to remove it before you configure it Freshpaint. Having a Integration installed both installed natively on your website and enabled in Freshpaint will cause activity to be double-counted.
{% endhint %}


# Enabling and Disabling a Destination

To prevent unintentionally sending data, Destinations are added in a **disabled** state by default.

To enable a Destination, navigate to its configuration page clicking **Details** (either in the Overview or the Destination's subcategory).

<figure><img src="/files/GQ1FAqPM0qtQ62TDLaI7" alt=""><figcaption></figcaption></figure>

Once in the Destination's configuration page, you will see the **Enable** button.

<figure><img src="/files/VkSeK8iYcUTpjiqPyv8A" alt=""><figcaption></figcaption></figure>

When the Destination is enabled, this same button becomes the **Disable** button, which can be used to disable that particular Destination configuration (other configurations of the same Destination are not impacted by this change).

Destinations can only be deleted when they are in a disabled state.


# Deleting a Destination

Destinations can only be deleted when they are in a disabled state.

To delete a Destination, first [disable it](/readme/setting-up-your-destinations/enabling-and-disabling-a-destination), then find the **Delete Destination** button below the Enable/Disable button.

<figure><img src="/files/gLxfeQsEz6FOQQyZ0LGw" alt=""><figcaption></figcaption></figure>


# Setting up Your Events

Setting up your events is the most important part of setting up Freshpaint. Once you've setup your events, you can then send those events into any of the destinations you have enabled. We recommend creating a spreadsheet of all the events you and your team will need. Once you've created this list, go through and define each of them.

{% hint style="info" %}
If you are on our paid account plan, we'll guide you through the implementation process and help you develop an event capture strategy.\
\
Reach out to <support@freshpaint.io> and we'll find a time to jump on an onboarding call together.
{% endhint %}

There are several ways to define events in Freshpaint:

When possible, we recommend defining events with either the visual tagger or with Live View. Here is a table of which ways to define events are supported by each SDK:

|                                                                                                                 | Web     | React Native | iOS     | Android |
| --------------------------------------------------------------------------------------------------------------- | ------- | ------------ | ------- | ------- |
| [The Visual Tagger](https://documentation.freshpaint.io/readme/setting-up-your-events#the-visual-editor)        | **YES** | no           | no      | no      |
| [The Live View](https://documentation.freshpaint.io/readme/setting-up-your-events#liveview)                     | **YES** | no           | no      | no      |
| [The Event Library](#the-event-library)                                                                         | **YES** | **YES**      | no      | no      |
| [With Precision Tracking](https://documentation.freshpaint.io/readme/setting-up-your-events#precision-tracking) | **YES** | **YES**      | **YES** | **YES** |

## The Visual Tagger

![](/files/-MASa8En3qUMokggvs6i)

The visual tagger is the recommended way to setup events for non-technical users. The visual tagger provides a point and click interface for creating events. For more information on how to use the visual tagger, see our guide:

{% content-ref url="/pages/GolcOdNoHBrmglNXb7wP" %}
[Visual Tagger](/admin-panel/events/visual-tagger)
{% endcontent-ref %}

## Liveview

![](/files/-MFbToT6WKyRlL3Z9ee7)

Defining events through Liveview is the other way we recommend defining events. If you want to define an action, you can perform it on your website, then click **Create Event** in Liveview next to the action you just performed. This will take you to the events library page with the definition for your event pre-populated. For more information, see our guide to the Liveview:

{% content-ref url="/pages/-MA7mdGn5xPxNWaqgJQk" %}
[Live View](/admin-panel/investigate-testing-and-debugging/liveview)
{% endcontent-ref %}

## The Event Library

![](/files/-MAbrHQ1wfF0HX73Q8Vh)

The event library editor is a more advanced way to define events. The event editor is more expressive than either liveview or the visual tagger, but you do need to be a bit technical to understand how to use it. If you are technical and want to create an event definition that you can't easily express in the visual tagger, the event library editor may be the best option available. See our guide to the Event Library for more information:

{% content-ref url="/pages/-MA7mT5mlBxf1RLoYPvc" %}
[Event Library](/admin-panel/events)
{% endcontent-ref %}

## Precision Tracking

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.track("login", {"property": "value"});
```

{% endtab %}

{% tab title="React Native" %}

```javascript
freshpaint.track("login", {"property": "value"});
```

{% endtab %}

{% tab title="iOS Swift" %}

```swift
Freshpaint.shared().track(
    "Purchase", 
    properties: ["price": 500]
)
```

{% endtab %}

{% tab title="iOS Objective-C" %}

```objectivec
[[FPAnalytics sharedAnalytics]
              track:@"login" 
              properties:@{ @"property": @"value" }];
```

{% endtab %}

{% tab title="Android" %}

```java
Freshpaint
    .with(getActivity().getApplicationContext())
    .track("login", new Properties().putValue("property", "value"));
```

{% endtab %}
{% endtabs %}

If you want to track events that aren't automatically captured by Autotrack, you can use the traditional approach of writing code to collect that data. See the docs on the Precision Tracking source for more information:

{% content-ref url="/pages/-MCFOC93\_TR504V9KDaF" %}
[Precision Tracking](/integrations/sources/web/precision-tracking)
{% endcontent-ref %}

## Cross Domain Tracking

Our **Cross-Domain Tracking** feature ensures seamless user tracking across multiple domains by passing unique identifiers and other parameters from one domain to another (Freshpaint must be installed on all domains). This approach eliminates tracking gaps, enhances analytics accuracy, and supports a more comprehensive understanding of the customer journey. Click the link below to read more about Cross Domain tracking.


# User Identification

Identify is how you send information to Freshpaint and your destinations about who your users are. There are two parts to using identify:

* Attaching unique identifiers to users.
* Attaching properties to users.

## Attaching Unique Identifiers

By default, when a user visits your site, Freshpaint and downstream tools will identify the user based on a randomly generated identifier stored in a cookie. Freshpaint refers to this identifier as either the "Anonymous ID" or "Device ID". Because the identifier is stored in a cookie, when a user visits your site on their phone and on their laptop, they will show up as two different users. To remedy this situation, Freshpaint provides identify, a way for you to provide your own identifier so Freshpaint and downstream tools can merge the data across different devices.

To setup identify, you can call the [identify API call](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#identify). The following example call attaches the identifier `ada.lovelace@example.com` to the current user:

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.identify('ada.lovelace@example.com');
```

{% endtab %}

{% tab title="React Native" %}

```javascript
Freshpaint.identify('ada.lovelace@example.com');
```

{% endtab %}

{% tab title="iOS Swift" %}

```swift
Freshpaint.shared().identify("ada.lovelace@example.com");
```

{% endtab %}

{% tab title="iOS Objective-C" %}

```objectivec
[[FPAnalytics sharedAnalytics] identify:@"ada.lovelace@example.com"]
```

{% endtab %}

{% tab title="Android" %}

```java
Freshpaint
    .with(getActivity().getApplicationContext())
    .identify("ada.lovelace@example.com");
```

{% endtab %}
{% endtabs %}

When setting up identify, we recommend calling `freshpaint.identify()` in two different places:

* When a user registers for an account.
* When a user signs in.

As for a unique identifier, if you have internal ids that are unique to a user, we recommend using those. Otherwise, we recommend using either the username or the email of the user.

## Attaching User Properties

The second part of identify is attaching properties to user. This allows you to send information you have about the user into your Freshpaint destinations. To attach properties to a user, you pass in the properties you want to set as the second argument to `freshpaint.identify()`:

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.identify({
  email: 'ada.lovelace@example.com',
  name: 'Ada Lovelace',
});
```

{% endtab %}

{% tab title="React Native" %}

```javascript
Freshpaint.identify({
  email: 'ada.lovelace@example.com',
  name: 'Ada Lovelace',
});
```

{% endtab %}

{% tab title="iOS Swift" %}

```swift
Freshpaint.shared().identify(
    nil,
    traits: [
        "email": "ada.lovelace@example.com",
        "name": "Ada Lovelace"
    ]
)
```

{% endtab %}

{% tab title="iOS Objective-C" %}

```objectivec
[[FPAnalytics sharedAnalytics]
              identify:nil
              traits:@{ @"email": @"ada.lovelace@example.com",
                        @"name": @"Ada Lovelace" }]
```

{% endtab %}

{% tab title="Android" %}

```java
Freshpaint
    .with(getActivity().getApplicationContext())
    .identify(new Traits()
        .putValue("email", "ada.lovelace@example.com")
        .putValue("name", "Ada Lovelace")
    );
```

{% endtab %}
{% endtabs %}

You should pass any information you know about your users that you want to use in your downstream tools to `freshpaint.identify()`.

`freshpaint.identify()` can also be called with both an identifier and a JSON object at the same time:

{% tabs %}
{% tab title="Web" %}

```javascript
freshpaint.identify('ada.lovelace@example.com', {
  email: 'ada.lovelace@example.com',
  name: 'Ada Lovelace',
});
```

{% endtab %}

{% tab title="React Native" %}

```javascript
Freshpaint.identify('ada.lovelace@example.com', {
  email: 'ada.lovelace@example.com',
  name: 'Ada Lovelace',
});
```

{% endtab %}

{% tab title="iOS Swift" %}

```swift
Freshpaint.shared().identify(
    "ada.lovelace@example.com",
    traits: [
      "email": "ada.lovelace@example.com",
      "name": "Ada Lovelace"
    ]
);
```

{% endtab %}

{% tab title="iOS Objective-C" %}

```objectivec
[[FPAnalytics sharedAnalytics]
              identify:@"ada.lovelace@example.com"
              traits:@{ @"email": @"ada.lovelace@example.com",
                        @"name": @"Ada Lovelace" }]
```

{% endtab %}

{% tab title="Android" %}

```java
Freshpaint
    .with(getActivity().getApplicationContext())
    .identify("ada.lovelace@example.com", new Traits()
        .putValue("email", "ada.lovelace@example.com")
        .putValue("name", "Ada Lovelace")
    );
```

{% endtab %}
{% endtabs %}

## User Information

To retrieve information about a specific user, you can use the call the method `freshpaint.user().traits()` on the client. This will return an object containing the user’s associated traits.

* The `.user()` method provides access to user-related information, including:
  * User ID
  * Traits
  * Anonymous ID
* The `.traits()` method can be used to:
  * Retrieve existing traits
  * Update or set new ones


# Designated Identify Properties

Some destinations treat certain identify properties specially. As an example, some destinations treat the `email` property as the email to use when sending an email to a user. This page lists the destinations that accept designated properties and the properties they accept.

## Customer.io

| Property | Description                                                   |
| -------- | ------------------------------------------------------------- |
| `email`  | This is the email customer.io will use when sending an email. |

## Fullstory

| Property      | Description                                         |
| ------------- | --------------------------------------------------- |
| `displayName` | This is the name to show for the user in FullStory. |
| `email`       | This will show up as the user's email in FullStory. |

[See the FullStory docs on identifying users in FullStory for more information.](https://help.fullstory.com/hc/en-us/articles/360020828113)

## HubSpot

| Property | Description                                                                                                        |
| -------- | ------------------------------------------------------------------------------------------------------------------ |
| `email`  | HubSpot requires you send the `email` property. The value of this property will be used as the email for the user. |

## Iterable

| Property | Description                                                                                           |
| -------- | ----------------------------------------------------------------------------------------------------- |
| `email`  | In order to email a user in Iterable, you must first send an identify call with the `email` property. |

## Vero

| Property | Description                                                                                       |
| -------- | ------------------------------------------------------------------------------------------------- |
| `email`  | In order to email a user in Vero, you must first send an identify call with the `email` property. |

## Gainsight

<table data-header-hidden><thead><tr><th>Property</th><th>Description</th><th data-hidden></th></tr></thead><tbody><tr><td>Property</td><td>Description</td><td></td></tr><tr><td><code>Email</code></td><td>Gainsight requires an email field for each identify call.</td><td></td></tr></tbody></table>


# Maps

Freshpaint offers a HIPAA-compliant, Customizable, Zoomable, Panable map and location services APIs that can be embedded within healthcare focused websites.

{% hint style="info" %}
Welcome to the latest version of our Maps feature.

* New users: Please continue reading to learn more.
* Existing users of the older version seeking references: Please refer to [Maps v0 (deprecated)](/readme/maps/maps-v0-deprecated).
  {% endhint %}

## Introduction

Many healthcare organizations utilize maps as part of their web presence to aid in user conversions by understanding where a healthcare provider is located. Freshpaint offers a series of HIPAA safe base components for building Maps components and location services into a web page.

### Map Tiles

Map tiles are the data about how to draw a map at a particular location. These tiles contain all the information about the locations of everything to be drawn a map, all the rivers, roadways, labels, buildings, and more.

Freshpaint serves tile information based on AWS's Location Services which uses [HERE maps](https://www.here.com/) as its provider.

### Drawing a Map

Freshpaint recommends using [MapLibre GL JS](https://maplibre.org/maplibre-gl-js/docs/) as the code library to use to draw the maps on a web page. Maplibre-js is a fully featured open-source library that understands the map tiles served by Freshpaint and can render them into a map on a web page. Maplibre also provides similar functionality as other mapping services you may have used or seen elsewhere.

If your website is built using a framework, you can use any of the MapLibre libraries or wrappers that are available for the particular framework.

Freshpaint provides access to the unmodified MapLibre libraries from the freshpaint-hipaa-maps.com domain if you want a convenient place to access the web libraries for drawing a map.

```html
<link href="https://freshpaint-hipaa-maps.com/maplibre-gl@3.x/dist/maplibre-gl.css" rel="stylesheet" type="text/css">
<script src="https://freshpaint-hipaa-maps.com/maplibre-gl@3.x/dist/maplibre-gl.js" type="text/javascript"> </script>
```

### Location Services API

Some more interactive web experiences require the use of location services APIs. Freshpaint provides access to a number of location services APIs that are used for Geocoding, Reverse Geocoding, and location search.

For example, a website developer may want to organize location results by distance from a website visitor. This might be done through requesting a zip code from the user. The location API allows the website to request the coordinates of a zip code, and then knowing the latitude and longitude of both the zip code and locations allows code to be written that will reorganize the results based on distance.

Freshpaint provides access to the [Amazon AWS Location Service](https://aws.amazon.com/location/) for providing location APIs to a website visitor.

## Using the Location Services API

Freshpaint provides access to the Amazon AWS Location Services by accessing Freshpaint services.

So in the amazon location services docs, you might see:

`/v2/autocomplete?key=Key`

You would instead use

```
https://freshpaint-hipaa-maps.com/v2/autocomplete?token=YOUR-ENVIRONMENT-ID-HERE
```

See <https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id> on how to find your environment ID and replace `YOUR-ENVIRONMENT-ID-HERE` with the token for your Freshpaint environment.

{% hint style="info" %}
The AWS API Docs indicate the use of an API Key as the ?key=Key parameter on their examples. When using the location services with Freshpaint you instead use ?token=YOUR-ENVIRONMENT-ID-HERE to access the location services from Freshpaint. The key parameter is not used when accessing the location services through freshpaint-hipaa-maps.com
{% endhint %}

### Common Functions

#### Please refer to the [AWS Location Services Places documentation](https://docs.aws.amazon.com/location/latest/APIReference/API_Operations_Amazon_Location_Service_Places_V2.html) for details on how to use the following actions: <a href="#api_searchplaceindexforsuggestions" id="api_searchplaceindexforsuggestions"></a>

* [Autocomplete](https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_Autocomplete.html): completes potential places and addresses as the user types, based on the partial input.
* [Geocode](https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_Geocode.html): converts a textual address or place into geographic coordinates.
* [GetPlace](https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_GetPlace.html): finds a place by its unique ID. A `PlaceId` is returned by other listed actions.
* [ReverseGeocode](https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_ReverseGeocode.html): converts geographic coordinates into a human-readable address or place.
* [SearchNearby](https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_SearchNearby.html): queries for points of interest within a radius from a central coordinates, returning place results with optional filters such as categories, business chains, food types and more.
* [SearchText](https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_SearchText.html): searches for geocode and place information. Can use the query ID from `Suggest` action to run a follow up query.
* [Suggest](https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_Suggest.html): provides intelligent predictions or recommendations based on the user's input or context, such as relevant places, points of interest, query terms or search category.

## Examples

The example site has a full working demo that you can inspect and customize to your needs.

{% embed url="<https://freshpaint-hipaa-maps.com/demo/index.html>" %}
A demo site showing the Freshpaint map connected to clickable location cards. When you click on a location card, the map automatically focuses on the location. When you click on a pin, the location cards automatically scroll to the selected location.
{% endembed %}

{% hint style="info" %}
You can use view-source in your browser to see how the demo was built in pure Javascript and HTML.
{% endhint %}

### Map Setup: Vanilla JS

Freshpaint uses MapLibre as an open-source renderer to display the map. You will need to load MapLibre and its stylesheet.

```html
<link href="https://freshpaint-hipaa-maps.com/maplibre-gl@3.x/dist/maplibre-gl.css" rel="stylesheet" type="text/css">
<script src="https://freshpaint-hipaa-maps.com/maplibre-gl@3.x/dist/maplibre-gl.js" type="text/javascript"> </script>
```

#### Creating a Map

<pre class="language-javascript"><code class="lang-javascript">// Styles affect how the maps look:
// We currently support the following styles:
//   "standard-light":      colorized, typical map style
//   "standard-dark":       colorized, typical dark map style
//   "visualization-light": grayscale, elegant black and white style
//   "visualization-dark":  grayscale, elegant dark black and white style
const style = "standard-light" 

// Replace the environment ID below with your freshpaint environment ID
// Go to the URL below to see how to find your Freshpaint Environment ID
<strong>// https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id
</strong>const envId = "YOUR-FRESHPAINT-ENVIRONMENT-ID"

const map = new maplibregl.Map({
  container: "map",
  style: `https://freshpaint-hipaa-maps.com/${envId}/${style}/style-descriptor`,

  // longitude and latitude of the map's origin
  // Note: this is backwards compared to google maps
  center: [-87.6800, 41.8500],

  // Zoom levels (rough descriptions):
  // 15 : a close street view
  // 13 : city neighborhoods
  // 11 : entire region (Chicagoland)
  zoom: 13,
});

// This adds a toolbar for zooming an panning:
// + : zoom in
// - : zoom out
// compass for rotating (e.g. north facing up or south facing up)
map.addControl(new maplibregl.NavigationControl(), "top-left");

</code></pre>

#### Adding pins with popups

<pre class="language-javascript"><code class="lang-javascript">// Note: LngLat is reversed from google maps which does LatLng.
const markers = [
  {
    "LngLat": [-87.7276, 41.7919],
    "Header": "UI Health",
    "Href": "https://hospital.uillinois.edu/"
  },
  {
    "LngLat": [-87.69738, 41.85505],
    "Header": "Saint Anthony Hospital",
    "Href": "https://sahchicago.org/"
  }
];

<strong>// You can customize popups with arbitrary HTML
</strong>// Here, we just do a simple header and link to the website
const newPopup = (m) => new maplibregl.Popup({ offset: 25 })
                                      .setHTML(`&#x3C;div>
                                                    &#x3C;h3>${m.Header}&#x3C;\/h3>
                                                    &#x3C;a href="${m.Href}">${m.Href}&#x3C;\/a>
                                                &#x3C;\/div>`)

markers.forEach((m) => {
  const popup = newPopup(m);
  const marker = new maplibregl.Marker({color: "#808080"})
                               .setLngLat(m.LngLat)
                               .setPopup(popup)
                               .addTo(map);
});


</code></pre>

#### Full working example

See the working demo at <https://freshpaint-hipaa-maps.com/demo/index.html> for a demo with the Freshpaint map connected to clickable location cards.

This demo shows how to add on-click handlers to customize behaviors when users click on Map pins. It also shows how to link external actions to the Map (e.g. so on-click outside of the map cause the map to recenter).

### Location Search Setup:

Freshpaint also offers a HIPAA-compliant Location search service that finds location matches to user inputs. We offer a backend that can be used with your autocomplete frontend of choice.

<figure><img src="/files/VEzhEOJDX2SUdUUpLtne" alt="" width="563"><figcaption><p>Example location autocomplete</p></figcaption></figure>

#### API Details

The API is accessible at

<pre><code><strong>// Replace the environment ID below with your freshpaint environment ID
</strong>// Go to the URL below to see how to find your Freshpaint Environment ID
// https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id

POST `https://freshpaint-hipaa-maps.com/v2/autocomplete?token=YOUR-ENVIRONMENT-ID-HERE`
</code></pre>

#### Request body

Because we use AWS Location Services, a full account of all supported features, and inputs can be found here:

{% embed url="<https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_Autocomplete.html>" %}

#### Sample CURL request

```bash
// Replace the TOKEN variable with your freshpaint environment ID
// Go to the URL below to see how to find your Freshpaint Environment ID
// https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id

TOKEN="YOUR-FRESHPAINT-ENV-ID-HERE"

curl 'https://freshpaint-hipaa-maps.com/v2/autocomplete?token=$TOKEN' \
  -H 'accept: application/json' \
  -d '{"QueryText":"chicago", "BiasPosition": [-87.69420, 41.86181], "MaxResults":8,"Filter":{"IncludeCountries":["USA"]}}'

```

### Reverse Geocoding Setup:

Freshpaint also offers a HIPAA-compliant Reverse Geocoding API that allows you to look up an address based on Latitude and Longitude.

#### API Details

The API is accessible at

```
# Replace the environment ID below with your freshpaint environment ID
# Go to the URL below to see how to find your Freshpaint Environment ID
# https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id

POST 'https://freshpaint-hipaa-maps.com/v2/reverse-geocode?token=YOUR-ENVIRONMENT-ID-HERE'
```

#### Request body

Because we use AWS Location Services, a full account of all supported features, and inputs can be found here:

{% embed url="<https://docs.aws.amazon.com/location/latest/APIReference/API_geoplaces_ReverseGeocode.html>" %}

#### Sample CURL request

<pre class="language-bash"><code class="lang-bash"># Replace the TOKEN variable with your freshpaint environment ID
# Go to the URL below to see how to find your Freshpaint Environment ID
# https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id
TOKEN="YOUR-FRESHPAINT-ENV-ID-HERE"

curl 'https://freshpaint-hipaa-maps.com/v2/reverse-geocode?token=$TOKEN' \
  -H 'accept: application/json' \
<strong>  -d '{"QueryPosition": [-122.3394,47.6159], "MaxResults": 8}'
</strong>
</code></pre>

## Frequently Asked Questions

**Can I use Freshpaint maps with React, Angular, or other web frameworks?**

Yes. Freshpaint hasn't seen enough interest in any of these to prepare examples, but all that should be needed is to embed maplibre-js and point the library at the Freshpaint tiles as our regular JS demos use. If you need help you can always contact Freshpaint support.

**Can I zoom the map to automatically capture all of my locations?**

Yes. The maplibre fitBounds call supports providing a list of Longitude and Latitude pairs, and will provide a bounding box that contains all the added pins. When calling fitBounds on the map make sure to add some padding so any pins are not right on the edge of the bounding box.

```javascript
bounds = new maplibregl.LngLatBounds();
bounds.extend(m.LngLat); // Add every LngLat to the bounds
map.fitBounds(bounds, { padding: 100 }); // Set the padding to how much extra space is needed
```

**Can I use browser based location services to identify the location of the website visitor?**

Many browser support a geolocation API which will give you approximate coordinates of the browser if allowed by the user. See the [Geolocation API docs](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API) for what most web browsers will provide for accessing web visitor coordinates.

**Can I install maplibre into my project instead of using the version from Freshpaint**

Yes. The maplibre libraries provided by Freshpaint servers are not modified.

**Does the Freshpaint SDK need to be installed on a page for the Maps feature to work?**

No, the Maps feature can work independently on your page without depending on the presence of the Freshpaint SDK. You only need the Freshpaint SDK loaded if you wish to track interactions with the map. Otherwise, it can be used as a standalone HIPAA-compliant map plugin.


# Maps v0 (deprecated)

Freshpaint offers a HIPAA-compliant, Customizable, Zoomable, Panable map and location services APIs that can be embedded within healthcare focussed websites.

{% hint style="danger" %}

## This version of Maps has been deprecated. If you're a new adopter of maps, please refer to [Maps](/readme/maps) instead for instructions on how to integrate with the most up to date version of Maps. If you have already integrated and are looking for references, please read on.

{% endhint %}

## Introduction

Many healthcare organizations utilize maps as part of their web presence to aid in user conversions by understanding where a healthcare provider is located. Freshpaint offers a series of HIPAA safe base components for building Maps components and location services into a web page.

### Map Tiles

Map tiles are the data about how to draw a map at a particular location. These tiles contain all the information about the locations of everything to be drawn a map, all the rivers, roadways, labels, buildings, and more.

Freshpaint serves tile information based on AWS's Location Services which uses [HERE maps](https://www.here.com/) as its provider.

### Drawing a Map

Freshpaint recommends using [MapLibre GL JS](https://maplibre.org/maplibre-gl-js/docs/) as the code library to use to draw the maps on a web page. Maplibre-js is a fully featured open-source library that understands the map tiles served by Freshpaint and can render them into a map on a web page. Maplibre also provides similar functionality as other mapping services you may have used or seen elsewhere.

If your website is built using a framework, you can use any of the MapLibre libraries or wrappers that are available for the particular framework.

Freshpaint provides access to the unmodified MapLibre libraries from the freshpaint-hipaa-maps.com domain if you want a convenient place to access the web libraries for drawing a map.

```html
<link href="https://freshpaint-hipaa-maps.com/maplibre-gl@3.x/dist/maplibre-gl.css" rel="stylesheet" type="text/css">
<script src="https://freshpaint-hipaa-maps.com/maplibre-gl@3.x/dist/maplibre-gl.js" type="text/javascript"> </script>
```

### Location Services API

Some more interactive web experiences require the use of location services APIs. Freshpaint provides access to a number of location services APIs that are used for Geocoding, Reverse Geocoding, and location search.

For example, a website developer may want to organize location results by distance from a website visitor. This might be done through requesting a zip code from the user. The location API allows the website to request the coordinates of a zip code, and then knowing the latitude and longitude of both the zip code and locations allows code to be written that will reorganize the results based on distance.

Freshpaint provides access to the [Amazon AWS Location Service](https://aws.amazon.com/location/) for providing location APIs to a website visitor.

## Using the Location Services API

Freshpaint provides access to the Amazon AWS Location Services by accessing Freshpaint services.

So in the amazon location services docs, you might see:

`/places/v0/indexes/IndexName/search/suggestions?key=Key`

You would instead use

```
https://freshpaint-hipaa-maps.com/places/v0/indexes/freshpaint/search/suggestions?token=YOUR-ENVIRONMENT-ID-HERE
```

See <https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id> on how to find you're environment ID and replace `YOUR-ENVIRONMENT-ID-HERE` with the token for you're particular Freshpaint environment.

{% hint style="info" %}
The AWS API Docs indicate the use of an API Key as the ?key=Key parameter on their examples. When using the location services with Freshpaint you instead use ?token=YOUR-ENVIRONMENT-ID-HERE to access the location services from Freshpaint. The key parameter is not used when accessing the location services through freshpaint-hipaa-maps.com
{% endhint %}

### Common Functions

#### SearchPlaceIndexForSuggestions <a href="#api_searchplaceindexforsuggestions" id="api_searchplaceindexforsuggestions"></a>

Generates suggestion results for addresses or point of interest based on partial or misspelled free-form text. This could be used for functionality related to autocomplete, autosuggest, or fuzzy matching.

[AWS Docs for SearchPlaceIndexForSuggestions](https://docs.aws.amazon.com/location/previous/APIReference/API_SearchPlaceIndexForSuggestions.html)

#### SearchPlaceIndexForText

Geocodes free-form text, such as an address, name, city, or region to allow you to search for a place or point of interest. You can apply filters or bounding boxes in the request to only return locations in the correct geography.

[AWS Docs for SearchPlaceIndexForText](https://docs.aws.amazon.com/location/previous/APIReference/API_SearchPlaceIndexForText.html)

#### SearchPlaceIndexForPosition

Sometimes referred to as Reverse Geo-coding, takes a given coordinate and returns a Place and information such as address, country, etc related to the returned Place.

[AWS Docs For SearchPlaceIndexForPosition](https://docs.aws.amazon.com/location/previous/APIReference/API_SearchPlaceIndexForPosition.html)

#### GetPlace

Returns additional information about a place. Other API operations may return a PlaceID, and GetPlace can be used to find the address, categories, countries and more about the PlaceID.

[AWS Docs for GetPlace](https://docs.aws.amazon.com/location/previous/APIReference/API_GetPlace.html)

## Examples

The example site has a full working demo that you can inspect and customize to your needs.

{% embed url="<https://freshpaint-hipaa-maps.com/demo/v0/index.html>" %}
A demo site showing the Freshpaint map connected to clickable location cards. When you click on a location card, the map automatically focuses on the location. When you click on a pin, the location cards automatically scroll to the selected location.
{% endembed %}

{% hint style="info" %}
You can use view-source in your browser to see how the demo was built in pure Javascript and HTML.
{% endhint %}

### Map Setup: Vanilla JS

Freshpaint uses MapLibre as an open-source renderer to display the map. You will need to load MapLibre and its stylesheet.

```html
<link href="https://freshpaint-hipaa-maps.com/maplibre-gl@3.x/dist/maplibre-gl.css" rel="stylesheet" type="text/css">
<script src="https://freshpaint-hipaa-maps.com/maplibre-gl@3.x/dist/maplibre-gl.js" type="text/javascript"> </script>
```

#### Creating a Map

<pre class="language-javascript"><code class="lang-javascript">// Styles affect how the maps look:
// We currently support the following styles:
//   "standard-light":      colorized, typical map style
//   "standard-dark":       colorized, typical dark map style
//   "visualization-light": grayscale, elegant black and white style
//   "visualization-dark":  grayscale, elegant dark black and white style
const style = "standard-light" 

// Replace the environment ID below with your freshpaint environment ID
// Go to the URL below to see how to find your Freshpaint Environment ID
<strong>// https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id
</strong>const envId = "YOUR-FRESHPAINT-ENVIRONMENT-ID"

const map = new maplibregl.Map({
  container: "map",
  style: `https://freshpaint-hipaa-maps.com/${envId}/${style}/style-descriptor`,

  // longitude and latitude of the map's origin
  // Note: this is backwards compared to google maps
  center: [-87.6800, 41.8500],

  // Zoom levels (rough descriptions):
  // 15 : a close street view
  // 13 : city neighborhoods
  // 11 : entire region (Chicagoland)
  zoom: 13,
});

// This adds a toolbar for zooming an panning:
// + : zoom in
// - : zoom out
// compass for rotating (e.g. north facing up or south facing up)
map.addControl(new maplibregl.NavigationControl(), "top-left");

</code></pre>

#### Adding pins with popups

<pre class="language-javascript"><code class="lang-javascript">// Note: LngLat is reversed from google maps which does LatLng.
const markers = [
  {
    "LngLat": [-87.7276, 41.7919],
    "Header": "UI Health",
    "Href": "https://hospital.uillinois.edu/"
  },
  {
    "LngLat": [-87.69738, 41.85505],
    "Header": "Saint Anthony Hospital",
    "Href": "https://sahchicago.org/"
  }
];

<strong>// You can customize popups with arbitrary HTML
</strong>// Here, we just do a simple header and link to the website
const newPopup = (m) => new maplibregl.Popup({ offset: 25 })
                                      .setHTML(`&#x3C;div>
                                                    &#x3C;h3>${m.Header}&#x3C;\/h3>
                                                    &#x3C;a href="${m.Href}">${m.Href}&#x3C;\/a>
                                                &#x3C;\/div>`)

markers.forEach((m) => {
  const popup = newPopup(m);
  const marker = new maplibregl.Marker({color: "#808080"})
                               .setLngLat(m.LngLat)
                               .setPopup(popup)
                               .addTo(map);
});


</code></pre>

#### Full working example

See the working demo at <https://freshpaint-hipaa-maps.com/demo/v0/index.html> for a demo with the Freshpaint map connected to clickable location cards.

This demo shows how to add on-click handlers to customize behaviors when users click on Map pins. It also shows how to link external actions to the Map (e.g. so on-click outside of the map cause the map to recenter).

### Location Search Setup:

Freshpaint also offers a HIPAA-compliant Location search service that finds location matches to user inputs. We offer a backend that can be used with your autocomplete frontend of choice.

<figure><img src="/files/AKZvUDdOrS2hwZHfkRnJ" alt=""><figcaption><p>Example location autocomplete.</p></figcaption></figure>

#### API Details

The API is accessible at

<pre><code><strong>// Replace the environment ID below with your freshpaint environment ID
</strong>// Go to the URL below to see how to find your Freshpaint Environment ID
// https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id

POST `https://freshpaint-hipaa-maps.com/places/v0/indexes/freshpaint/search/suggestions?token=YOUR-ENVIRONMENT-ID-HERE`
</code></pre>

#### Request body

Because we use AWS Location Services, a full account of all supported features, and inputs can be found here: <https://docs.aws.amazon.com/location/previous/APIReference/API_SearchPlaceIndexForSuggestions.html>

#### Sample CURL request

```bash
// Replace the TOKEN variable with your freshpaint environment ID
// Go to the URL below to see how to find your Freshpaint Environment ID
// https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id

TOKEN="YOUR-FRESHPAINT-ENV-ID-HERE"

curl -H 'Content-Type: application/json' \
"https://freshpaint-hipaa-maps.com/places/v0/indexes/freshpaint/search/suggestions?token=$TOKEN" \
-d '{"Text": "Good", "MaxResults": 8, "BiasPosition": [-87.69420, 41.86181], "FilterCountries": ["USA"], "FilterCategories": ["MunicipalityType"]}'

```

### Reverse Geocoding Setup:

Freshpaint also offers a HIPAA-compliant Reverse Geocoding API that allows you to look up an address based on Latitude and Longitude.

#### API Details

The API is accessible at

```
# Replace the environment ID below with your freshpaint environment ID
# Go to the URL below to see how to find your Freshpaint Environment ID
# https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id

POST 'https://freshpaint-hipaa-maps.com/places/v0/indexes/freshpaint/search/position?token=YOUR-ENVIRONMENT-ID-HERE'
```

#### Request body

Because we use AWS Location Services, a full account of all supported features, and inputs can be found here:

<https://docs.aws.amazon.com/location/previous/APIReference/API_SearchPlaceIndexForPosition.html>

#### Sample CURL request

```bash
# Replace the TOKEN variable with your freshpaint environment ID
# Go to the URL below to see how to find your Freshpaint Environment ID
# https://documentation.freshpaint.io/reference/faqs/where-do-i-find-my-environment-id
TOKEN="YOUR-FRESHPAINT-ENV-ID-HERE"

curl -H 'Content-Type: application/json' \
"https://freshpaint-hipaa-maps.com/places/v0/indexes/freshpaint/search/position?token=$TOKEN" \
-d '{"Position": [-122.3394,47.6159], "MaxResults": 8}'

```

## Frequently Asked Questions

**Can I use Freshpaint maps with React, Angular, or other web frameworks?**

Yes. Freshpaint hasn't seen enough interest in any of these to prepare examples, but all that should be needed is to embed maplibre-js and point the library at the Freshpaint tiles as our regular JS demos use. If you need help you can always contact Freshpaint support.

**Can I zoom the map to automatically capture all of my locations?**

Yes. The maplibre fitBounds call supports providing a list of Longitude and Latitude pairs, and will provide a bounding box that contains all the added pins. When calling fitBounds on the map make sure to add some padding so any pins are not right on the edge of the bounding box.

```javascript
bounds = new maplibregl.LngLatBounds();
bounds.extend(m.LngLat); // Add every LngLat to the bounds
map.fitBounds(bounds, { padding: 100 }); // Set the padding to how much extra space is needed
```

**Can I use browser based location services to identify the location of the website visitor?**

Many browser support a geolocation API which will give you approximate coordinates of the browser if allowed by the user. See the [Geolocation API docs](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API) for what most web browsers will provide for accessing web visitor coordinates.

**Can I install maplibre into my project instead of using the version from Freshpaint**

Yes. The maplibre libraries provided by Freshpaint servers are not modified.


# Translations

Freshpaint offers a HIPAA-compliant translation widget giving customers access to 74 supported languages.

### Live Demo

The example site has a full working translation demo.

{% embed url="<https://www.freshhealth.co/>" %}
In this demo you can see the translation widget on the bottom left of the page
{% endembed %}

### How To Install

To install the Freshpaint Translation snippet on your site you need to have three pieces of information

1. Your environment ID ([Where do I find my Environment ID?](/reference/faqs/where-do-i-find-my-environment-id))
2. What languages does your site want to support (see our [list](#supported-languages) for our supported languages and their language codes).
3. What UI handler would you like to use and the appropriate handler settings (See specific [handler instructions](#snippets))

Once you have the above information you can edit your snippet and paste it into your website source code.

### Snippets

We currently have three UI styles clients can choose from. Once you choose the one you like, follow the instructions on how to edit it to get all the appropriate information in the snippet and placed on your site.

#### Floating UI

This format is a simple UI element that floats on top of the page on either the lower left or the right side of the page. This element is the easiest to install because it doesn't require any existing HTML on the page to inject itself.

<figure><img src="/files/coLTZPA6XZEEhZTBYo8S" alt=""><figcaption><p>UI elements are subject to modification based on your site's CSS.</p></figcaption></figure>

To edit this snippet follow these instructions:

1. Replace `ENV_ID_HERE` with your [Environment ID](/reference/faqs/where-do-i-find-my-environment-id).
2. Decide if you want the floating UI on the left or right. This snippet is set to left but the word `left` can be replaced with `right`.
3. Languages
   1. Decide what languages you want, you do not need to include English (In our example we will use Mexican Spanish, Russian, and Dutch)
   2. Find your language codes (In our example we have `es-MX`, `ru`, and `nl`)
   3. Format your languages as comma separated strings (`"es-MX", "ru", "nl"`)
   4. Replace `LANGUAGES_HERE` with your list
4. Paste this customized snippet onto your site.

{% code overflow="wrap" %}

```html
<script>(function(t){typeof define=="function"&&define.amd?define(t):t()})(function(){"use strict";((t,a,c,i=[],r=[])=>{let e=document.createElement("script");e.type="text/javascript",e.async=!0,e.src="//freshpaint-cdn.com/translation/translate.js",e.onload=function(){new Translate(document.documentElement,t,Translate.handlerFactory(a,...c),i,r)};let n=document.getElementsByTagName("script")[0];n?n.parentNode.insertBefore(e,n):document.head.appendChild(e)})("ENV_ID_HERE","floating",["left",[LANGUAGES_HERE]])});</script>
```

{% endcode %}

#### Inline Window UI

This format is takes up less space but is a little more complex to install since the website needs a destination of where it needs to be inserted.

<figure><img src="/files/XHIsRzhMrD3klHvBDXZ9" alt=""><figcaption><p>UI elements are subject to modification based on your site's CSS.</p></figcaption></figure>

To edit this snippet follow these instructions:

1. Replace `ENV_ID_HERE` with your [Environment ID](/reference/faqs/where-do-i-find-my-environment-id).
2. Insert an HTML div on your website with the ID `fp_translate`. If you need to use a different ID replace `fp_translate` in the snippet with the appropriate div ID.
   1. `<div id="fp_translate"></div>`
3. Languages
   1. Decide what languages you want, you do not need to include English (In our example we will use Mexican Spanish, Russian, and Dutch)
   2. Find your language codes (In our example we have `es-MX`, `ru`, and `nl`)
   3. Format your languages as comma separated strings (`"es-MX", "ru", "nl"`)
   4. Replace `LANGUAGES_HERE` with your list
4. Paste this customized snippet onto your site.

{% code overflow="wrap" %}

```html
<script>(function(t){typeof define=="function"&&define.amd?define(t):t()})(function(){"use strict";((t,a,c,i=[],r=[])=>{let e=document.createElement("script");e.type="text/javascript",e.async=!0,e.src="//freshpaint-cdn.com/translation/translate.js",e.onload=function(){new Translate(document.documentElement,t,Translate.handlerFactory(a,...c),i,r)};let n=document.getElementsByTagName("script")[0];n?n.parentNode.insertBefore(e,n):document.head.appendChild(e)})("ENV_ID_HERE","window",["fp_translate",[LANGUAGES_HERE]])});</script>
```

{% endcode %}

#### Basic UI

This format is our most basic UI. This element is meant for customers who need very little out of the box functionality and want to completely customize their experience.

<figure><img src="/files/4krzLNi8KbyAfozTBKpN" alt=""><figcaption><p>UI elements are subject to modification based on your site's CSS.</p></figcaption></figure>

To edit this snippet follow these instructions:

1. Replace `ENV_ID_HERE` with your [Environment ID](/reference/faqs/where-do-i-find-my-environment-id).
2. Insert an HTML div on your website with the ID `fp_translate`. If you need to use a different ID replace `fp_translate` in the snippet with the appropriate div ID.
   1. `<div id="fp_translate"></div>`
3. Languages
   1. Decide what languages you want, you do not need to include English (In our example we will use Mexican Spanish, Russian, and Dutch)
   2. Find your language codes (In our example we have `es-MX`, `ru`, and `nl`)
   3. Format your languages as comma separated strings (`"es-MX", "ru", "nl"`)
   4. Replace `LANGUAGES_HERE` with your list
4. Paste this customized snippet onto your site.

{% code overflow="wrap" %}

```html
<script>(function(t){typeof define=="function"&&define.amd?define(t):t()})(function(){"use strict";((t,a,c,i=[],r=[])=>{let e=document.createElement("script");e.type="text/javascript",e.async=!0,e.src="//freshpaint-cdn.com/translation/translate.js",e.onload=function(){new Translate(document.documentElement,t,Translate.handlerFactory(a,...c),i,r)};let n=document.getElementsByTagName("script")[0];n?n.parentNode.insertBefore(e,n):document.head.appendChild(e)})("ENV_ID_HERE","basic",["fp_translate",[LANGUAGES_HERE]])});</script>
```

{% endcode %}

### Supported Languages

| Language Code | Language Name         |
| ------------- | --------------------- |
| af            | Afrikaans             |
| sq            | Albanian              |
| am            | Amharic               |
| ar            | Arabic                |
| hy            | Armenian              |
| az            | Azerbaijani           |
| bn            | Bengali               |
| bs            | Bosnian               |
| bg            | Bulgarian             |
| ca            | Catalan               |
| zh            | Chinese (Simplified)  |
| zh-TW         | Chinese (Traditional) |
| hr            | Croatian              |
| cs            | Czech                 |
| da            | Danish                |
| fa-AF         | Dari                  |
| nl            | Dutch                 |
| en            | English               |
| et            | Estonian              |
| fa            | Farsi (Persian)       |
| tl            | Filipino, Tagalog     |
| fi            | Finnish               |
| fr            | French                |
| fr-CA         | French (Canada)       |
| ka            | Georgian              |
| de            | German                |
| el            | Greek                 |
| gu            | Gujarati              |
| ht            | Haitian Creole        |
| ha            | Hausa                 |
| he            | Hebrew                |
| hi            | Hindi                 |
| hu            | Hungarian             |
| is            | Icelandic             |
| id            | Indonesian            |
| ga            | Irish                 |
| it            | Italian               |
| ja            | Japanese              |
| kn            | Kannada               |
| kk            | Kazakh                |
| ko            | Korean                |
| lv            | Latvian               |
| lt            | Lithuanian            |
| mk            | Macedonian            |
| ms            | Malay                 |
| ml            | Malayalam             |
| mt            | Maltese               |
| mr            | Marathi               |
| mn            | Mongolian             |
| no            | Norwegian (Bokmål)    |
| ps            | Pashto                |
| pl            | Polish                |
| pt            | Portuguese (Brazil)   |
| pt-PT         | Portuguese (Portugal) |
| pa            | Punjabi               |
| ro            | Romanian              |
| ru            | Russian               |
| sr            | Serbian               |
| si            | Sinhala               |
| sk            | Slovak                |
| sl            | Slovenian             |
| so            | Somali                |
| es            | Spanish               |
| es-MX         | Spanish (Mexico)      |
| sw            | Swahili               |
| sv            | Swedish               |
| ta            | Tamil                 |
| te            | Telugu                |
| th            | Thai                  |
| tr            | Turkish               |
| uk            | Ukrainian             |
| ur            | Urdu                  |
| uz            | Uzbek                 |
| vi            | Vietnamese            |
| cy            | Welsh                 |


# Bot Blocking

Freshpaint classifies incoming traffic and blocks bot-generated events from reaching destinations.

When bot blocking is enabled, Freshpaint automatically classifies each incoming event and prevents bot traffic from being delivered to destinations or counting towards MTUs. Bot blocking is not enabled by default.

## 1. Functionality

Freshpaint applies a `$source_classification` property to every event at ingestion. This property indicates whether the event originated from a known bot or from regular traffic. It is present on all events regardless of whether bot blocking is enabled for the account.

<table><thead><tr><th width="162">Classification</th><th width="532">Description</th></tr></thead><tbody><tr><td><code>UNCLASSIFIED</code></td><td>Traffic that does not match any known bot pattern. This typically represents normal user activity.</td></tr><tr><td><code>KNOWN_BOT</code></td><td>Traffic that matches known user agents for web crawlers such as Googlebot, Applebot, Bingbot, and others.</td></tr><tr><td><code>AWS_BOT</code></td><td>Traffic that matches a specific bot pattern observed on AWS infrastructure, identified by a combination of browser characteristics and source IP address.</td></tr></tbody></table>

When bot blocking is not enabled, all events, including those classified as bots, are delivered to destinations normally.

When bot blocking is active on an account:

* Events with a `$source_classification` of `KNOWN_BOT` or `AWS_BOT` are **not delivered** to any destination.
* Blocked bot events do **not count** towards MTU usage.
* Blocked events still appear in [Traces](/admin-panel/investigate-testing-and-debugging/traces) with a **Bot Detected** status for debugging purposes.

### Viewing Source Classifications

In [Traces](/admin-panel/investigate-testing-and-debugging/traces), events classified as bots display a **Bot Detected** status. Use the status filter to isolate these events.

<figure><img src="/files/wLpIIDV7hk2Y2FOf2hi4" alt="&#x22;Event Verification&#x22; library with &#x22;bot detected&#x22; status checked. Shows traces with status &#x22;bot detected&#x22;."><figcaption></figcaption></figure>

## 3. Enable Bot Blocking

To request bot blocking, contact a Freshpaint representative or email **<support@freshpaint.io>**.


# Web Tracker Monitoring

Freshpaint gives you visibility into the trackers installed across your website, so you can more quickly make the decisions that keep you HIPAA-compliant.

## What Is A Web Tracker?

Services such as Google Analytics and Facebook Advertising ask their clients to install software on their websites. You may have added the Google Tag or the Facebook Pixel to your site - those are both examples of Web Trackers. For HIPAA-covered entities, Web Trackers can pose a big risk to the extent that they facilitate sharing PHI from your site with unauthorized third parties.

## Get Notified About New Trackers

Freshpaint delivers a weekly report to your inbox with information about new trackers installed. To set up your weekly reports, read our [getting started guide](#how-to-get-started).

## See Where Trackers Are Installed

Freshpaint’s weekly report shows you installed trackers and provides you a complete list of the pages they’re installed on so you can better assess whether they could be sharing PHI.

## Get Context About Trackers

Freshpaint provides context about the highest risk trackers identified to help you know where to start your audit.

## Take Next Steps to Mitigate HIPAA Risk

Freshpaint guides you towards HIPAA compliance by presenting different options to resolve each tracker found on your site. The [next page](/readme/web-tracker-monitoring/tracker-resolution-types) describes the different resolution types and how to proceed with them.

## Organize Your BAAs

Upload your BAA for each tool on your site. You won't need to wonder whether your organization has a BAA in place, and you won't have to search to find the document.

## How It Works

Freshpaint scans your entire site by starting from the home page and following links to explore from there. We will explore all pages on the site including subdomains. For example, we would follow a link from example.com to my.example.com.

{% hint style="info" %}
Freshpaint is not able to monitor web trackers on the portions of websites that require the user to log in, such as a patient portal.
{% endhint %}

For each page, we keep track of which third party tools may be collecting PHI.

We'll send you an initial report of all of the trackers we find on your site. Each week, we'll re-scan your site and notify you of any new trackers that have been added.

{% hint style="info" %}
It may take up to one week to generate the initial Web Tracker Report for your site
{% endhint %}

## How To Use Your Report

### Tracker Overview

The first tab provides you a list of the trackers we were able to identify.

We provide context and descriptions where we can (this will get better over time) about each tracker and assign a level of HIPAA compliance risk.

<figure><img src="/files/OSu2vdSasgW5UMzwFqVy" alt=""><figcaption></figcaption></figure>

### Pages Per Tracker

The additional tabs show you all the pages each tracker is installed on.

<figure><img src="/files/WeImgC6LJxJDv1UjG6Gw" alt=""><figcaption></figcaption></figure>

### Risk Levels

**Highest:** Shares PHI, does not offer BAAs, and Freshpaint offers a HIPAA-compliant replacement

**High:** Shares PHI and does not offer BAAs or might not offer BAAs

**Medium:** Shares PHI but supports signing BAAs

**Low:** Does not share PHI, or you need to sign a BAA to work with them

**Unknown:** Freshpaint has not assessed the risk of this tracker

### Next Steps

Once you have your report, read our [Privacy-First Framework](https://www.freshpaint.io/blog/privacy-first-framework-for-hipaa-compliance?87a81329_page=1) for best practices on keeping your site HIPAA-compliant. [Visit the next page](/readme/web-tracker-monitoring/tracker-resolution-types) to learn more about the different options to mitigate a tracker's risk, and then login to the Freshpaint UI to mark trackers as resolved for various reasons.

## Web Tracker Manager

You can also view the latest Web Tracker Report for your site in the Freshpaint app by navigating to "Monitoring" -> "Web Trackers" in the left sidebar.

<figure><img src="/files/d38g210kcTHAeUKUycBV" alt=""><figcaption><p>Navigating to the Web Tracker Manager</p></figcaption></figure>

You can view the full list of trackers installed on your site, along with their respective risk levels. You can also click to view a detailed page for each tracker.

On a tracker's detailed page, you can choose [different options to mark a tracker as resolved](/readme/web-tracker-monitoring/tracker-resolution-types); you can also add arbitrary notes about a tracker, or upload a BAA if you already have a signed BAA with the provider.

<figure><img src="/files/pRiS1b3LxG0TygYXSQNw" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/eQT9JHzz9gMH7xjgiKUb" alt=""><figcaption></figcaption></figure>

### Configuring Your Scan

Click the "Settings" icon in the Web Tracker Manager lets you customize your scan. You can use this to exclude certain pages from the scan. For example you might want to exclude the "careers" portion of your site since that would not risk exposing the user's health information.

Specify a list of patterns. If any of these patterns are found in a URL, Tracker Monitoring will skip that page. For example, excluding "/careers" will skip all pages containing that path such as <https://freshpaint.io/careers>, <https://freshpaint.io/careers/new-job>.

<figure><img src="/files/Gsr9bsgv344jZcmTQrwQ" alt=""><figcaption><p>Configuring pages to exclude for your site</p></figcaption></figure>

## How To Get Started

Freshpaint customers can set up Web Tracker Monitoring by contacting <support@freshpaint.io>. Please provide the following information:

1. The URL to the home page of the site that you need to monitor
2. The email address(es) where Freshpaint can send the reports. Admins can update the list of email addresses as needed.

It may take up to one week to generate the initial report for your site.

### Allow Freshpaint's IP Address

Your site may have a firewall to prevent bots. We recommend contacting your organization's IT team and asking them to ensure that Freshpaint is able to scan your site. You can send them the following message:

> Freshpaint is working with your marketing and compliance teams to help with your organization's HIPAA compliance. We are setting up web tracker monitoring for your site, and we want to make sure we will not be blocked or rate-limited by your bot detection / firewall.
>
> Could you please allowlist Freshpaint's IP address 35.162.70.108 so that we are able to scan the site?
>
> For context, we plan to crawl the entire site, including subdomains, about once per week. There may be additional crawls occasionally, particularly while we're first setting up the monitoring.
>
> Please feel free to reach out to <support@freshpaint.io> with any questions.


# Tracker Resolution Types

<figure><img src="/files/eQT9JHzz9gMH7xjgiKUb" alt=""><figcaption></figcaption></figure>

The Web Tracker Monitoring UI allows you to choose different options to mark a tracker as resolved. This document describes your options for mitigating the risk presented by having a Web Tracker installed on your site.

Once you choose and submit and a resolution status, we'll let you know if there are any next steps you should take to resolve the tracker. These next steps will appear in the "Action Items" section underneath the Resolution Picker. When you complete these action items, Freshpaint will automatically adjust the tracker's risk level to "Low Risk" accordingly.

{% hint style="info" %}
All trackers will continue to be scanned and will show up in your weekly report, regardless of whether they have been "resolved" or not. Our aim is to show you the full view of which trackers still need your attention and which you've already resolved.
{% endhint %}

## Resolution 1: Signed BAA

Many vendors will sign a Business Associate Agreement with you. If you are able to set up a BAA with the vendor, then their trackers no longer present a HIPAA risk on your site. Choosing this resolution will move the tracker to a “low risk” status, allowing you to focus on any remaining high risk items.

<figure><img src="/files/Q4VgqKMxs520ouZrEMUp" alt=""><figcaption><p>After choosing "Signed BAA" status, the action item is to "Upload document" if you haven't already</p></figcaption></figure>

## Resolution 2: Mark as Safe

If you decide to allow the tracker to remain on your site, you can select “Mark as Safe” in Freshpaint’s Web Tracker Manager. Choosing "Mark as Safe" will immediately move the tracker to a “low risk” status, so you can focus your attention on any remaining high risk items.

{% hint style="info" %}
If a tracker is installed only on the Job Postings page and the About Us page, you may decide along with your compliance and legal teams that there is little risk of HIPAA violation. Freshpaint’s Web Tracker Report shows you which pages on your site have the tracker installed, and which ones do not.
{% endhint %}

## Resolution 3: Remove Tracker

You may need to completely uninstall the tracker from your site. The removal process depends on how the tracker is installed:

* If the tracker is set up via a tag manager such as Google Tag Manager, locate the tracker in the tag manager and remove it.
* Otherwise, your IT team will need to remove the tracker. You can send them the Freshpaint Web Tracker Report along with the following note:

> Please remove the tracker \<tracker name> from our organization’s website(s). I’ve attached a report listing all of the pages that the tracker is installed on, which should help you find the tracker and make sure that it is completely removed from every page. This task is critical for maintaining our organization’s HIPAA compliance.

## Resolution 4: Replace with Freshpaint

Freshpaint integrates with advertising platforms, analytics tools and other services. If you replace the third party tracking technology with Freshpaint, you can continue using your tools while maintaining HIPAA compliance.

{% hint style="info" %}
If Google Analytics is found on your site, you can replace it with Freshpaint’s Google Analytics 4 Proxy integration.
{% endhint %}

## Resolution 5: Owned By My Organization

Your site may be retrieving resources from or sending information to additional first-party domains. There is no risk of violating HIPAA if PHI is shared with these domains since they are owned by your organization. Choosing this resolution will immediately move the tracker to a “low risk” status.

{% hint style="info" %}
If your organization’s homepage is [freshhealth.co](http://freshhealth.co), there may be trackers on your site such as [myfreshhealth.co](http://myfreshhealth.co) or [freshhealth-schedule.co](http://freshhealth-schedule.co). These domains belong to your organization, so there is no risk of violating HIPAA if PHI is shared with them.
{% endhint %}


# Historical Scans

<figure><img src="/files/c2CzgeJihAg72l7Z7exw" alt=""><figcaption></figcaption></figure>

Visit the [Historical Scans](https://app.freshpaint.io/monitoring/history) page to view your efforts towards HIPAA compliance over time and retrieve past Web Tracker Monitoring reports.

These insights can be shared with your compliance and leadership teams to demonstrate progress toward compliance.

<div align="left"><figure><img src="/files/vOk0sdBxzVw5JtAQZ1TW" alt="" width="375"><figcaption></figcaption></figure></div>

### Understanding the Chart

The Trackers By Risk Level chart is broken down into 5 categories that are labeled along the vertical axis: Unknown, Low, Medium, High, and Critical. These are the same categories you'd see in your weekly Web Tracker Monitoring report.

Time runs along the horizontal axis. For each week, you can see the number of trackers categorized by risk level by hovering over the individual bars.

To see the number of trackers detected for each category and week, toggle the "View labels" setting.

<div><figure><img src="/files/eLxwmlKUsFntIQsMQCvc" alt=""><figcaption></figcaption></figure> <figure><img src="/files/ox9d7WH1eDwVnQmHpFqT" alt=""><figcaption></figcaption></figure></div>

### Extending Chart Date Range

Use the range selector to view further back in time, all the way up to the first time web tracker monitoring was set up for your website.

<div align="left"><figure><img src="/files/5UTmOwQg7rl9GXMTJ0Ww" alt=""><figcaption></figcaption></figure> <figure><img src="/files/7LWzuHIWkvxhyDRXbuBX" alt=""><figcaption></figcaption></figure></div>

### Downloading Reports

For further analysis, select the tabular view. You'll be able to download each weekly report in XLSX format to see the full list of trackers found each week.

<div><figure><img src="/files/nnDc2EAG2L1PplA8oK2R" alt=""><figcaption></figcaption></figure> <figure><img src="/files/0TR9difUkWB6tN7tHimk" alt=""><figcaption></figcaption></figure></div>


# Custom Domains

First-party tracking through your own domain.

Custom domains route the Freshpaint Web SDK and all tracking endpoints through a subdomain you own. Browsers treat requests to your domain as first-party traffic, which ad blockers and privacy tools are far less likely to block. The result is more accurate data collection and a cleaner network footprint for your site.

This page helps you:

* Understand why custom domains improve data accuracy
* Know what to prepare before setup begins
* Follow along during the setup process with your Freshpaint team
* Update your Freshpaint snippet once setup is complete

### 1. Why Custom Domains Matter

#### 1.1 Ad Blocker Resilience

Ad blockers maintain lists of known third-party tracking domains. When Freshpaint loads from its default domains, some browsers block those requests entirely — meaning you lose visibility into that user's behavior. A custom domain routes all Freshpaint traffic through a hostname you own, so browsers treat it as first-party and ad blockers typically allow it through.

{% hint style="info" %}

#### Related: For background on how ad blockers affect analytics, see [How do I circumvent ad blockers?](/reference/faqs/how-do-i-circumvent-ad-blockers)

{% endhint %}

#### 1.2 Brand Consistency

Network requests from your site point to your own hostname rather than a third-party domain. This provides a cleaner experience if your users or engineering team inspect network traffic.

#### 1.3 Single Hostname

Custom domains consolidate all Freshpaint services — the SDK, tracking API, event definitions, and impression beacon — behind one hostname. No need to manage multiple endpoints.

### 2. Prerequisites

Before reaching out to Freshpaint, confirm the following:

* A domain you control — You need DNS access to the domain where you want to create a subdomain (for example, if your site is `yoursite.com`, you might use `data.yoursite.com`).
* Someone who can add DNS records — You will need to add two CNAME records during setup. Confirm you can make DNS changes or coordinate with your IT team ahead of time.
* A subdomain name that avoids blocked keywords — See guidance below.

{% hint style="warning" %}
Choose your subdomain carefully. Ad blockers scan hostnames for common tracking-related words. Avoid `track`, `tracking`, `analytics`, `pixel`, `beacon`, `collect`, and `telemetry`. Choose something neutral like `data.yoursite.com`, `edge.yoursite.com`, or `cdn.yoursite.com`.<br>
{% endhint %}

### 3. Setup Process

Custom domain setup is handled by the Freshpaint team — there is no self-serve configuration. Your customer success team or support will walk you through each step. Here is what to expect.

#### 3.1 Request Setup

Contact your Freshpaint CSE or email <support@freshpaint.io> with:

* Your account information
* The custom subdomain you want to use (for example, `data.yoursite.com`)

#### 3.2 Freshpaint Provisions Your Infrastructure

The Freshpaint team creates the infrastructure to serve all Freshpaint services through your domain. This step is handled entirely on our side.

#### 3.3 Configure DNS Records

Freshpaint provides you with two DNS records to add in your DNS provider. The Freshpaint team will walk you through this step and verify the records are configured correctly.

1. Certificate validation record — proves domain ownership so a TLS certificate can be issued for your subdomain. Certificate validation typically takes a few minutes but can take up to a few hours.
2. Domain routing record — points your subdomain to the Freshpaint infrastructure. This is added after the certificate is issued.

#### 3.4 Freshpaint Verifies and Activates

Once both DNS records are in place, the Freshpaint team verifies that your custom domain is resolving correctly and all Freshpaint endpoints are reachable. Freshpaint confirms your domain is active and ready to use.

#### 3.5 Update Your Freshpaint Snippet

Update the Freshpaint snippet on your site to include the `custom_domain` parameter. You can find your updated snippet in the Freshpaint dashboard under your environment's setup instructions after setup is complete. The Freshpaint team will flag when this is ready for you!

{% hint style="success" %}
No data loss during migration. Events continue flowing through Freshpaint's default endpoints until the updated snippet is deployed. Once live, traffic seamlessly shifts to your custom domain.
{% endhint %}

### 4. Content Security Policy (CSP)

If your site uses a Content Security Policy header, you must add your new subdomain to the `connect-src` and `script-src` directives. Otherwise, browsers will block requests to your custom domain even though DNS and infrastructure are working correctly. Coordinate with your engineering team if you are unsure whether your site uses CSP.

### 5. Migrating from Legacy Ad Block Bypass

If you are already using the Ad Block Bypass feature described in [How do I circumvent ad blockers?](vscode-file://vscode-app/Applications/Cursor.app/Contents/Resources/app/out/vs/code/electron-sandbox/workbench/link), custom domains are the recommended upgrade. Custom domains consolidate all Freshpaint services behind a single hostname you own, replacing the previous multi-endpoint approach.

To migrate, contact your CSE or <support@freshpaint.io>. The Freshpaint team handles the transition — you only need to update your snippet once the new domain is ready.

### Best Practices & Reminders

* Pick a neutral subdomain name Avoid terms that ad blockers target — `track`, `analytics`, `pixel`, `beacon`, `collect`, or `telemetry`. A generic name like `data`, `edge`, or `cdn` works well.
* Update the snippet promptly after setup
  * Your custom domain is only effective once the updated snippet with the `custom_domain` parameter is deployed. Until then, requests continue through default Freshpaint domains.
* Coordinate with your IT and engineering teams early DNS changes and snippet updates may involve different teams. Loop everyone in at the start so the process goes smoothly.
* Keep your DNS records in place Removing the CNAME records for your custom domain or the certificate validation will break the integration. Treat these DNS records as permanent.
* Check your Content Security Policy If your site enforces CSP headers, the new subdomain must be allowed in `connect-src` and `script-src`.

### What's Next?

* Request setup — Email <support@freshpaint.io> or contact your CSE with your account name, preferred subdomain, and DNS access confirmation.
* Verify data flow — Once the snippet is live, check your Freshpaint dashboard to confirm events are arriving through your custom domain.


# Short Links and QR Codes

## Overview

Freshpaint's Short Links feature creates shortened URLs and associated QR codes within the BAA-covered Freshpaint environment, helping your organization share clean, concise links without routing potentially sensitive information through third-party services without dedicated BAAs.

<figure><img src="/files/6CnqJLZQTaxEmiqAVsMP" alt="Freshpaint Short Links List in Freshpaint Account"><figcaption></figcaption></figure>

### Why URL Shortening Matters for Healthcare

URLs used in patient communications frequently contain information that may constitute PHI under HIPAA, including patient identifiers in query parameters, appointment IDs, portal session tokens, care program codes, and provider or clinic location parameters. If any of those URLs pass through a third-party shortener without a BAA, that transmission may represent an unauthorized disclosure of health information.

Most commodity URL shorteners do not sign BAAs and log the full content of URLs that pass through their infrastructure. This creates compliance exposure that often goes undetected until a security audit surfaces it.

Freshpaint Short Links operates entirely within the Freshpaint platform, the same BAA-covered environment that already handles your data. No additional vendor relationships, contracts, or security reviews are required. If you have an existing BAA with Freshpaint, you're already covered.

### Common Use Cases

**Appointment reminders:** Appointment confirmation and reminder messages often include individualized portal links with patient-specific parameters. Short links let you include clean, concise URLs in SMS and email without shortening PHI-bearing URLs through a non-BAA service.

**Patient portal links:** Portal links scoped to a specific patient session can be shortened for use in outreach campaigns, care coordination messages, or discharge communications.

**Marketing campaigns:** Campaign URLs with UTM parameters, care program identifiers, or clinic-specific routing parameters can be shortened without moving that data outside your BAA boundary.

**Care operations:** Teams sending high volumes of individualized links, such as scheduling links, intake forms, or post-visit surveys, can generate short links for use at scale.

### How it Works

When you create a short link in Freshpaint, the platform generates a unique code and maps it to your destination URL. That mapping is stored within Freshpaint's secure infrastructure. When a visitor on the site clicks the short link, they are redirected to the original destination, and the redirect transaction is logged within the same protected environment.

Short links use randomly generated codes rather than encoding information from the original URL, which means the short link itself does not expose PHI even if the destination URL contains it.

All URL storage, redirect logging, and access controls are subject to your BAA with Freshpaint and align with Freshpaint's existing data retention policy.

## Create Short Links

In your Freshpaint account, navigate to "Short Links". Click "Create Short Link".&#x20;

<figure><img src="/files/cZ6kac92P0uRzeGp18oj" alt="Create Short Link dialog box in Freshpaint account"><figcaption></figcaption></figure>

The "Create Short Link" dialog will appear.

<figure><img src="/files/mmxGTzm5KshIwiNEgAJp" alt="Create Short Link dialog open in Freshpaint Account"><figcaption></figcaption></figure>

1. Paste or type the full destination URL into the Destination URL field. This is the URL that visitors will be redirected to when they click the short link.
2. Give the short link a `Title` so you can see in the overview table what it entailed, for example “Mother’s Day Cancer Screenings” or “Flu shot campaign” – whatever keywords or details will make it easy to track your short links.
3. Select a domain to use for your short links. The default is a Freshpaint domain, but soon you will be able to introduce your own custom domains.
4. Determine how long you want to make your short links. Six characters are more visually pleasing, especially for SMS. You get more possible variations with eight characters.&#x20;
5. If you want to track multiple links across topics or campaigns, use Tags to do so. For example, if you create many Flu-related links throughout the year, using a Flu tag will let you see how all Flu-related links perform over time from the Metrics overview.&#x20;
6. Click Create to generate the short link.

Once created, your short link is ready to use. Copy it and paste it into email campaigns, SMS messages, or any patient-facing communication channel.

### View QR Codes

<figure><img src="/files/5tGDZidQ3FE6yxn0xM5i" alt="Freshpaint Short Links List with expanded menu and &#x27;Preview QR Code&#x27; selected"><figcaption></figcaption></figure>

Once a short link is live, so is the corresponding QR code. Locate it within the menu on the far-right of the webpage. Select "Preview QR Code" to see and test the QR code or download it to use in marketing materials.&#x20;

### Manage Available Short Links

#### Viewing Available Short Links

The [Short Links Overview page](https://app.freshpaint.io/short-links/overview) displays all links created in your account, including:

* The short link URL
* The destination URL
* Title
* Tags
* Creation date
* Total click count

#### Disable or Edit Short Links

Freshpaint makes it possible to edit and disable short links that you no longer need or want live online. To do so, locate the menu on the far-right of the webpage. Select Disable or Edit to make changes to the short link.&#x20;

<figure><img src="/files/OvK4FG5JVf2FkIQ6gLT0" alt="Freshpaint Short Links List with expanded menu and &#x27;disable&#x27; selected"><figcaption></figcaption></figure>

#### Access Controls and Audit Trails

Freshpaint maintains records of who created each short link and when. Access to the original destination URL is controlled and is not publicly exposed. If your compliance or security team needs documentation on data flows for a review, contact your Freshpaint Account Manager to request the relevant materials.

### Monitor Link Performance

#### View Click Metrics

Select any short link from the Short Links page to view its performance metrics. Available data includes total clicks over time, giving you a view into how your links are performing across campaigns and patient communications.

{% hint style="info" %}
Analytics capabilities are actively expanding. If your team needs additional metrics, such as click-through by channel, device type, or referrer, share that feedback with your account manager. Early input is shaping the analytics roadmap.
{% endhint %}

### Best practices and Reminders

* **Use short links wherever PHI may appear in URLs.** If you're unsure whether a URL contains PHI, treat it as if it does. Patient identifiers, appointment details, and portal parameters are common sources of PHI in URLs that teams often overlook.
* **Do not use third-party shorteners for PHI-bearing URLs.** Using Freshpaint's URL Shortener for patient-facing links while continuing to route some URLs through non-BAA tools creates inconsistent compliance coverage. Audit your existing workflows to identify any remaining exposure.
* S**hare feedback on what's missing.** The URL Shortener is expanding. If you need custom domains, expiration controls, bulk link creation, or deeper analytics, reach out to your account manager. Your requirements are actively informing the roadmap.


# Destinations

Destinations are the tools to which you send data from Freshpaint. When you send data from Freshpaint to a destination, Freshpaint will automatically make the right API calls to get the data from Freshpaint into the destination. That way, you only have to think about getting data into Freshpaint and Freshpaint will take the rest from there.

## Types of Destinations

### Demand Side Platforms (DSPs)

A Demand Side Platform (DSP) is a software system that allows advertisers to buy digital ad space automatically across multiple platforms.

{% content-ref url="/pages/Z2a3hpwYw9BJWLBHqMdR" %}
[Demand Side Platforms (DSPs)](/integrations/destinations/demand-side-platforms-dsps)
{% endcontent-ref %}

### Direct Response Ads

Direct Response Ads destinations let you send data to various advertising platforms to target ads to your users. See the Direct Response Ads destinations docs for more information.

{% content-ref url="/pages/JFuP1VYMgxVmMOb4W1Nz" %}
[Direct Response Ads](/integrations/destinations/direct-response-ads)
{% endcontent-ref %}

### Data Activation

Data Activation destinations are the most common type of destination. A Data Activation destination is a third party tool that processes your Freshpaint data in some way. Analytics tools, session replay tools, and email marketing tools are all Data Activation destinations. Check out the Data Activation destinations docs for more information on the specifics of app destinations.

{% content-ref url="/pages/Fzx3yxbFIwDEnCuxNiIX" %}
[Data Activation](/integrations/destinations/apps)
{% endcontent-ref %}

### Data Warehouses

Warehouse destinations are data warehouses that give you direct access to your Freshpaint data. After configuring a warehouse destination, you can run SQL over the data and process it however you want. Checkout the warehouse destinations docs for more information on them.

{% content-ref url="/pages/-MB1ErvR-UG7gQ0ulm27" %}
[Data Warehouses](/integrations/destinations/warehouses)
{% endcontent-ref %}

### Functions

Functions destinations allow you define custom Javascript application code that is executed when an event fires.

{% content-ref url="/pages/DRZiqBdg4bkMKJ7DuEXR" %}
[Functions](/integrations/destinations/functions)
{% endcontent-ref %}

### Consent Management

Consent managers give your users the ability to choose what data is collected about them when using your app and for what purposes that data is used for.

{% content-ref url="/pages/WRME4AspeXe9QMyju3td" %}
[Consent Management](/integrations/consent-management)
{% endcontent-ref %}

## Transforming Data

You can modify events before they are sent to destinations by using our transformations.

{% content-ref url="/pages/-MK\_985zz3ru4S2ihmYh" %}
[Transformations](/admin-panel/transformations)
{% endcontent-ref %}


# Demand Side Platforms (DSPs)

A Demand Side Platform (DSP) is a software system that allows advertisers to buy digital ad space automatically across multiple platforms. It uses real-time bidding to target specific audiences and optimize ad delivery for better performance. DSPs help streamline ad buying, improve ROI, and centralize campaign management in one platform.


# Basis

Send advertising events directly to Basis Technologies

{% content-ref url="/pages/bnJciLNLqu8UWdJLBPKQ" %}
[Basis Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/basis/basis-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/MHh4HLiDhodxCEsXEXD8" %}
[Basis Reference](/integrations/destinations/demand-side-platforms-dsps/basis/basis-reference)
{% endcontent-ref %}


# Basis Quick Start Guide

Send advertising events directly to Basis Technologies

This is a guide to help you get started on sending your conversion events to Basis via Freshpaint. If you've already completed set up and are looking for more information, see [Basis Reference](/integrations/destinations/demand-side-platforms-dsps/basis/basis-reference).

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Basis** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Pixel IDs, you can choose a specific one by suffixing the Pixel ID, such as: **Basis::123456.** You can retrieve this value from Basis configuration page for the Pixel ID of interest.
* Connection Modes:

<table><thead><tr><th width="249.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What you'll need

1. Your Universal Pixel ID from Basis
   1. Select the appropriate Brand
   2. Navigate to the Universal Pixel screen
   3. Either create a new pixel, or if one already exists, click on Action > Get Tags
   4. Ensure that the `Enable cookieless conversion` checkbox is checked.
   5. Copy your Universal Pixel ID from the line `cntrUpTag.track('cntrData', '<universal-pixel-id>');`
2. Universal ID configured in Freshpaint
3. \[If in HIPAA mode] Allowlist setup to forward the `$cntr_auctionId` prop to Basis
4. Freshpaint[ Impression Pixel ](https://documentation.freshpaint.io/integrations/impression-pixel)enabled
5. Conversion tracking enabled in Basis
   1. Add (or identify an existing) relevant conversion under the appropriate Brand in Basis
   2. Ensure this conversion is added to the appropriate Universal Pixel as a rule set in Basis
   3. On the campaign, ensure conversion tracking is set to ON and the conversion is being Tracked
6. Freshpaint[ Impression Pixel](https://documentation.freshpaint.io/integrations/impression-pixel) URL added to your creatives in Basis

### To set up Basis with Freshpaint, follow these steps:

1. Make sure you have the appropriate access in both Freshpaint and Basis:
   1. Contact your Freshpaint Account Manager to request access to this destination. Once you have that, we will help you step by step through the configuration process
2. Set up your Universal Pixel, and copy your Universal Pixel ID

<figure><img src="/files/UFZZnCz1OKnceJd36MSa" alt=""><figcaption><p>Select your Brand</p></figcaption></figure>

<figure><img src="/files/0gEAN2veBPn0k7r90LXQ" alt=""><figcaption><p>Get Tags for the relevant Universal Pixel associated to the Brand</p></figcaption></figure>

<figure><img src="/files/u4iKFZxQ8s0jElXS6se5" alt=""><figcaption><p>Ensure cookieless conversion is enabled, and copy your Universal Pixel ID</p></figcaption></figure>

3. Configure the Universal Pixel ID you copied in step 1 in Freshpaint

<figure><img src="/files/soTMwBvvgq1xxmFcdR17" alt="" width="563"><figcaption><p>Set your Universal Pixel ID in Freshpaint</p></figcaption></figure>

4. Allowlist the `$cntr_auctionId` property. This property is required to support conversion reporting to Basis.

<figure><img src="/files/vQyT3I2aUCREeZqQxPRc" alt="" width="563"><figcaption><p>Basis Allowlist set up in Freshpaint</p></figcaption></figure>

5. Enable the [Freshpaint Impression Pixel](https://documentation.freshpaint.io/integrations/impression-pixel). This enables Freshpaint to do view through attribution within Freshpaint and report the conversion event to Basis. We recommend enabling both IP matching and Cookie matching, and setting the Conversion Window to 30 days for the best results. Then copy the `Pixel Configuration URL` for step 8. Click `Save` once you have set your preferred configuration options and copied the url.

<figure><img src="/files/90MvozL0GLLZcUb84hVV" alt="" width="563"><figcaption><p>Impression Pixel set up in Freshpaint</p></figcaption></figure>

{% hint style="info" %}
Configuring the impression pixel does not require sharing an IP address or Cookie with Basis. Freshpaint will do the attribution by matching either the IP address or Cookie to an impression that is seen by the Freshpaint Impression Pixel, and if a match is found, will send the impression id to Basis.
{% endhint %}

6. Enable Conversion Tracking in Basis

<figure><img src="/files/QdcedNFoivz0qjEa95L4" alt=""><figcaption><p>Create or validate conversion in Basis</p></figcaption></figure>

<figure><img src="/files/wxx0lTYAdOUrNV4IYoLe" alt=""><figcaption><p>Add Conversion to the Universal Pixel as a rule set</p></figcaption></figure>

<figure><img src="/files/30HNRDV4iumkSfN4cHkv" alt=""><figcaption><p>Enable Track Conversions for Campaign in Basis</p></figcaption></figure>

7. Add Freshpaint Impression Pixel URL to your ads. **This is required for view through conversion tracking via Freshpaint.** The URL that you paste in should look like `https://freshpaint-impression.com/pixel.png?env_id=<your-env-id>&dest_id=<your-dest-id>&cke=1&$cntr_auctionId={auctionId}`

<div data-full-width="true"><figure><img src="/files/JwWOoMdLFHBHEuKEaZ35" alt=""><figcaption><p>Set Impression Pixel URL on the relevant ads in Basis</p></figcaption></figure></div>

### To send an event to Basis, you'll need to enable the destination for the event:

If you'd like to send an autotrack event from your event library to Basis, navigate to your Freshpaint event definition and toggle the destination on to enable the event to be sent to Basis.

If you've configured multiple Pixel IDs, you'll need to toggle each pixel individually for each Freshpaint event.

If you're using Google Tag Manager to send data to Basis, you'd simply create a tag with the Freshpaint tag template in Google Tag Manager and select the tag type "Basis". If you have multiple Pixel IDs enabled for Basis, you'll need to specify which ID(s) you'd like to enable the event for in the event tag.

### Set up a test campaign in Basis

1. Set up a test campaign that targets a small audiences and set a low budget ($10-50)
2. Attach a creative that has the Frespaint Impression Pixel
3. Verify impressions and clicks are flowing into Freshpaint correctly by working with your Customer Success Engineer
4. Verify in Freshpaint that the events triggering and flowing through to successfully to Basis by using Freshpaint's [Liveview and Event Verification tools](https://documentation.freshpaint.io/admin-panel/investigate-testing-and-debugging)

### Confirm and Validate Conversions in Basis <a href="#confirm-and-validate-conversions-in-thetradedesk" id="confirm-and-validate-conversions-in-thetradedesk"></a>

Congratulations! Once you have confirmed conversions in Basis, you have finished setting up this integration.

Looking for more information? See [Basis Reference](/integrations/destinations/demand-side-platforms-dsps/basis/basis-reference)


# Basis Reference

Send advertising events directly to Basis Technologies

This is a reference document for the Basis destination. For information on how to set up this integration, see the [Basis Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/basis/basis-quick-start-guide)

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Basis** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Pixel IDs, you can choose a specific one by suffixing the Pixel ID, such as: **Basis::123456.** You can retrieve this value from Basis configuration page for the Pixel ID of interest.
* Connection Modes:

<table><thead><tr><th width="249.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Click Through Tracking

In order for Freshpaint to be able to automatically capture the click ID auto-generated by the Basis advertisement, [cookieless conversion attribution needs to be enabled](https://help.basis.com/docs/Cookieless_Conversions/Cookieless_Conversions_Guide.htm).

Basis will append a `cntr_auctionId` parameter to the landing page URL query string, which works similar to click id's from other advertising platforms. Freshpaint when installed on a page will look for this click id and automatically set the `$cntr_auctionId` event property with the click id.

Assuming you have followed the [Basis Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/basis/basis-quick-start-guide) to set up your Basis destination, you can verify that click through tracking is working by looking for an event in event verification that contains the `$cntr_auctionId` field.

<div align="center" data-full-width="true"><figure><img src="/files/X5LhNAIrCfPHWvV0SdOo" alt=""><figcaption><p>Event Verification</p></figcaption></figure></div>

<div data-full-width="true"><figure><img src="/files/LtepHb8rj16UDJu79VvJ" alt=""><figcaption><p>Click ID being captured</p></figcaption></figure></div>

## View Through Tracking

Freshpaint supports view through tracking by capturing the `cntr_auctionId` passed in by Basis using the Freshpaint Impression Pixel. Assuming you have followed the [Basis Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/basis/basis-quick-start-guide) to set up your Basis destination, you can verify that view through tracking is working by looking for an event in event verification that contains the `$cntr_auctionId` field, similar to how you can verify Click Through Conversion.

You can also look for a transformation that shows that the event data was enriched by the Freshpaint Impression Pixel.

<div data-full-width="true"><figure><img src="/files/euy7R8qDhZDo0ojXGOwu" alt=""><figcaption><p>Transformation applying the Impression Pixel captured impression to an event</p></figcaption></figure></div>

## Relevant Properties

<table data-header-hidden data-full-width="true"><thead><tr><th width="224"></th><th width="269"></th><th width="86"></th><th width="113"></th><th align="center"></th></tr></thead><tbody><tr><td><strong>Freshpaint Property</strong></td><td><strong>Basis Parameter</strong></td><td><strong>Type</strong></td><td><strong>Required?</strong></td><td align="center"><strong>Description</strong></td></tr><tr><td><code>$cntr_auctionId</code></td><td><code>cntr_postbackAuctionId</code></td><td>string</td><td>Required</td><td align="center"><code>cntr_auctionId</code> is appended to the landing page URL by Basis. <strong>Freshpaint will automatically capture cntr_auctionId for events from your website</strong>. For events from other sources you would need to provide <code>$cntr_auctionId</code> as an event property.<br><br>If the Freshpaint Impression pixel is in use, <code>cntr_auctionId</code> is added automatically as a transformation to the appropriate events if a match is found.</td></tr><tr><td><code>&#x3C;custom_property></code></td><td><code>&#x3C;custom_property></code></td><td>string</td><td>Optional</td><td align="center">Any additional / custom properties on the event and allowed by the HIPAA allow list will be passed to Basis</td></tr></tbody></table>


# Google Campaign Manager 360

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Google Campaign Manager 360 Conversions API** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="249.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

Freshpaint's Campaign Manager 360 (CM360) conversions destination allows for tracking click- and view-through conversions from ads managed in CM360, including those linked with other Google Marketing Platform products like Display and Video 360 (DV360). The integration is used to send conversion data to Floodlight Activities within CM360.

### Connecting Campaign Manager 360 to Freshpaint

To proceed with setup, you will need the following:

* A CM360 account that is [enabled for API access](https://developers.google.com/doubleclick-advertisers/getting_started) (this is the case by default for most CM360 accounts)
* A user profile in your CM360 account that has access to the advertiser and Floodlight activities you would like to connect and the "Insert offline conversions" permission
* A Freshpaint account that has the CM360 Conversions API destination enabled

When adding a new CM360 destination to Freshpaint, you will need to specify a profile ID and advertiser ID

<figure><img src="/files/1kAhCDfaZZP0DhqCLKV2" alt=""><figcaption><p>Configuration for a CM360 destination in Freshpaint.</p></figcaption></figure>

Profile ID is a seven digit number associated with the account you are going to connect to CM360. Note that for the CM360 integration to work, the profile ID here *must* belong to the account that is connected via OAuth.

<figure><img src="/files/PrnUKfPaphoFqr3rxap6" alt=""><figcaption><p>User profiles screen in Campaign Manager 360. In this example, the profile ID for "my_account" is 0451343</p></figcaption></figure>

{% hint style="warning" %}
The connected user profile **must** have permission to "Insert Offline Conversions" in Google Campaign Manager 360 for the destination to work. This permission can be added from the User Roles screen.
{% endhint %}

Advertiser ID is an eight digit number associated with the advertiser that you are connecting to Freshpaint. It is found in several places throughout the Google Marketing Platform suite of products and may be referred to by terms such as "Floodlight configuration ID". One place it can be found on the "All advertisers" screen.

<figure><img src="/files/XHWVh9dzrAIlhUrTx7LI" alt=""><figcaption><p>All advertisers screen in Campaign Manager 360. In this example, the advertiser ID for "My Advertiser" is 01234567</p></figcaption></figure>

Once the Profile and Advertiser IDs have been specified, select "Connect with Google CM360" from the Freshpaint configuration page and follow the onscreen prompts to connect your Google account with CM360. Note that the Google account used to connect to CM360 should be the same account that the Profile ID was taken from in the previous step.

<figure><img src="/files/w7J41U3WTU0A2kScIKCB" alt=""><figcaption></figcaption></figure>

### Authentication

There are two different methods that can be used to authenticate the connection between Freshpaint servers and Google. Only one of these approaches is necessary.

#### User Account

A user who has access to both Freshpaint and Google Campaign Manager 360 may delegate access to Freshpaint using the user account. Freshpaint will be granted the limited permissions necessary to send conversion events to google CM360 and be directly tied to the account of the user who delegated access. If that user account is removed or reset, google may revoke the authentication credentials that have been delegated to Freshpaint under that user account.

{% hint style="info" %}
The user delegating access to their User Account needs to have the "Insert offline conversions" permission as part of their role within Campaign Manager 360.
{% endhint %}

Navigate to `Apps > Destinations > Google Campaign Manager 360` and click either `Connect` or `Reconnect` in the `Access Permission` row of the destination configuration page. In the popup dialog select User Account and then `Connect with Google CM360` which will redirect you to Google to complete authentication and delegation of permissions to Freshpaint.

<figure><img src="/files/AOgcSCpIDZtq8T3b5S6x" alt=""><figcaption></figcaption></figure>

#### Service Account

A user account within google can be created only for Freshpaint that will provide Freshpaint with a set of credentials that are not tied to any specific user. The creation of this account will require working with someone with necessary permissions within an underlying google cloud account to configure a service account.

Please follow the Google documentation on the creation and configuration of a service account available at: <https://developers.google.com/doubleclick-advertisers/service_accounts>

{% hint style="info" %}
The service account should be provided with the <https://www.googleapis.com/auth/ddmconversions> scope which will allow access to send conversion events to Google.
{% endhint %}

Once the service account has been created within Google, the credentials file can be uploaded to the Freshpaint application.

Navigate to `Apps > Destinations > Google Campaign Manager 360` and click either `Connect` or `Reconnect` in the `Access Permission` row of the destination configuration page. In the popup dialog select `Service Account` and upload the json file with the credentials for Freshpaint to use and click save.

### Adding Required Properties

For an event to be processed and successfully forwarded to CM360, the following properties are require&#x64;*:*

* `activity_id` — The 9-digit ID for the Floodlight Activity that conversions should be associated with. This may be added as an event transformation or directly sent with individual events.
  * Navigate to the [The Floodlight Activities Tab](https://support.google.com/campaignmanager/answer/2823234?hl=en) in CM360 to find this value.
* `$dclid` — This is the double click ID used for the majority of click-through conversions. Enhanced attribution must be enabled in CM360 for conversions to work correctly; see below. An event still can be sent to CM360 without a `$dclid` present if one of `$edimpid` or `$gclid` is present on the event instead, but dclid always must be allowlisted.
* `$edimpid` — This is used by view-through conversions with the Impression Pixel, and must be enabled to use the Impression Pixel.

**Recommended Properties**

* `$gclid` — This is used by Google's native advertising platforms, including Google Ads and Google Search Ads 360. You may want this enabled if you have CM360 connected to one of these platforms. If it is possible for gclids to come from a Google Ads account that is *not* connected to CM360, it is recommended to leave this off of events sent to CM360.
* `match_id` — The custom unique match ID used for tracking conversions from your ad campaigns. Used as an alternative to standard Google identifiers (eg. `$edimpid`, `$dclid`, or `$gclid`) when the use case requires supplying a custom unique identifier from outside of CM360 for linking ad impressions to conversions. This might be helpful in scenarios where CM360 is involved in conversion attributions but is not being used as a server for the ad creative. [See Google's CM360 documentation for more information](https://developers.google.com/doubleclick-advertisers/guides/conversions_overview#using_match_id).

Note that if an event has multiple identifiers on it, conversions sent to CM360 will use the most precise ID available to it, preferring `$dclid` first, `$gclid` second, `match_id` third, and `$edimpid` last.

**Optional Properties**

Freshpaint supports sending optional properties documented in the CM360 Conversions API to CM360. For more details on these fields and the underlying API, see <https://developers.google.com/doubleclick-advertisers/rest/v3.4/Conversion>.

<table><thead><tr><th width="270">Property Name</th><th width="165">Default Value</th><th>Description</th></tr></thead><tbody><tr><td>quantity</td><td><code>1</code></td><td>The number of conversions to count with the event. Can be used with both Floodlight Counter and Floodlight Sales tags, though typically should be set to 1 for standard conversion counting.</td></tr><tr><td>value</td><td><code>1.0</code></td><td>The value associated with a conversion. Used with Floodlight Sales tags.</td></tr><tr><td>ordinal</td><td>Event-specific ID</td><td>A deduplication ID used to prevent double-counting conversions. The default behavior is to use a unique ID per event, which should cover typical CM360 use cases.<br><br>Read more about <a href="#de-duplicating-conversions">De-duplicating conversions</a>.</td></tr><tr><td><code>adDataUserConsent</code></td><td><code>GRANTED</code></td><td>Whether or not consent has been granted. If present, must be set to "<code>GRANTED</code>" or "<code>DENIED</code>" Since Freshpaint already strips out disallowed user data from the request, this is set to granted by default.</td></tr><tr><td><code>childDirectedTreatment</code></td><td>none</td><td>When set to <code>true</code>, indicates that an event may be associated with a user under the age of 13. Used for COPPA compliance purposes.</td></tr><tr><td><code>treatmentForUnderage</code></td><td>none</td><td>When set to <code>true</code>, indicates that an event may be associated with a user under the age of 16, country-dependent. Used for GDPR compliance purposes.</td></tr><tr><td><code>limitAdTracking</code></td><td>none</td><td>When set to <code>true</code>, indicates the conversion will be used for reporting but not targeting and prevents remarketing.</td></tr><tr><td><code>nonPersonalizedAd</code></td><td>none</td><td>When set to <code>true</code>, indicates the conversion was for a non-personalized ad.</td></tr></tbody></table>

Freshpaint also supports transmitting Floodlight custom variables of the form `u1`, `u2`, `u3`...`u100`. Note that these values must be individually allowlisted in order to be sent.

### Linking a Freshpaint Event to a Floodlight Activity

Each Floodlight tag in Campaign Manager uses an Activity ID value to uniquely identify the conversion action. Follow these steps to link your Freshpaint event to your Floodlight activity:

1. At the Advertiser level, navigate to Floodlight > Activities from the left nav and find the specific Floodlight activity you want to link your Freshpaint event. The value beside the activity name is the Floodlight tag's Activity ID (save this for later).

   <div align="left"><figure><img src="/files/bzCaW1LHI3KMlrMDanqk" alt="" width="375"><figcaption></figcaption></figure></div>
2. Attach the Activity ID to the related event in Freshpaint by creating a Transformation in Freshpaint:
   1. Click on "Create New" in [Transformations](https://app.freshpaint.io/transformations)
   2. Click "Modify Data"
   3. Select your Freshpaint conversion event, select the Google Campaign Manager 360 Conversions API destination, then click "Save & Add Transformations"<br>

      <div align="left"><figure><img src="/files/Ed5nSk10Cy2a2y9Hj1ub" alt="" width="375"><figcaption></figcaption></figure></div>
   4. Select the "Send Constant Property" transformation option, use activity\_id as the property name, and copy/paste the Activity ID value from step 1.

      <div align="left"><figure><img src="/files/oh9UmS9Ojw6nk0iknPW9" alt="" width="375"><figcaption></figcaption></figure></div>
   5. Click "Save" to complete your transformation rule

{% hint style="info" %}
If you're using Google Tag Manager and building a tag with the Freshpaint **Google Campaign Manager 360 Conversions API** tag type, make sure to map the `activity_id` value of the Floodlight tag into the Activity ID field within the tag configuration.

Doing so will mitigate the need for you to set a transformation rule to link your Freshpaint event to the Floodlight activity, since the activity\_id value will already be in place from the GTM tag.
{% endhint %}

### If you are a HIPAA account, you will need to add event properties to this destination's allowlist. If you are not a HIPAA account, you can skip this step.

1. Configure the destination's HIPAA Allowlist by navigating to Overview > DSP from the left nav and clicking Google Campaign Manager 360 Conversions API under the **Destinations** section.
2. Click on the "Configure" button beside the **Required Properties** row under the **Configuration** section
3. Ensure the `activity_id` property is allowlisted, along with other required properties for the destination.

### De-duplicating conversions

The optional `counting_method` property can be used to override the default behavior of `ordinal` when a value for `ordinal` is not provided. There are 3 supported values for `counting_method`:

1. **"standard":** Default behavior. Counts every conversion.
2. **"unique":** Counts the first conversion for each unique user during each 24-hour day, from midnight to midnight, Eastern Time (US).
3. **"session":** Counts one conversion per user per session. Session length is set by the site where the Floodlight tag is deployed.

<figure><img src="/files/3Bf3MjBcuS9VvijA2GPl" alt=""><figcaption><p>Counting method option in Google Tag Manager</p></figcaption></figure>

If you are managing events through Freshpaint directly and not through Google Tag Manager, you can specify the counting method by following the steps below:

1. Click on "Create New" in [Transformations](https://app.freshpaint.io/transformations)
2. Click "Modify Data"
3. Select a specific event to apply the transformation to or select *All Events*, select the Google Campaign Manager 360 Conversions API destination, then click "Save & Add Transformations"
4. Select the "Send Constant Property" transformation option, use `counting_method` as the property name, and set the value to "standard", "unique", or "session".

<figure><img src="/files/jyflzF4Q2ljHPjibIb4o" alt="" width="563"><figcaption></figcaption></figure>

5. Click "Save" to complete your transformation rule

### Click-through conversions

To support click-through conversions with CM360, the enhanced attribution feature needs to be configured on the floodlight configuration used within CM360.

Please see [Google Support - Enhanced attribution](https://support.google.com/campaignmanager/answer/9182069?hl=en) on how to configure dclids to be attached to landing page links.

### View-through conversions - Configuring an Impression PIxel

To track view-through conversions on CM360, you will need to configure the [Freshpaint Impression Pixel](/integrations/impression-pixel) for the destination. In the impression pixel config screen within the destination configuration page for the CM360 destination, ensure one or both of IP or Cookie based matching is turned on. Note that these matches are only used by the Freshpaint application to match users to prior impressions; this information is *not* forwarded to the destination unless explicitly allowlisted.

<figure><img src="/files/3jBi0PGwWov11YyHdzMJ" alt=""><figcaption><p>Freshpaint impression pixel config. At least one form of matching must be enabled.</p></figcaption></figure>

Copy the pixel configuration URL provided for use in CM360. On the advertiser in CM360, create a new Impression event tag with the "image" type and use URL from the Freshpaint configuration UI, as in the example screenshots below.

<figure><img src="/files/9E3ATvPxdBIPmqe5wamd" alt=""><figcaption><p>Impression event tags section in CM360</p></figcaption></figure>

<figure><img src="/files/iGAVfbv5nXC3522B4VXb" alt=""><figcaption><p>A newly configured Impression event tag. The "name" field can be any value. Tag Type should be "Image", enabled "Yes", and the URL should match the one provided by the Freshpaint config screen.</p></figcaption></figure>

### Setting Up a Test Campaign in Google Campaign Manager

1. Coordinate with your marketing team or Agency partner who manages your campaigns
   1. Let them know it’s a **small-scale test campaign** designed to validate tracking and performance.
2. Link your Freshpaint event(s) to a Floodlight activity/activities
3. Choose your creative and create a campaign
   1. Use existing, current, or new creative—your choice!
4. Choose your channel
   1. Target a channel that tracks clicks and views for more accurate validation
5. Set your budget
   1. Keep it small ($10-50); aim for 1,000–3,000 impressions
6. Verify results
   1. Ensure that click- and view-through conversions are tracking correctly both in Freshpaint and in your Campaign Manager account

### Verifying Conversion Reporting

Once you have followed the steps above, you can verify that conversions are being reported to Google Campaign Manager

**Event Verification**

In Freshpaint, you can use the event verification tab to see which events are being successfully sent to Google Campaign Manager. You can also dig into each event to see the data being sent or investigate errors if there are any.

<figure><img src="/files/cYdseNwQuSVUIKGmMqtI" alt=""><figcaption></figcaption></figure>

**Google Campaign Manager Reporting**

Navigate to the **Reporting and Attribution** section. Under the Report Builder tab, create a new **Instant Report**:

<figure><img src="/files/SkzINwgb339sUML6ZO6I" alt=""><figcaption></figcaption></figure>

Create an Activity report that breaks down the data by columns like view/click-through conversions and total conversion counts:

<figure><img src="/files/LGySufsuL0N4YOsYsHc4" alt=""><figcaption></figcaption></figure>


# StackAdapt

Send advertising events directly to StackAdapt.

{% content-ref url="/pages/iImBWUnfiFCeI3hFgAgz" %}
[StackAdapt Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/stackadapt/stackadapt)
{% endcontent-ref %}

{% content-ref url="/pages/1gvRvxGTItnxX6LJ535u" %}
[StackAdapt Reference](/integrations/destinations/demand-side-platforms-dsps/stackadapt/stackadapt-reference)
{% endcontent-ref %}


# StackAdapt Quick Start Guide

Send advertising events directly to StackAdapt

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Supports [Audience retargeting, lookalikes, and exclusions](https://documentation.freshpaint.io/audiences/audience-integrations/stackadapt-audiences)
* Refer to this destination as **StackAdapt** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="249.33333333333331" align="right"></th><th width="223" data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### Configure Freshpaint destination

1. Make sure you have the appropriate access in both Freshpaint and StackAdapt:
   1. Contact your Freshpaint Account Manager to request access to this destination. Once you have that, we will help you step by step through the configuration process.
2. Create your conversion funnel, and create events in Freshpaint to track your conversions.
3. Since StackAdapt only uses unique click IDs and Conversion Event IDs, there is no access token or Pixel ID required to set up the destination.
   1. You can configure your [StackAdapt destination](https://app.freshpaint.io/destinations/apps/stackadapt) in Freshpaint by using the link provided here or by navigating to **Apps** > **StackAdapt** > **Configure** **StackAdapt** in the Freshpaint console.
   2. In the destination, click the **Configure** button on the Configuration row and click **Save**.

<figure><img src="/files/g9SmQU9cNYsO6w46QiGa" alt=""><figcaption></figcaption></figure>

Once you've [enabled](https://documentation.freshpaint.io/readme/setting-up-your-destinations/enabling-and-disabling-a-destination) the destination, you're ready to start setting up the campaign and conversion events in StackAdapt!

### Configure Conversion Events

To send a conversion event to StackAdapt, you need to set up an event in StackAdapt and map your Freshpaint event to that event unique ID.

#### In StackAdapt:

1. From the StackAdapt Pixel page, click **Create New** and select **Conversion Event**.
2. Select **Website** as the Install Location and **Page Load** as the Activation Method (even if you're not targeting page loads).
3. Select **Standalone Pixel** as the install method, leaving the default of Javascript.
4. Give your event a name, select the appropriate Conversion Category, and fill out any other fields relevant to the conversion event. Select **Create Pixel Code** once finished.
5. Click **Finish**, ignoring the autogenerated Javascript code. Copy the Conversion Event **Unique ID** for the newly created event once back on the Conversion Events dashboard.

{% hint style="info" %}
When setting up a conversion event in StackAdapt, you can select either 'click-through' or 'view-through and click-through'. 'View-through and click-through' is the default setting. When the default setting is enabled, the platform will attribute to both impressions and clicks. You convert the event in StackAdapt from 'click-through' to a 'view-through & click-through' at anytime.
{% endhint %}

#### To send an event to StackAdapt, you'll need to [enable the destination](/readme/setting-up-your-destinations/enabling-and-disabling-a-destination) for the event in Freshpaint:

1. If you'd like to send an autotrack event from your event library to StackAdapt, navigate to your Freshpaint event definition and toggle the destination on to enable the event to be sent to StackAdapt. You'll follow the steps below to add the Conversion Event Unique ID. If you're using Google Tag Manager, you can skip to step 2 below.

   1. Return to the StackAdapt Destination in the Freshpaint console and configure a transformation to map one of your Freshpaint events to the StackAdapt Conversion Event. Click "Configure" next to "Event Transformations".
   2.

   ```
   <figure><img src="../../../../.gitbook/assets/Screenshot 2023-07-31 at 1.52.55 PM.png" alt=""><figcaption></figcaption></figure>
   ```

   3. Click "**+ New Transformation**"
   4.

   ```
   <figure><img src="../../../../.gitbook/assets/Screenshot 2023-07-31 at 1.51.59 PM.png" alt=""><figcaption></figcaption></figure>
   ```

   5. Select "**Modify Data**". Choose the event you'd like to send to StackAdapt, select the **StackAdapt** destination, click "**Enable it?**" if the event is not yet configured for StackAdapt, and click Save.
   6.

   ```
   <figure><img src="../../../../.gitbook/assets/Screenshot 2023-07-31 at 2.00.19 PM.png" alt=""><figcaption></figcaption></figure>
   ```

   7. Once in the transformation edit page, add a new transformation of type Send Constant Property

      <div data-full-width="true"><figure><img src="/files/RWyXQrYfsDopz7W6OUEi" alt="" width="375"><figcaption></figcaption></figure></div>
   8. Set the Property Value to the Conversion Event Unique ID (copied from the StackAdapt Conversion Events page), the Constant Type to Text, and the Property Name to `conversion_id`.

   <figure><img src="/files/8BmHX4bpBc9ClTiWPGx6" alt="" width="375"><figcaption></figcaption></figure>
2. If you're using Google Tag Manager to send data to StackAdapt, you'd simply create a tag with the Freshpaint tag template in Google Tag Manager and select the tag type "StackAdapt". In this case, you just need to specify StackAdapt Conversion Event Unique ID in the event tag, no transformation necessary.

Once you've set up the transformation with the StackAdapt Conversion Event Unique ID, you're ready to start sending events to StackAdapt via Freshpaint!

### Configuring StackAdapt for View-Through Conversions using the Freshpaint Impression Pixel

For tracking view-through conversions with StackAdapt, we recommend using the [Freshpaint Impression Pixel](/integrations/impression-pixel).

{% hint style="info" %}
The Freshpaint platform previously supported doing view-through reallocation on StackAdapt directly by sending all potential conversions along with their IP. To ensure there's no disruption in conversion data, this legacy behavior continues to work if the impression pixel is not enabled and IP addresses are allowlisted. We recommend customers move to using the impression pixel as it minimizes the amount of data that needs to be sent to third parties and better ensures user privacy and compliance.
{% endhint %}

1. Enable and the Freshpaint Impression Pixel for the StackAdapt destination. Copy the pixel configuration URL to your clipboard.

   <figure><img src="/files/suCmHBg3UbSWN8RZcoL5" alt=""><figcaption></figcaption></figure>
2. In your StackAdapt account, go to the campaign(s) you wish to enable view-through tracking on, and add the URL copied in step one to "Impression Tracking URLs"

   <figure><img src="/files/ohlwRaVbSPR8FhdJVi48" alt=""><figcaption></figcaption></figure>
3. Save the changes to your campaign.

### If you are a HIPAA account, you will need to add event properties to the allowlist. If you are not a HIPAA account, you can skip this step.

Freshpaint has the properties needed for StackAdapt conversion events listed under Required Properties. There are additional properties needed for Retargeting events listed under Recommended Properties.

**Property Requirements:**

* Conversion Events: `conversion_id`, `$sapid`
* Retargeting Events: `retargeting_id`, `$ip`, `$user_agent`

<figure><img src="/files/91ZUoK4MpF3gPJGCTXB1" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
When setting up a conversion event in StackAdapt, you can select either 'click-through' or 'view-through and click-through'. 'View-through and click-through' is the default setting. When the default setting is enabled, the platform will attribute to both impressions and clicks. You convert the event in StackAdapt from 'click-through' to a 'view-through & click-through' at anytime.
{% endhint %}

### Set up Test Campaign and Configure in StackAdapt

1. Set up a test campaign that targets a small audiences and set a low budget ($10-50 budget).
2. In order for Freshpaint to be able to automatically capture the click ID auto-generated by the StackAdapt advertisement, the click ID needs to be specified as a macro in the campaign Click URL.
   1. Navigate to the Overview tab in the StackAdapt portal, and click on your campaign. Click on the Creative tab and add `sapid={SA_POSTBACK_ID}` as a query parameter to your Click URL. A preview of the query parameters will show up under the Click URL that you can use to confirm that the query parameters are properly configured.
3. Verify in Freshpaint that the events triggering and flowing through to successfully to StackAdapt by using Freshpaint's [Liveview and Event Verification tools](https://documentation.freshpaint.io/admin-panel/investigate-testing-and-debugging)

### Confirm events are triggering and sending to StackAdapt successfully

To check whether StackAdapt is receiving events, you can go to **Pixel > Conversion Events** within your StackAdapt account, which will show you when the last time StackAdapt received an event for each Conversion Event.

{% hint style="info" %}
Conversions may take up to 2 hours to appear in your StackAdapt portal
{% endhint %}


# StackAdapt Reference

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **StackAdapt** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="249.33333333333331" align="right"></th><th width="223" data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Retargeting

StackAdapt has extensive support for crafting audiences to retarget. By sending retargeting events to StackAdapt, you can craft campaigns to focus on audiences you know are already interested.

{% hint style="warning" %}
Retargeting Audiences with StackAdapt requires a user's IP Address and User Agent. When used with campaigns and ads that contain specific health information, sending a user's personally identifiable information (PII) for retargeting could be out-of-compliance with HIPAA unless a BAA is signed with StackAdapt. StackAdapt is not currently signing BAAs.
{% endhint %}

Retargeting Audience events require a `retargeting_id` in the same way Conversion Events require a `conversion_id`. The process to set up these events is the same. Following along with the conversion events guide above, we can create a **Transformation** that sends a **constant property** (`retargeting_id`) with the retargeting audience unique ID as the value.

**Example**:

<div data-full-width="false"><figure><img src="/files/yk4EdzuHLPMybem0h09W" alt="" width="356"><figcaption></figcaption></figure></div>

### Server-side

You may provide the following additional event properties when sending events to StackAdapt via Freshpaint's servers:

| **Event property** | **Type** | **Required?**                                                                             | **Description**                                                                                                                                                                                                             |
| ------------------ | -------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `$sapid`           | string   | Required for Click-Through Conversion Events                                              | `sapid` is generated at ad click time and appended to the landing page URL. **Freshpaint will automatically capture sapid for events from your website**. For events from other sources you would need to provide `$sapid`. |
| `conversion_id`    | string   | Required for Conversion Events                                                            | `conversion_id` maps to a Conversion Event in StackAdapt. This uniquely describes the conversion event taking place.                                                                                                        |
| `retargeting_id`   | string   | Required for Retargeting Events                                                           | `retargeting_id` maps to a Retargeting Audience in StackAdapt. This directly places the user in that Audience.                                                                                                              |
| `$ip`              | string   | Required for Retargeting Events and View-Through Conversion Events                        | Non-hashed public IP address of the browser                                                                                                                                                                                 |
| `$user_agent`      | string   | Required for Retargeting Events                                                           | User agent from the user’s device                                                                                                                                                                                           |
| `value`            | string   | Not required. Recommended for Conversion, Retargeting, and View-Through Conversion Events | Value of the conversion event, if any.                                                                                                                                                                                      |

## Considerations

* Conversions may take up to 2 hours to appear in your StackAdapt portal.


# Simpli.fi Conversions API (Early Access)

Simpli.fi is a Connected TV (CTV) advertising platform that focuses on performance marketing.

{% content-ref url="/pages/vKjzREFwlUHWnoyD68ao" %}
[Simpli.fi Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/simpli.fi-conversions-api-early-access/simpli.fi-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/02IjhyjsSjTi2GPaci0d" %}
[Simpli.fi Reference](/integrations/destinations/demand-side-platforms-dsps/simpli.fi-conversions-api-early-access/simpli.fi-reference)
{% endcontent-ref %}


# Simpli.fi Quick Start Guide

This is a guide to help you get started on sending your conversion events to Simpli.fi via Freshpaint. If you've already completed set up and are looking for more information, see [Simpli.fi Reference](/integrations/destinations/demand-side-platforms-dsps/simpli.fi-conversions-api-early-access/simpli.fi-reference).

{% hint style="warning" %}
The Simpli.fi Conversions API destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Simpli.fi** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Pixel IDs, you can choose a specific one by suffixing the Pixel ID, such as: **Simpli.fi::123456.** You can retrieve this value from the Simpli.fi configuration page for the Pixel ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Pixel IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What You'll Need

1. Your Simpli.fi audience key
2. Events in Freshpaint mapped to your Simpli.fi conversion audience

### Configure the Simpli.fi Conversions API destination in Freshpaint

1. Navigate to the [Freshpaint Destinations page](https://app.freshpaint.io/destinations/catalog).
2. Search for the Simpli.fi Conversions API destination.
3. Click Save on the Configuration row.
4. If you are a HIPAA account, it is highly recommended to set the Freshpaint allowlist for Simpli.fi to allow Freshpaint to forward the required properties. `audience_key` is required for all conversion events. `$sifi_transaction_id`, `$sifi_day`, and `$ip` are recommended for view-through attribution. `purchase_value_usd` and `purchase_order_id` are also recommended for e-commerce tracking.
5. Enable the [impression pixel](https://documentation.freshpaint.io/integrations/impression-pixel) for Simpli.fi. This enables Freshpaint to do view-through attribution within Freshpaint and report the conversion event to Simpli.fi. Then copy the `Pixel Configuration URL`. Click Save once you have set your preferred configuration options and copied the URL.
6. In your Simpli.fi account, navigate to the campaign(s) you wish to enable view-through tracking on and add the URL copied in step 5 to the impression tracking settings. This is required for view-through conversion tracking via Freshpaint. The URL that you paste in should look like:

`https://freshpaint-impression.com/pixel.png?env_id=<your-env-id>&dest_id=<your-dest-id>&$sifi_transaction_id={{transactionID}}&$sifi_day={{sifiDay}}`

7. Enable the Simpli.fi Conversions API destination.

Once you've followed the steps above you can start sending events to Simpli.fi Conversions API.

### Set Up in Simpli.fi

For each conversion event you want to track in Freshpaint, you will need to create a corresponding Conversion Audience in Simpli.fi.

1. Log in to your Simpli.fi account and open the First-Party Audiences screen.
2. Click **New Audience → Freshpaint Conversion** from the dropdown menu.
3. In the dialog window that opens:
   1. Name the conversion audience. Note: do not include medically specific terms in the naming convention.
   2. Select a **Conversion Event Type** (Other, Lead, Signup, or Purchase/Sale).
   3. Click **Save**.
   4. The audience will populate in the First-Party Audiences table.
4. Locate the conversion audience in the table, click the ••• menu on the right, then click **Copy Audience Key**.
5. Use this audience key when configuring your Send Constant Property transformation in Freshpaint (see Setting Up Conversion Events below).

### Setting Up Conversion Events

To send a conversion event to Simpli.fi, each event must include an `audience_key` property that identifies the Simpli.fi conversion audience you want to attribute the conversion to. This value is provided by your Simpli.fi account team.

Mapping a Freshpaint event to a Simpli.fi conversion audience

1. Navigate to the Simpli.fi Conversions API destination in Freshpaint and click Configure next to Event Transformations.

<figure><img src="/files/PCjWByqq4K8yKlhTy6Gi" alt="Simpli.fi destination configuration page with &#x22;configure&#x22; next to event transformations highlighted"><figcaption></figcaption></figure>

2. Click "**+ Create New**".
3. Select "**Modify Data**". Choose the event you'd like to send to Simpli.fi, select the **Simpli.fi Conversions API** destination, click "**Enable it?**" if the event is not yet enabled for this destination, and click Save.

<figure><img src="/files/Og7NUwzUIgbY5lAQYCSh" alt="Freshpaint transformations page showing a Purchase event selected for the Simpli.fi Conversions API destination"><figcaption></figcaption></figure>

4. Once in the transformation edit page, add a new transformation of type Send Constant Property.
5. Set the Property Name to `audience_key`, and the Property Value to your Simpli.fi conversion audience key provided by your Simpli.fi account team.

<figure><img src="/files/n5VywagodYGrpuEOY4Nb" alt="Transformation page showing example send constant property transformation for the property audience_key"><figcaption></figcaption></figure>

6. Click Save.

Once you've set up the transformation, Freshpaint will include the `audience_key` on every matching event sent to Simpli.fi.

### Sending Purchase Data (Optional)

If you'd like to include purchase data with your conversion events, you can send `purchase_value_usd` and `purchase_order_id` as additional properties. These can be set in two ways:

Using a Send Constant Property transformation (for fixed values):

1. In the same transformation edit page, add another Send Constant Property transformation.
2. Set the Property Name to `purchase_value_usd`, and the Property Value to the purchase amount in USD.
3. Optionally, add another Send Constant Property transformation with Property Name set to `purchase_order_id` and Property Value set to the order ID.

If your events already capture purchase value and order ID as event properties, you can map them directly from your Event Definition without a transformation. Simply ensure the properties are named `purchase_value_usd` and `purchase_order_id` on the event, or use a Rename Property transformation to map your existing property names to these values.

<figure><img src="/files/IgFy3SUmrGcVoN3pZgbC" alt="Rename transformation example, renaming the property value to purchase_value_usd"><figcaption></figcaption></figure>

### Verify Your Setup <a href="#verify-your-setup" id="verify-your-setup"></a>

Once your integration is active:

1. Verify in Freshpaint that the events are triggering and flowing through successfully to Simpli.fi by using Freshpaint's [Liveview and Event Verification tools](https://documentation.freshpaint.io/admin-panel/investigate-testing-and-debugging).


# Simpli.fi Reference

This is a reference document for the Simpli.fi destination. For information on how to set up this integration, see the [Simpli.fi Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/simpli.fi-conversions-api-early-access/simpli.fi-quick-start-guide).

{% hint style="warning" %}
The Simpli.fi Conversions API destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Simpli.fi** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Pixel IDs, you can choose a specific one by suffixing the Pixel ID, such as: **Simpli.fi::123456.** You can retrieve this value from the Simpli.fi configuration page for the Pixel ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Pixel IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## View-Through Tracking

Freshpaint supports view-through tracking by capturing the `$sifi_transaction_id` and `$sifi_day` parameters passed in by Simpli.fi using the Freshpaint Impression Pixel. Assuming you have followed the [Simpli.fi Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/simpli.fi-conversions-api-early-access/simpli.fi-quick-start-guide) to set up your destination, you can verify that view-through tracking is working by looking for an event in Event Verification that contains the `$sifi_transaction_id` and `$sifi_day` fields.

You can also look for a transformation that shows the event data was enriched by the Freshpaint Impression Pixel.

<figure><img src="/files/OkbJ0wOJwxCK27h72BvV" alt="Freshpaint transformation showing impression pixel match"><figcaption></figcaption></figure>

For unattributed conversions (where no impression pixel match is found), if `$ip` is allowlisted, Freshpaint will send the user's IP address as a device identifier so Simpli.fi can still\
record the conversion.

## Relevant Properties

| Freshpaint Property    | Simpli.fi Parameter  | Type    | Required?   | Description                                                                                                                                                                                                         |
| ---------------------- | -------------------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `audience_key`         | `audience_key`       | string  | Required    | The Simpli.fi conversion audience key. Set via a Send Constant Property transformation. Identifies the Simpli.fi conversion audience to attribute the conversion to.                                                |
| `$sifi_transaction_id` | `transaction_id`     | string  | Recommended | The Simpli.fi unique identifier for impressions. Captured automatically by the Freshpaint Impression Pixel from the `{{transactionID}}` macro on your Simpli.fi creatives. Required for view-through attribution.   |
| `$sifi_day`            | `sifi_day`           | integer | Recommended | The internal Simpli.fi day identifier of the impression. Captured automatically by the Freshpaint Impression Pixel from the `{{sifiDay}}` macro on your Simpli.fi creatives. Required for view-through attribution. |
| `$ip`                  | `device_id`          | string  | Recommended | The IP address of the user. Used as the device identifier for unattributed conversions when no impression pixel match is found.                                                                                     |
| `purchase_value_usd`   | `purchase_value_usd` | number  | Recommended | The monetary value of the conversion event in US dollars.                                                                                                                                                           |
| `purchase_order_id`    | `purchase_order_id`  | string  | Recommended | A unique identifier for the purchase associated with the conversion.                                                                                                                                                |


# theTradeDesk

Send advertising events directly to theTradeDesk

{% content-ref url="/pages/LS3cDhgMVfZBSMWD21f9" %}
[theTradeDesk Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/gZql1tbDbNm0QqgsJxrD" %}
[theTradeDesk Reference](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-reference)
{% endcontent-ref %}

{% content-ref url="/pages/UmbmvCoWWL0olIN4DmyB" %}
[theTradeDesk with CM360 Configuration Guide](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-with-cm360-configuration-guide)
{% endcontent-ref %}


# theTradeDesk Quick Start Guide

Send advertising events directly to theTradeDesk

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **theTradeDesk** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertiser IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **theTradeDesk::4w1ba8e.** You can retrieve this value from theTradeDesk configuration page for the Advertiser ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Advertiser IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What You'll Need

1. Your theTradeDesk Advertiser ID
2. Image Pixel IDs / tracker\_ids for your conversions
3. Advertising media configured in your theTradeDesk account to specify `ttdimp`
4. Advertiser ID configured in Freshpaint
5. Conversion Events configured in your Freshpaint account, or GTM tags using the [Google Tag Manager integration](/integrations/google-tag-manager-integration)

### To set up theTradeDesk with Freshpaint, follow these steps:

1. Make sure you have the appropriate access in both Freshpaint and theTradeDesk:
   1. Contact your Freshpaint Account Manager to request access to this destination. Once you have that, we will help you step by step through the configuration process
   2. Contact your Agency & theTradeDesk pod to complete necessary legal documentation. These documents are referred to as ‘API Order Form’ and ‘Access Letter’. These documents are required by theTradeDesk to set up Freshpaint on your theTradeDesk account.
2. Create your conversion funnel, and create events in Freshpaint to track your conversions.
3. Find the Advertiser ID in your [theTradeDesk account](https://desk.thetradedesk.com/). Be sure you have the desired Advertiser selected, then find the Advertiser ID from the URL when navigating to Inventory -> Site/App in theTradeDesk UI. It should look similar to 4w1ba8e:<br>

   <figure><img src="/files/x45YoOER3f6UNy9tLbBl" alt=""><figcaption></figcaption></figure>
4. Set up an Image Pixel in theTradeDesk
   1. The owner of theTradeDesk account will need to apply for legal for approval (vendor attribution) for all new pixels through theTradeDesk. This is required by theTradeDesk.
5. Get the Image Pixel ID(s) for your conversions. These may be found by navigating to Data -> Image Pixels in theTradeDesk UI (if using the [Google Tag Manager integration](/integrations/google-tag-manager-integration), these are populated from your migrated theTradeDesk Static Tracking Tags):<br>

   <figure><img src="/files/bJdXkFXq1Er3SRwZTeRz" alt=""><figcaption></figcaption></figure>
6. For click through conversions:
   1. Creatives hosted in theTradeDesk: Configure all media assets used by your theTradeDesk account to include `ttdimp` in the landing page URL:\
      `ttdimp=%%TTD_IMPRESSIONID%%`
   2. Creatives hosted in CM360: Refer to [this guide](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-with-cm360-configuration-guide) once you have followed the rest of the steps on this page.
7. Go to the [theTradeDesk configuration page](https://app.freshpaint.io/destinations/apps/thetradedesk) in Freshpaint and configure the Advertiser ID:\ <br>

   <figure><img src="/files/DmBFWu8UaDobbvmJvqua" alt=""><figcaption></figcaption></figure>
8. (Optional) For view-through conversions:
   1. In order to track view through conversions with theTradeDesk, enable the [Impression Pixel ](https://documentation.freshpaint.io/integrations/impression-pixel)from the Freshpaint configuration page. See [View Through Conversions](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-reference#view-through-conversions) for more detailed instructions on this step.
   2. You'll need to apply the Freshpaint Impression Pixel to your campaign creative in theTradeDesk

{% hint style="warning" %}
If you use CM360 as your Ad Tech Platform, please follow [this guide](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-with-cm360-configuration-guide) once you are done configuring theTradeDesk destination in Freshpaint.
{% endhint %}

### Required Properties

{% hint style="info" %}
The following event properties are **required** in order to attribute events to specific ads, and if in HIPAA mode, must be selected in the Required Properties Allow List.
{% endhint %}

<table data-header-hidden data-full-width="true"><thead><tr><th width="165"></th><th width="164"></th><th width="103"></th><th></th></tr></thead><tbody><tr><td><strong>Freshpaint property</strong></td><td><strong>theTradeDesk</strong><br><strong>parameter</strong></td><td><strong>Type</strong></td><td><strong>Description</strong></td></tr><tr><td><code>$ttdimp</code></td><td>All advertising media must include the following in the URL:<br><br>ttdimp=%%TTD_IMPRESSIONID%%</td><td>string</td><td>ttdimp (theTradeDesk impression ID) is generated at ad bid time and appended to the landing page URL. <strong>Freshpaint will automatically capture ttdimp for events from your website</strong>. If you wish, you may provide <code>$ttdimp</code> as an event property to override the automatically captured value.</td></tr><tr><td><code>tracker_id</code></td><td><code>tracker_id</code></td><td>string</td><td>The Image Pixel ID associated with a conversion, as described above.</td></tr></tbody></table>

There are other optional parameters you can add to your events in order to achieve different use cases. You can view the full list of parameters [here](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-reference).

### To send an event to theTradeDesk, you'll need to enable the destination for the event:

If you'd like to send an autotrack event from your event library to theTradeDesk, navigate to your Freshpaint event definition and toggle the destination on to enable the event to be sent to theTradeDesk:<br>

<figure><img src="/files/nvUoJ8YBJZP0SXxytBCb" alt=""><figcaption></figcaption></figure>

If you've configured multiple Advertiser IDs, you'll need to toggle each pixel individually for each Freshpaint event.

If you're using Google Tag Manager to send data to The Trade Desk, you'd simply create a tag with the Freshpaint tag template in Google Tag Manager and select the tag type "theTradeDesk". If you have multiple Advertiser IDs enabled for theTradeDesk, you'll need to specify which Advertiser ID(s) you'd like to enable the event for in the event tag.

{% hint style="info" %}
You'll need to include the image pixel ID from theTradeDesk with the conversion event. You can do with by creating a constant property [transformation](https://documentation.freshpaint.io/admin-panel/transformations) in Freshpaint.
{% endhint %}

### Set up a test campaign in theTradeDesk

1. Set up a test campaign that targets a small audiences and set your budget to 1000 impressions ($10-50 budget)
2. Attach a creative that has the Freshpaint Impression Pixel
3. Verify impressions and clicks are flowing into Freshpaint correctly by working with your Customer Success Engineer
4. Verify in Freshpaint that the events triggering and flowing through to successfully to theTradeDesk by using Freshpaint's [Liveview and Event Verification tools](https://documentation.freshpaint.io/admin-panel/investigate-testing-and-debugging)

### Confirm and Validate Conversions in theTradeDesk

Congratulations! Once you have confirmed conversion in theTradeDesk, you have finished setting up this integration.

You can find more detailed documentation on this integration in the [theTradeDesk Reference](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-reference)


# theTradeDesk Reference

Send advertising events directly to theTradeDesk

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **theTradeDesk** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertiser IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **theTradeDesk::4w1ba8e.** You can retrieve this value from theTradeDesk configuration page for the Advertiser ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Advertiser IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

This is a reference document for the theTradeDesk destination. For information on how to set up this integration, see the[ ](/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversion-api-quick-start-guide)[theTradeDesk Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-quick-start-guide)

### Events

When you send an event to theTradeDesk from Freshpaint, Freshpaint will create an event in theTradeDesk by hitting theTradeDesk's [Real-Time Conversion Events endpoint](https://partner.thetradedesk.com/v3/portal/data/doc/DataConversionEventsApi) in theTradeDesk.

## Track Events

When you send an event to theTradeDesk, you can track conversions from your ads based on those events.

Below are the Required, Recommended, and Optional properties which are mapped to theTradeDesk request:

<table data-header-hidden data-full-width="true"><thead><tr><th width="213"></th><th width="199"></th><th width="96"></th><th width="157"></th><th></th></tr></thead><tbody><tr><td><strong>Freshpaint</strong><br><strong>property</strong></td><td><strong>theTradeDesk</strong><br><strong>parameter</strong></td><td><strong>Type</strong></td><td><strong>Required?</strong><br><strong>Recommended?</strong></td><td><strong>Description</strong></td></tr><tr><td><code>$ttdimp</code></td><td><code>imp</code></td><td>string</td><td>Required</td><td>A 36-character string (including dashes) that serves as the unique ID for the impression to which the event is attributed.<br><br>When in HIPAA mode, is a Required Allow List property.</td></tr><tr><td><code>tracker_id</code></td><td><code>tracker_id</code></td><td>string</td><td>Required</td><td>The platform ID of the event tracker. Example value: hc7ihke<br><br>When in HIPAA mode, is a Required Allow List property.</td></tr><tr><td><code>value</code></td><td><code>value</code></td><td>number</td><td>Optional</td><td>When specified, the default currency is used.</td></tr><tr><td><code>privacy_settings</code></td><td><code>privacy_settings</code></td><td>object</td><td>Optional</td><td>User privacy settings based on data privacy consent processing. For object properties, see <a href="https://partner.thetradedesk.com/v3/portal/data/doc/DataConversionEventsApi#properties-privacy">Privacy Settings Properties</a>.</td></tr><tr><td><code>data_processing_option</code></td><td><code>data_procession_option</code></td><td>object</td><td>Optional</td><td>A data processing option to pass users' opt-out choices, such as Limited Data Use (LDU), in applicable US states. This is an alternative to the <code>GPP</code> string in the <code>privacy_settings</code>, see <a href="https://partner.thetradedesk.com/v3/portal/data/doc/DataConversionEventsApi#properties-dpo">Data Processing Options</a></td></tr></tbody></table>

### Click-Through Conversion

For click-through conversions some additional configuration is needed on creatives within the trade desk. A macro will need to be added to the landing page URL that will cause theTradeDesk to include the impression id as part of the URL of the click. Freshpaint will automatically look for the URL parameter of `ttdimp` when installed on the page.

### View-Through Conversions

Freshpaint can track view-through conversions and send them to theTradeDesk using the [Freshpaint Impression Pixel](/integrations/impression-pixel).

On the impression pixel configuration dialog within the destination configuration page within Freshpaint ensure that either IP or Cookie based matching is turned on. Also ensure any creatives within theTradeDesk are configured to include the pixel URL and setting provided within the destination configuration page.

{% hint style="warning" %}
If you use CM360 as your Ad Tech platform, please refer to this [setup guide](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-with-cm360-configuration-guide) once you have finished setting up theTradeDesk destination in Freshpaint
{% endhint %}

<figure><img src="/files/V7U2tktzdHQ1B3Y1WsiG" alt="" width="563"><figcaption><p>Impression Pixel config in theTradeDesk destination configuration</p></figcaption></figure>

{% hint style="info" %}
Configuring the impression pixel does not require sharing an IP address or Cookie with theTradeDesk. Freshpaint will do the attribution by matching either the IP address or Cookie to an impression that is seen by the Freshpaint Impression Pixel and if a match is found will send the impression id to theTradeDesk.
{% endhint %}

There are a couple of options for adding the Freshpaint Impression Pixel to your existing Trade Desk creatives.

1. Manually append the pixel in The Trade Desk's `Add Creative` Ul by adding the pixel into the "1x1 Pixel Impression Tracking URL" or "JavaScript Tracking Tag" field.

<figure><img src="/files/2Vwub4FcEPz0ZT2zZYs5" alt=""><figcaption></figcaption></figure>

2. Set a "Default" Impression Tracking URL in The Trade Desk, which will automatically append any pixel onto all creatives uploaded under your Advertiser seat. Note: this option requires outreach to your The Trade Desk CS team member who can help grant access to this option.

<figure><img src="/files/oOOS9qOCkp6pRkU40XPj" alt=""><figcaption></figcaption></figure>


# theTradeDesk with CM360 Configuration Guide

This configuration guide will walk you through how to use theTradeDesk and Campaign Manager 360 (CM360) together with Freshpaint.

{% hint style="warning" %}
These instructions assume that you have already set up theTradeDesk destination in Freshpaint. If you have not yet done so, please refer to [theTradeDesk Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-quick-start-guide).

Please note that configuring the CM360 destination in Freshpaint is not required in order to send events to theTradeDesk.
{% endhint %}

## Introduction

theTradeDesk is able to use Google Campaign Manager 360 as the Ad Tech platform to manage campaigns. When theTradeDesk and Google Campaign Manager 360 are integrated with each other, some changes to the Google Campaign Manager 360 configuration are required to allow Freshpaint to collect the necessary parameters to perform ad optimization. This guide walks through the changes that are required.

{% hint style="info" %}
This guide assumes theTradeDesk and Google Campaign Manager 360 accounts are already integrated with each other. If Google Campaign Manager 360 and theTradeDesk are not already configured to work together, please configure them first as per the recommendations of theTradeDesk.
{% endhint %}

### Click-Through Conversions

Click-through conversions occur when a visitor clicks on an ad that is shown to them and is taken to a landing page configured within the creative. Campaigns in theTradeDesk may have limited or no click-through activity. If you expect click-through activity to occur, Campaign Manager 360 can be configured to append a unique identifier for the ad impression to the landing page URL. If Freshpaint is installed on the landing page, then Freshpaint can capture the impression id to be used if the website visitor converts.

### View-Through Conversions

View-through conversions occur when a visitor views an ad and then sometime later visits a website and converts. Freshpaint is able to attribute view-through conversions if CM360 is configured to show an impression pixel when ads are served. This allows Freshpaint to track an ad impression, and do attribution when a conversion event is processed by Freshpaint servers.

#### Methods of Attribution

Freshpaint currently supports two methods for identifying if a website visitor has viewed an ad:

1. IP Address - An Internet Protocol address is the address used by computers to communicate with each other over the internet. Internet Protocol addresses have some limitations in that they do not uniquely identify a device, and many devices can share a particular address, or change their addresses at various times. Because of this IP address based matching will have an associated error rate, with both false positives and false negatives occurring. Freshpaint does not currently have any estimates on how accurate IP address based matching is.\
   \
   If you are showing ads on Connected TV devices, in Freshpaint's experience it is rare for the conversion to occur on the Connected TV itself. In this case Freshpaint recommends use of IP address based attribution for advertising campaigns targeted at connected TV.
2. Cookie - A cookie is a small piece of information that can be set on a web browser that the web browser will then include in each web request made to our servers afterwards. When an ad is viewed, the Freshpaint impression pixel can set a unique browser identity as a cookie in the visitors web browser. When the visitor later lands on a website and converts, the unique identity is used to look up any ad impressions that were seen by the same device and browser.\
   \
   Using cookie based matching is only recommended in advertising campaigns where the user is expected to convert on the same device and web browser as was shown the ad. If a user converts on a different device or web browser than was shown the cookie will not match. Some web browsers such as Firefox and Safari block the required cookie functionality for attribution to occur.

{% hint style="info" %}
IP address and Cookie attribution can both be enabled.
{% endhint %}

{% hint style="info" %}
Freshpaint performs attribution in the following order:

1. Click-through
2. Cookie
3. IP Address

View-through attribution will only fire if a click-through isn't detected. If the Cookie is disabled or a match isn't found, than IP address will be attempted.
{% endhint %}

#### Conversion Windows

When configuring View-through conversions in Freshpaint a conversion window is used to select how far back an event should look for a matching ad impression. When a conversion event is processed by Freshpaint, it will use the conversion window to select only ad impressions that have occurred within the configured number of days.

If there are multiple impressions that match, only the most recent will be used.

{% hint style="info" %}
The attribution ordering described above applies to the attribution window. As an example, we have a cookie impression 5 days ago and an IP address impression 1 day ago.

If the conversion window is configured as 10 days, than the attribution will select the IP address match from 5 days ago, because a cookie match is preferred of an IP address match even if the IP address based impression is more recent.

If the conversion window is configured as 3 days ago, the attribution will select the IP address based impression, because the Cookie based impression is outside the conversion window and that leaves only the IP address based impression as valid.
{% endhint %}

{% hint style="info" %}
Changes to the conversion window configuration in a destination will take effect immediately once saved.
{% endhint %}

## Configuration

### Common Configuration

The following configuration is required whether you are doing Click-through or View-through conversions within CM360.

1. Log into Campaign Manager 360
2. Navigate to the Campaign you want to configure.
3. Edit a placement you want to enable click-through for
4. Expand `Tag defaults`
5. Add an additional key-values entry of
   1. Key: `ttdimp`
   2. Value: `%%TTD_IMPRESSIONID%%`

<figure><img src="/files/oDPlTByRCcOuv8ePC1zj" alt=""><figcaption></figcaption></figure>

### Configuring Click-through

The following configuration is required within CM360 to enable Click-through conversion attribution.

1. Log into Campaign Manager 360
2. Configure the Advertiser to impact all ads or navigate to an individual Ad.
   1. Advertiser: Navigate to the Advertiser Properties and set the Landing page URL suffix to `ttdimp=%pttdimp=!;`

      <figure><img src="/files/73JYgx9pXeFMbeEN6i2C" alt=""><figcaption></figcaption></figure>
   2. Ad: Navigate to the campaign you want to configure and configure the Ad(s) you want to configure. Add the `ttdimp=%pttdimp=!;`macro to the landing page URL to set the ttdimp URL parameter to the landing page.

      1. Examples:
         1. <https://example.com>?<mark style="color:green;">ttdimp=%pttdimp=!;</mark>
         2. <https://example.com?utm\\_campaign=example-campaign&><mark style="color:green;">ttdimp=%pttdimp=!;</mark>

      <figure><img src="/files/r3PT3aoFXdfsbtBKvpvE" alt=""><figcaption></figcaption></figure>

### Configuring View-through

#### Freshpaint Configuration

1. Ensure you have a destination configured as per [theTradeDesk Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/thetradedesk/thetradedesk-quick-start-guide)
2. Navigate to the destination settings configuration page

   <figure><img src="/files/WdDEfQwyQwvpyEBpE5yA" alt=""><figcaption></figcaption></figure>
3. Select Configure for the Freshpaint Impression Pixel
4. Enable the Matching options you wish to use and set the number of days for the conversion window

   <figure><img src="/files/XuYRGLBWLWfmXaye3LhA" alt=""><figcaption></figcaption></figure>
5. Select Copy next to the CM360 Pixel URL to copy the impression pixel URL that will need to be configured in CM360

{% hint style="warning" %}
The configuration dialog provides URLs for when configuring the Pixel on theTradeDesk and a separate URL when configuring CM360. Make sure to use the "CM360 Pixel URL".
{% endhint %}

#### CM360 Configuration

The Freshpaint Impression Pixel can be configured as an advertiser or campaign event tag.

1. If configuring at the Advertiser level, navigate to the Advertiser Properties and open the Event tags configuration.
2. If configuring at the campaign level, navigate to the Campaign Properties and open the Event tags configuration.
3. Create a new impression event tag
   1. For Tag type, select Image
   2. For Tag URL, copy the URL retrieved from Freshpaint above

<figure><img src="/files/hT4yNknvEMCrPsR0sPQn" alt=""><figcaption></figcaption></figure>

#### Testing the CM360 Configuration

Whether CM360 is correctly configured can be tested independent of theTradeDesk by exporting the tags.

1. Navigate to the Campaign you want to verify
2. In the upper right corner Select Tags > Download Tags

   <figure><img src="/files/Nb2gcRTRbpARO3ynLmdR" alt=""><figcaption></figcaption></figure>
3. In the download page
   1. Select HTML as the Format
   2. Select the placements you want to verify
   3. Click Download
4. Open the downloaded file in a web browser
5. Copy one of the tags that looks like `<ins class...`
6. Use an advertising tag testing tool such as <https://www.w3schools.com/html/tryit.asp> and paste the tag somewhere in the body of the page.
7. Change the `%%TTD_IMPRESSIONID%%` to be a value, such as 1234

   <figure><img src="/files/KzrPAkqu2GTZvt7iaJ98" alt=""><figcaption></figcaption></figure>

**To test click-through**

1. In the w3school tool select `Run` to generate the website with the embedded advertisement
2. Click on the ad
3. Check that the URL on the landing page contains the text ttdimp=\<value> where value is what you set above.

   <figure><img src="/files/RlwrvvbGNGaLY650L7dz" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Some landing pages are configured to redirect the browser to another page. If Freshpaint is installed on the landing page it will automatically capture the ttdimp property from the URL, but the URL you see may not show the ttdimp=\<value>. This is working as expected as Freshpaint will save the ttdimp value.

If Freshpaint is not installed on your landing page that redirects, you will need to coordinate with your web team to ensure the landing page when redirecting the user also forwards the ttdimp parameter to the next page with Freshpaint installed.
{% endhint %}

**To test view-through**

{% hint style="info" %}
If you are not familiar with the dev tools of you're browser you can find more information here: <https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Tools_and_setup/What_are_browser_developer_tools>
{% endhint %}

1. Open the browser Dev Tools and select the network tab.
2. In the w3school tool select `Run` to add the tag to the page on the right
3. Look for an HTTP request that goes to <https://freshpaint-impression.com/pixel.png> and includes $ttdimp=\<value> where the value is what you selected above.

   <figure><img src="/files/BFepMbCsvLlBVtPYEQQe" alt=""><figcaption></figcaption></figure>


# Viant

Viant's DSP is a demand side platform that enables you to reach your target customers with DSP ads seamlessly across all programmatic channels and formats.

{% content-ref url="/pages/XX9DSrM3VSZmcxTE1r9d" %}
[Viant Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/viant/viant-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/ytGgOXYhJN9WYAHjWYWh" %}
[Viant Reference](/integrations/destinations/demand-side-platforms-dsps/viant/viant-reference)
{% endcontent-ref %}


# Viant Quick Start Guide

Send advertising conversion events directly to Viant's DSP.

This is a guide to help you get started on sending your conversion events to Viant via Freshpaint. If you've already completed set up and are looking for more information, see [Viant Reference](/integrations/destinations/demand-side-platforms-dsps/viant/viant-reference).

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Supports [Audience retargeting, lookalikes, and exclusions](https://documentation.freshpaint.io/audiences/audience-integrations/viant-audiences)
* Refer to this destination as **viant** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertiser IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **viant::123456.** You can retrieve this value from Viant configuration page for the Advertiser ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Advertiser IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What You'll Need

1. Your Viant Advertiser ID
2. Advertiser ID configured in Freshpaint
3. \[If in HIPAA mode] Allowlist set up to allow Freshpaint to forward `viant_clid` and `viant_impid` to Viant
4. [Impression pixel ](https://documentation.freshpaint.io/integrations/impression-pixel)enabled to allow Freshpaint to do view through conversion attribution
5. Advertising media configured in your Viant account to specify `viant_clid` and `viant_impid` for click through and view through conversions respectively.

### To set up Viant with Freshpaint, follow these steps:

1. Make sure you have the appropriate access in both Freshpaint and Viant:
   1. Contact your Freshpaint Account Manager to request access to this destination. Once you have that, we will help you step by step through the configuration process.
   2. Create your conversion funnel, and create events in Freshpaint to track your conversions.
2. Find your Advertiser ID in your Viant account.

<figure><img src="/files/zw7AjdXppDcvjJI9TP7s" alt=""><figcaption><p>Grab your Advertiser ID</p></figcaption></figure>

3. Set the Advertiser ID in Freshpaint.

<figure><img src="/files/pBjxtJSYfK94Z0g7Dyob" alt=""><figcaption><p>Set the Advertiser ID in Freshpaint.</p></figcaption></figure>

4. \[If in HIPAA mode] Set the Freshpaint allowlist for Viant to allow Freshpaint to forward `viant_clid` and `viant_impid` to Viant. These are required properties for the destination to be able to forward conversion events to Viant.

<figure><img src="/files/W4lICasJZ6uzC89ka6lK" alt="" width="563"><figcaption><p>Required allowlist settings while in HIPAA mode</p></figcaption></figure>

4. Enable the [impression pixel ](https://documentation.freshpaint.io/integrations/impression-pixel)for Viant. This enables Freshpaint to do view through attribution within Freshpaint and report the conversion event to Viant. We recommend enabling both IP matching and Cookie matching, and setting the Conversion Window to 30 days for the best results. Then copy the `Pixel Configuration URL` for step 5(b). Click `Save` once you have set your preferred configuration options and copied the url.

<figure><img src="/files/nfB0wo1ZIPSVclf2rnsE" alt="" width="563"><figcaption><p>Impression Pixel for Viant</p></figcaption></figure>

{% hint style="info" %}
Configuring the impression pixel does not require sharing an IP address or Cookie with Viant. Freshpaint will do the attribution by matching either the IP address or Cookie to an impression that is seen by the Freshpaint Impression Pixel, and if a match is found, will send the impression id to Viant.
{% endhint %}

5. Configure your media within Viant. This will allow Freshpaint to capture the click and view impression IDs to be able to send Viant conversion events. The parameters added here are also the ones that are required to be allowlisted.
   1. **For the Landing Page URL**: add a query parameter `viant_clid=${ADELPHIC_CLICKID}` to your landing page URL to capture the click ID. This is required for click through conversion tracking via Freshpaint. For example, it should look like `https://landingpageurl.com/abc?viant_clid=${ADELPHIC_CLICKID}`
   2. **For the Tracking Pixels (Pixel 1)**: Set the URL that you copied in step 4. This is required for view through conversion tracking via Freshpaint. The URL that you paste in should look like `https://freshpaint-impression.com/pixel.png?env_id=<your-env-id>&dest_id=<your-dest-id>&cke=1&$viant_impid=${ADELPHIC_CLICKID}`

<figure><img src="/files/aeL5f4Tk8eAzgMO3x3R2" alt=""><figcaption><p>Configure your creative in Viant</p></figcaption></figure>

### Set up a test campaign in Viant

1. Set up test campaign with a low budget (1$) to a target ‘Deal ID’ in Viant. You'll be able to obtain this value from your Customer Success Engineer.

   1. Select New Client Deal

   <figure><img src="/files/iigaSlmo6AAsfHBMNt19" alt=""><figcaption></figcaption></figure>

   b. Fill out highlighted fields then click "Create Client Deal"

   <figure><img src="/files/63wqzqRlaRYqOamDsRvk" alt=""><figcaption></figcaption></figure>

   c. Assign your creative to the test campaign/order/line (Supported sizes: 300x250, 728x90, 160x600, 300x600) and Target the test deal in your line along with US geo.

   <figure><img src="/files/mIl0c9mpJfeYU70M92ob" alt=""><figcaption></figcaption></figure>
2. Navigate to page where ad is displayed, click through into your funnel (follow user steps that lead to your conversion event)
3. Verify in Freshpaint that the conversions are triggering in Live View
4. Verify in Freshpaint that conversions are flowing through to Viant via Event Verification and your conversions are displaying on the campaign in Viant as expected (see more on this below)

### Verifying conversion reporting

Once you have followed the steps above, there are multiple ways you can verify that conversions are being reported to Viant:

#### Event Verification

On Freshpaint, you can use the event verification tab to see which events are being successfully sent to Viant. You can also dig into each event to see the data being sent or investigate errors if there are any.

<div data-full-width="true"><figure><img src="/files/oj2L3wUPA6Wpihb72Uou" alt=""><figcaption><p>Event Verification</p></figcaption></figure></div>

#### Reporting

Viant provides conversion event reporting through a dedicated Healthcare Conversions report. Self-service DSP clients can subscribe to the Healthcare Conversions report on the Measurement tab of the Advertiser level. Viant will subscribe managed-service DSP clients.

<figure><img src="/files/xMdHFbPNHBVuxIoJwpWm" alt="" width="375"><figcaption></figcaption></figure>

## Further reading

Looking for more information? See [Viant Reference](/integrations/destinations/demand-side-platforms-dsps/viant/viant-reference).


# Viant Reference

Send advertising conversion events directly to Viant's DSP.

This is a reference document for the Viant destination. For information on how to set up this integration, see the [Viant Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/viant/viant-quick-start-guide).

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **viant** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertiser IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **viant::123456.** You can retrieve this value from Viant configuration page for the Advertiser ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Advertiser IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Click Through Tracking

Freshpaint supports click through tracking by capturing the `viant_clid` query parameter on the landing page configured on your creative. You need to have the Freshpaint javascript snippet installed on the landing page for this to work. Assuming you have followed the [Viant Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/viant/viant-quick-start-guide) to set up your Viant destination, you can verify that click through tracking is working by looking for an event in event verification that contains the `$viant_clid` field.

<div data-full-width="true"><figure><img src="/files/AVIkarllXGwZe9n5v5NW" alt=""><figcaption><p>Event verification</p></figcaption></figure></div>

<figure><img src="/files/OUSFe8pBgnDVIDaoNkAK" alt=""><figcaption><p>Click ID being captured</p></figcaption></figure>

## View Through Tracking

Freshpaint supports view through tracking by capturing the `viant_impid` passed in by Viant using the Freshpaint Impression Pixel. Assuming you have followed the [Viant Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/viant/viant-quick-start-guide) to set up your Viant destination, you can verify that view through tracking is working by looking for an event in event verification that contains the `$viant_impid` field, similar to how you can verify Click Through Conversion.

You can also look for a transformation that shows that the event data was enriched by the Freshpaint Impression Pixel.

<div data-full-width="true"><figure><img src="/files/ihKDLEtCfP98YkEue8D0" alt=""><figcaption><p>Transformation applying the Impression Pixel captured impression to an event</p></figcaption></figure></div>

## Relevant Properties

These are the properties that are sent to Viant. If you've followed the [Viant Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/viant/viant-quick-start-guide) correctly, no further action is necessary. This section is just informational.

<table data-header-hidden data-full-width="true"><thead><tr><th width="207"></th><th width="214"></th><th width="137"></th><th></th></tr></thead><tbody><tr><td><strong>Freshpaint property</strong></td><td><strong>Viant</strong><br><strong>parameter</strong></td><td><strong>Type</strong></td><td><strong>Description</strong></td></tr><tr><td><code>$viant_clid</code></td><td><code>xid</code></td><td>string</td><td>This is the Viant Click ID that is captured by the Freshpaint tracker on the landing page configured on the creative. This is a required property, but can be empty if it's a view through conversion. This takes priority over the view impression ID.</td></tr><tr><td><code>$viant_impid</code></td><td><code>imp_id</code></td><td>string</td><td>This is the Viant View Impression ID. This property is captured by the Freshpaint Impression Pixel, and is passed to Freshpaint via the tracking pixel configured on the creative. This is a required property, but can be empty if it is a click through conversion.</td></tr><tr><td><code>&#x3C;event_name></code></td><td><code>ci_t_event_name</code><br><code>p_event_name</code></td><td>string</td><td>Event name property for Viant. Freshpaint automatically sets both Viant parameters to the event name.</td></tr><tr><td><code>&#x3C;advertiser_id></code></td><td><code>c_advertiser_id</code></td><td>numeric string</td><td>This is your Viant Advertiser ID that you configure on Freshpaint when setting up the destination. Required.</td></tr><tr><td><code>&#x3C;event_time></code></td><td><code>p_event_time</code></td><td>number</td><td>This is the event time represented in ms since epoch. Automatically set by Freshpaint.</td></tr><tr><td>-</td><td><code>ci_t_vendor</code></td><td>string</td><td>Hardcoded to <code>freshpaint</code>. Automatically set by Freshpaint.</td></tr><tr><td>-</td><td><code>ci_t_action</code></td><td>string</td><td>Hardcoded to <code>tx_created</code>. Automatically set by Freshpaint.</td></tr></tbody></table>


# Vibe Conversions API (Early Access)

Vibe is a Connected TV (CTV) advertising platform that focuses on performance marketing.

{% content-ref url="/pages/xPvXm2ji3YbJCwyhm6DR" %}
[Vibe Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/vibe-conversions-api-early-access/vibe-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/fNGLh13nJ3sNSQHQv4Eh" %}
[Vibe Reference](/integrations/destinations/demand-side-platforms-dsps/vibe-conversions-api-early-access/vibe-reference)
{% endcontent-ref %}


# Vibe Quick Start Guide

This is a guide to help you get started on sending your conversion events to Vibe via Freshpaint. If you've already completed set up and are looking for more information, see [Vibe Reference](/integrations/destinations/demand-side-platforms-dsps/vibe-conversions-api-early-access/vibe-reference).

{% hint style="warning" %}
The Vibe Conversions API destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Vibe Conversions API** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Pixel IDs, you can choose a specific one by suffixing the Pixel ID, such as: **Vibe Conversions API::123456.** You can retrieve this value from the Vibe configuration page for the Pixel ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Pixel IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What You'll Need

1. Your Vibe Pixel ID
2. Pixel ID configured in Freshpaint
3. Events in Freshpaint mapped to a valid Vibe event type

### Get your Vibe Pixel ID

1. In your Vibe dashboard, navigate to [Tracking → Web Pixel](https://www.vibe.co/dashboard/settings/tracking/web).
2. Click "Set up a Pixel".

<figure><img src="/files/6AwZwcn0Cvf9XL7rrC6u" alt="Image of the Vibe dashboard, highlighting the &#x22;Set up a pixel&#x22; button in the top right corner."><figcaption></figcaption></figure>

3. Under Choose an installation method, select Google Tag Manager. You do not need to complete the Google Tag Manager installation - this step is only to locate your Pixel ID.

<figure><img src="/files/hDmjxMD8jsscA79tIMbb" alt="Installation methods with &#x22;Google Tag Manager&#x22; selected."><figcaption></figcaption></figure>

4. Select your advertiser.
5. Click "Continue" and copy the Pixel ID displayed on this page.

<figure><img src="/files/nf4Ls25B79VhYXgfiSJ2" alt="Vibe dashboard showing where to copy pixel ID"><figcaption></figcaption></figure>

### Configure the Vibe Conversions API destination in Freshpaint

1. Navigate to the [Freshpaint Destinations page](https://app.freshpaint.io/destinations/catalog).
2. Search for the Vibe Conversions API destination.
3. Select Configure to paste your Pixel ID from the above steps.
4. Customers that use HIPAA mode should then configure the required, recommended, and recommended view-through properties. You can find all properties that the Freshpaint Vibe Conversions API integration supports [here](/integrations/destinations/demand-side-platforms-dsps/vibe-conversions-api-early-access/vibe-reference#events).
5. Enable Vibe Conversions API.

Once you've followed the steps above you can start sending events to Vibe Conversions API.

<figure><img src="/files/1whCgjRodqsWo8oFW37k" alt="Image of the Freshpaint Vibe Conversions API configuration settings, showing where to set Pixel ID"><figcaption></figcaption></figure>

### Setting up Conversion Events

Now that you've configured Freshpaint to connect to your Vibe pixel, you can send events to Vibe to track specific conversion types.

Vibe supports 5 conversion event types: `install`, `lead`, `page_view`, `purchase`, and `signup`. Freshpaint will automatically match an event to a Vibe event type if the event name, after lowercasing and inserting underscores at camelCase boundaries, exactly matches one of the valid types. For example, "Purchase", "purchase", and "PURCHASE" all match `purchase`, and "PageView" or "pageView" match `page_view`. Note that space-separated names like "Page View" will not match.

If you'd like to use an existing Freshpaint event whose name does not match a valid Vibe event type, you can use a Rename Event transformation to align the event name before it's sent to the destination. To do so:

1. Navigate to the [Transformations page](https://app.freshpaint.io/transformations) in Freshpaint.
2. Add a **Rename Event** transformation to map your existing event name to a valid Vibe event type (`install`, `lead`, `page_view`, `purchase`, or `signup`).

<figure><img src="/files/g3cbez7ZFY5F6Qj6KxLI" alt="Freshpaint transformations page displaying a &#x22;Rename Event&#x22; transformation to rename event to a valid Vibe event type."><figcaption></figcaption></figure>

Events that cannot be resolved to a valid Vibe event type will be dropped.

#### If you are a HIPAA account, you will need to add event properties to the allowlist. If you are not a HIPAA account, you can skip this step.

1. Go to the Vibe Conversions API configuration page in Freshpaint.
2. Click "Configure" next to "Required Properties" and "Recommended Properties".

<figure><img src="/files/yAErKlNWrFY04UwjXvgV" alt="Vibe Conversions API configuration page with &#x22;Configure&#x22; highlighted next to &#x22;recommended&#x22; and &#x22;required&#x22; properties"><figcaption></figcaption></figure>

### Confirm and Validate Events

#### Confirm and Validate Conversions in Freshpaint

1. Navigate to your site and trigger an event that should be sent to Vibe.
2. Navigate to the [Event Verification tool](https://app.freshpaint.io/event-verification) in Freshpaint.
3. Select **Vibe Conversions API** and verify your event went through.
4. Verify the event is marked as OK or resolve any missing property issues.

#### Confirm and Validate Conversions in Vibe

To check whether Vibe is receiving your events:

1. Log in to your Vibe account.
2. Navigate to [Tracking → Web Pixel](https://www.vibe.co/dashboard/settings/tracking/web).
3. You should see conversion events appearing for your pixel.


# Vibe Reference

This is a reference document for the Vibe destination. For information on how to set up this integration, see the [Vibe Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/vibe-conversions-api-early-access/vibe-quick-start-guide).

{% hint style="warning" %}
The Vibe Conversions API destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Vibe Conversions API** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Pixel IDs, you can choose a specific one by suffixing the Pixel ID, such as: **Vibe Conversions API::123456.** You can retrieve this value from the Vibe configuration page for the Pixel ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Pixel IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

This is a reference document for the Vibe Conversions API destination. For information on how to set up this integration, see the [Vibe Conversions API Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/vibe-conversions-api-early-access/vibe-reference).

### Events

#### Required Properties

| Freshpaint Property | Vibe Parameter | Type   | Requirement | Description                                                                                      |
| ------------------- | -------------- | ------ | ----------- | ------------------------------------------------------------------------------------------------ |
| `$ip`               | `ip`           | string | Required    | IP address of the user who performed the action. Events are dropped if this property is missing. |

#### Recommended Properties

| Freshpaint Property | Vibe Parameter   | Type   | Requirement | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ------------------- | ---------------- | ------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `vibe_event_name`   | `a`              | string | Recommended | <p>Vibe event type. Valid values: <code>install</code>, <code>lead</code>, <code>page\_view</code>, <code>purchase</code>, <code>signup</code>. If not set, Freshpaint will attempt to derive the event type by lowercasing<br>the event name and inserting underscores at camelCase boundaries (e.g., "Purchase" → <code>purchase</code>, "PageView" → <code>page\_view</code>). Note that space-separated names<br>(e.g., "Page View") will not match. Events that cannot be resolved to a valid type will be dropped.</p> |
| `revenue`           | `ed.price_usd`   | number | Recommended | Purchase amount in USD. `revenue` takes precedence over `price_usd` if both are present. Recommended for purchase events.                                                                                                                                                                                                                                                                                                                                                                                                    |
| `order_id`          | `ed.purchase_id` | string | Recommended | Unique order identifier. `order_id` takes precedence over `purchase_id` if both are present. Recommended for purchase events.                                                                                                                                                                                                                                                                                                                                                                                                |

#### Recommended View-Through Properties

| Freshpaint Property | Vibe Parameter | Type   | Requirement | Description                                                                                             |
| ------------------- | -------------- | ------ | ----------- | ------------------------------------------------------------------------------------------------------- |
| `$user_agent`       | `ua`           | string | Optional    | User agent string of the user's browser or device. Automatically captured by Freshpaint when available. |


# MNTN

MNTN is a Connected TV (CTV) advertising platform that focuses on performance marketing.

{% content-ref url="/pages/Tv4RiPHLdrlWzkyaRdps" %}
[MNTN Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/mntn/mntn-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/X6NKCuau48ODzG2aXttN" %}
[MNTN Reference](/integrations/destinations/demand-side-platforms-dsps/mntn/mntn-reference)
{% endcontent-ref %}


# MNTN Quick Start Guide

This is a guide to help you get started on sending your conversion events to MNTN via Freshpaint. If you've already completed set up and are looking for more information, see [MNTN Reference](/integrations/destinations/demand-side-platforms-dsps/mntn/mntn-reference).

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Refer to this destination as **MNTN** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertiser IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **MNTN::123456.** You can retrieve this value from the MNTN configuration page for the Advertiser ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Advertiser IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What You'll Need

1. Your MNTN Advertiser ID
2. Advertiser ID configured in Freshpaint
3. \[If in HIPAA mode] Allowlist set up to allow Freshpaint to forward properties to MNTN for attribution
4. [Impression pixel ](https://documentation.freshpaint.io/integrations/impression-pixel)enabled to allow Freshpaint to do view through conversion attribution
5. Advertising media configured in your MNTN account to specify `mntn_impid` for view through conversions.

### To set up MNTN with Freshpaint, follow these steps:

1. Make sure you have the appropriate access in both Freshpaint and MNTN:
   1. Contact your Freshpaint Account Manager to request access to this destination. Once you have that, we will help you step by step through the configuration process.
   2. Create your conversion funnel, and create events in Freshpaint to track your conversions.
2. Find your Advertiser ID in your MNTN account. It is the number in parenthesis in the top right of the page, alongside your account name. Reference the [MNTN documentation](https://help.mountain.com/en/articles/12159399-find-your-advertiser-id) for help finding your advertiser ID.

<figure><img src="/files/C4MFSfhXnxCoiNbUKTqA" alt=""><figcaption><p>Example: advertiser ID is 12345, in the top right of the screen</p></figcaption></figure>

3. Set the Advertiser ID in Freshpaint.

<figure><img src="/files/Xbw1xNPcyKOCmZVwA3cF" alt="" width="563"><figcaption></figcaption></figure>

4. \[If in HIPAA mode] It is highly recommended to set the Freshpaint allowlist for MNTN to allow Freshpaint to forward `mntn_impid`. This property will allow Freshpaint and MNTN to perform attribution on your conversion events. The `order_id` is also recommended for e-commerce tracking.

<figure><img src="/files/Brti8PU1pFwsTVqbJBk7" alt=""><figcaption></figcaption></figure>

5. Enable the [impression pixel ](https://documentation.freshpaint.io/integrations/impression-pixel)for MNTN. This enables Freshpaint to do view through attribution within Freshpaint and report the conversion event to MNTN. We recommend enabling IP matching and setting the Conversion Window to 30 days for the best results. Freshpaint automatically looks back an additional 14 days for verified visits meaning the total lookback window is a minimum of 44 days. Then copy the `Pixel Configuration URL` for step 6(a). Click `Save` once you have set your preferred configuration options and copied the url.

<figure><img src="/files/2UhjzK9ZY0xSnk8dUHrS" alt=""><figcaption><p>Impression pixel setup for MNTN</p></figcaption></figure>

{% hint style="info" %}
Configuring the impression pixel does not require sharing an IP address with MNTN, though sharing the IP is recommended for MNTN to perform attribution. Freshpaint will do attribution by matching the IP address to an impression that is seen by the Freshpaint Impression Pixel, and if a match is found, will send the impression id to MNTN.
{% endhint %}

6. Configure your media within MNTN. This will allow Freshpaint to capture view impression IDs to be able to send MNTN attributable conversion events. The parameters added here are also the ones that are required to be allowlisted.
   1. **For impression tracking**: Under "My Account" > "Integrations" find the Freshpaint integration. Click "Connect". In the modal, paste the URL from step 5 and click "Save". This is required for view through conversion tracking via Freshpaint. The URL that you paste in should look like `https://freshpaint-impression.com/pixel.png?env_id=<your-env-id>&dest_id=<your-dest-id>&cke=1&$mntn_impid=${asid}`.

<figure><img src="/files/oNCoTvj3035KTkZGqol8" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/5C65qSPe6nRdZWdXalob" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
You may see the warning *Macro "asid" is not valid* when you paste the impression URL. This can be safely ignored.
{% endhint %}

{% hint style="warning" %}
If you are using copy + paste commands, make sure to paste the impression tracking in plain text to avoid any unintended character encoding. Make sure the URL ends in `$mntn_impid=${asid}`, not `$mntn_impid=$%7basid%7d`
{% endhint %}

### Conversions and Verified Visits

The MNTN integration has 2 types of events: [Verified Visits](https://mountain.com/blog/how-mntn-measures-performance-without-clicks-a-deep-dive-into-the-verified-visits-model/) and Conversions.

Verified Visits and conversions need to share a common identifier so that MNTN can accurately determine which conversions were preceded by a Verified Visit. By default, this identifier will be the built-in Session ID, but this value can be overridden by the `event_id` event property for custom tracking if provided and allowlisted.

Verified Visits can improve conversion tracking within MNTN and are highly recommended. You can configure your events as Verified Visits and conversions in 2 ways:

1. Enable the "send page views as Verified Visits by default" setting in integration configuration. By default, this setting is already enabled. This will send all page view events as Verified Visits unless specified otherwise by the `mntn_event_type` event property.
2. Set the `mntn_event_type` property on certain events to either `visit` or `conversion`. The `mntn_event_type` property will always override the "send page views as Verified Visits by default" setting.

It's recommended to set the value of `mntn_event_type` using a "send constant property" [transformation](https://documentation.freshpaint.io/admin-panel/transformations#creating-a-new-transformation) on the event definition you'd like to treat as a Verified Visit or conversion.

### Set up Test Campaign in MNTN

1. Set up a test campaign that targets a small audience
2. Attach a creative that has the Freshpaint Impression Pixel
3. Verify impressions and clicks are flowing into Freshpaint correctly by working with your Customer Success Engineer
4. Verify in Freshpaint that the events are triggering and flowing through successfully to MNTN by using Freshpaint's [Liveview and Event Verification tools](https://documentation.freshpaint.io/admin-panel/investigate-testing-and-debugging)

### Confirm events are triggering and sending to MNTN successfully

To check whether MNTN is receiving events, you can go to **Reporting** in your MNTN dashboard and verify that conversions are showing and are attributable (if IP and Impression ID are allowed via the HIPAA allowlist).

## Further reading

Looking for more information? See [MNTN Reference](/integrations/destinations/demand-side-platforms-dsps/mntn/mntn-reference).


# MNTN Reference

This is a reference document for the MNTN destination. For information on how to set up this integration, see the [MNTN Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/mntn/mntn-quick-start-guide).

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Refer to this destination as **MNTN** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertiser IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **MNTN::123456.** You can retrieve this value from MNTN configuration page for the Advertiser ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Advertiser IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## View Through Tracking

Freshpaint supports view through tracking by capturing the `mntn_impid` parameter passed in by MNTN using the Freshpaint Impression Pixel. Assuming you have followed the [MNTN Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/mntn/mntn-quick-start-guide) to set up your MNTN destination, you can verify that view through tracking is working by looking for an event in event verification that contains the `$mntn_impid` field.

You can also look for a transformation that shows that the event data was enriched by the Freshpaint Impression Pixel.

<figure><img src="/files/etSgrYvbXr4BBz1zSoa4" alt=""><figcaption><p>Transformation applying the Impression Pixel captured impression to an event</p></figcaption></figure>

## Relevant Properties

These are the properties that are sent to MNTN. If you've followed the [MNTN Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/mntn/mntn-quick-start-guide) correctly, no further action is necessary. This section is just informational.

<table data-header-hidden data-full-width="true"><thead><tr><th width="207"></th><th width="214"></th><th width="137"></th><th></th><th></th></tr></thead><tbody><tr><td><strong>Freshpaint property</strong></td><td><strong>MNTN</strong><br><strong>parameter</strong></td><td><strong>Type</strong></td><td><strong>Required?</strong></td><td><strong>Description</strong></td></tr><tr><td><code>order_id</code></td><td><code>order_id</code></td><td>string</td><td>Recommended</td><td>Unique order identifier for connecting conversion activities to advertising campaigns.<br><br>If not provided or not allowlisted, this property will default to a unique masked ID for the conversion event.</td></tr><tr><td><code>$mntn_impid</code></td><td><code>Impression</code></td><td>string</td><td>Recommended</td><td>This is the MNTN View Impression ID. This property is captured by the Freshpaint Impression Pixel, and is passed to Freshpaint via the tracking pixel configured on the creative. The impression ID is required for attribution.</td></tr><tr><td><code>order_amount</code></td><td><code>order_amount</code></td><td>number</td><td>Recommended</td><td>The amount associated with the conversion.</td></tr><tr><td><code>order_currency</code></td><td><code>order_currency</code></td><td>string</td><td>Recommended</td><td>Currency code associated with the conversion. <a href="https://www.iso.org/iso-4217-currency-codes.html">ISO 4217</a> format.</td></tr><tr><td><code>product_identifier_list</code></td><td><code>product_identifier_list</code></td><td>array of strings</td><td>Recommended</td><td>List of product SKUs or identifiers associated with the conversion.</td></tr><tr><td><code>account_id</code></td><td><code>account_id</code></td><td>string</td><td>Recommended</td><td>Account ID of the connected MNTN account.</td></tr><tr><td><code>event_id</code></td><td><code>event_id</code></td><td>string</td><td>Optional</td><td>Common identifier to connect Verified Visits to a conversion for a specific user journey.</td></tr><tr><td><code>mntn_event_type</code></td><td></td><td>string</td><td>Optional</td><td>Determines if an event is sent as a Verified Visit or as a conversion.<br><br>Valid values: <code>visit</code>, <code>conversion</code></td></tr></tbody></table>


# Zeta Conversions API (Early Access)

Zeta is a Connected TV (CTV) advertising platform that focuses on performance marketing.

{% content-ref url="/pages/qQlV4PPdOslao70xQf1E" %}
[Zeta Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/zeta-conversions-api-early-access/zeta-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/qRRcr2JmJeuIfyiPa5b3" %}
[Zeta Reference](/integrations/destinations/demand-side-platforms-dsps/zeta-conversions-api-early-access/zeta-reference)
{% endcontent-ref %}


# Zeta Quick Start Guide

This is a guide to help you get started on sending your conversion events to Zeta via Freshpaint. If you've already completed set up and are looking for more information, see [Zeta Reference](/integrations/destinations/demand-side-platforms-dsps/zeta-conversions-api-early-access/zeta-reference).

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Refer to this destination as **Zeta** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertiser IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **Zeta::123456.** You can retrieve this value from the Zeta configuration page for the Advertiser ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Advertiser IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What You'll Need

1. Your Freshpaint Environment ID
2. Your Zeta Advertiser ID, Pixel ID, Site ID, and API Key
3. A Zeta Marketing Platform (ZMP) account mapped to your Freshpaint Environment ID (coordinated with your Zeta Account Manager)
4. \[If in HIPAA mode] Allowlist set up to allow Freshpaint to forward properties to Zeta for attribution
5. Impression pixel enabled to allow Freshpaint to do view-through conversion attribution

### To set up Zeta with Freshpaint, follow these steps:

1. **Notify your Zeta Account Manager** before activating the integration. Provide them your Freshpaint Environment ID, which can be found in your Freshpaint dashboard under "Setup".
   1. Your Zeta Account Manager will create and map a ZMP account to your Environment ID. Wait for confirmation from your account team before proceeding.
2. **Make sure you have the appropriate access** in both Freshpaint and Zeta:
   1. Contact your Freshpaint Account Manager to request access to this destination. Once granted, we will help you step by step through the configuration process.
3. **Create** **events in Freshpaint to track your conversions**.
4. **Enter your Zeta credentials in Freshpaint**. You will need your Advertiser ID, Pixel ID, Site ID, and API Key from your Zeta DSP account.

<figure><img src="/files/rAzIx3YlS8LsTZ3PITlM" alt=""><figcaption></figcaption></figure>

5. **\[If in HIPAA mode]** It is highly recommended to set the Freshpaint allowlist for Zeta to allow Freshpaint to forward `$zeta_impid` and `$zeta_userid`. These properties enable Freshpaint and Zeta to perform attribution on your conversion events.

<figure><img src="/files/X9cWk9hlxGguq0SeeSyj" alt=""><figcaption></figcaption></figure>

6. **Enable the impression pixel for Zeta.** This enables Freshpaint to do view-through attribution and report the conversion event to Zeta. We recommend enabling IP matching and cookie matching, and setting the Conversion Window to at least 30 days for the best results. Then copy the Pixel Configuration URL for the next step. Click Save once you have set your preferred configuration options and copied the URL.

<figure><img src="/files/xPYwGw7qWcKBwWmpSrhV" alt=""><figcaption></figcaption></figure>

7. **Configure your creatives in ZMP** to include the Freshpaint impression pixel URL copied in the previous step. The URL already contains the `$zeta_impid` and `$zeta_userid` macros — Zeta will substitute the real values automatically when the ad serves. This is required for view-through conversion tracking via Freshpaint. The URL that you paste in should look like: `https://freshpaint-impression.com/pixel.png?env_id=<your-env-id>&dest_id=<your-dest-id>&$zeta_impid={adinstanceid}&$zeta_userid={userid}`

### Verify Your Setup

Once your integration is active and your creatives are running:

1. Verify in Freshpaint that the events are triggering and flowing through successfully to Zeta by using Freshpaint's [Liveview and Event Verification tools](https://documentation.freshpaint.io/admin-panel/investigate-testing-and-debugging).
2. Your Zeta account team will confirm when data is being received on their end, and will reach out if any additional data mapping is needed.


# Zeta Reference

This is a reference document for the Zeta destination. For information on how to set up this integration, see the [Zeta Quick Start Guide](https://documentation.freshpaint.io/integrations/destinations/demand-side-platforms-dsps/mntn/mntn-quick-start-guide).

## Destination Info

* Supports [Track](/reference/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](/readme/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Supports [Freshpaint Impression Pixel](/integrations/impression-pixel)
* Refer to this destination as **Zeta** in the [Integrations object](/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertiser IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **Zeta::123456.** You can retrieve this value from the Zeta configuration page for the Advertiser ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Advertiser IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## View Through Tracking

Freshpaint supports view-through tracking by capturing the `$zeta_impid` parameter passed in by Zeta using the Freshpaint Impression Pixel. Assuming you have followed the [Zeta Quick Start Guide](/integrations/destinations/demand-side-platforms-dsps/zeta-conversions-api-early-access/zeta-quick-start-guide) to set up your Zeta destination, you can verify that view-through tracking is working by looking for an event in Event Verification that contains the `$zeta_impid` field.

You can also look for a transformation that shows the event data was enriched by the Freshpaint Impression Pixel.

<figure><img src="/files/exqhlGmzKtOrHPLJ8w3g" alt=""><figcaption></figcaption></figure>

## Events

### Relevant Properties

| Freshpaint Property | Zeta Parameter | Type   | Requirement | Description                                                                                                                                                                  |
| ------------------- | -------------- | ------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `$zeta_userid`      | `cs`           | string | Required    | Zeta Sizmek ID. Captured automatically by the Freshpaint Impression Pixel from the `{userid}` macro on your Zeta creatives.                                                  |
| `$zeta_impid`       | `impId`        | string | Required    | Zeta impression ID. Captured automatically by the Freshpaint Impression Pixel from the `{adinstanceid}` macro on your Zeta creatives. Required for view-through attribution. |
| `email`             | `em`, `es`     | string | Recommended | Email address. Freshpaint automatically normalizes (lowercases, trims, removes + alias) and hashes the value as both MD5 (`em`) and SHA-256 (`es`) before sending.           |
| `phone`             | `ph`           | string | Recommended | Phone number. Freshpaint normalizes to 11-digit format with no spaces or dashes.                                                                                             |
| `mobile_ad_id`      | `mm`           | string | Recommended | Mobile Ad ID.                                                                                                                                                                |


# Direct Response Ads

Direct Response ad destinations allow Advertising tools to deliver ads to targeted demographics.

## Event Mapping

In additional to accepting custom events, most Direct Response Ads destinations accept a set of "standard events". These are events that have some special significant to the destination. As an example, here are some of the standard events Facebook Pixel accepts:

* AddToCart
* AddToWishlist
* Lead
* PageView
* Purchase

To help you get your events into a destinations standard events, Freshpaint provides event mappings. Event mappings let you rename your events before they are sent to a destination. As an example, you could map your `Submitted Email` event in Freshpaint to the Facebook Pixel standard event `lead`:

![](/files/-MCG0CBXo_nqK4e3MFkd)


# AdMedia (Early Access)

Send advertising conversion events directly to AdMedia

{% hint style="warning" %}
The AdMedia destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

{% content-ref url="/pages/YaZs8fidLUllxnKDMiPh" %}
[AdMedia Quick Start Guide](/integrations/destinations/direct-response-ads/admedia-early-access/admedia-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/dCtF6YQlFcjtIWVe1TVr" %}
[AdMedia Reference](/integrations/destinations/direct-response-ads/admedia-early-access/admedia-reference)
{% endcontent-ref %}


# AdMedia Quick Start Guide

Send advertising conversion events directly to AdMedia

{% hint style="warning" %}
The AdMedia destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **AdMedia** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertisesr IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **AdMedia::1234123456.** You can retrieve this value from the AdMedia configuration page for the Advertiser ID of interest.
* Connection Modes:

<table><thead><tr><th align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

This guide enables you to fully enable the AdMedia destination for your site. This guide assumes you have the Freshpaint snippet installed on your site — if you do not, please follow [this guide](https://documentation.freshpaint.io/readme/guides/quickstart/installing-freshpaint).

### Enable the AdMedia Integration

1. Navigate to the [Freshpaint Destinations page](https://app.freshpaint.io/destinations/catalog).
2. Search for the **AdMedia** destination.
3. Select **Configure**.
4. Enter the Advertiser ID provided by AdMedia.
5. Customers that use HIPAA mode should then configure the required and recommended properties. You can find [all properties that the AdMedia integration supports here.](https://documentation.freshpaint.io/integrations/destinations/direct-response-ads/miscrosoft-ads-conversions-api-early-access/miscrosoft-ads-conversions-api-reference)
6. Select Save.
7. Enable the AdMedia integration.

<figure><img src="/files/JD16tnHQFSoGTaZ1yfZl" alt="Freshpaint AdMedia integration configuration page, with Advertiser ID field selected. "><figcaption></figcaption></figure>

### If you are a HIPAA account, you will need to add event properties to the allowlist. If you are not a HIPAA account, you can skip this step.

1. Go to the **AdMedia** configuration page in Freshpaint.
2. Click "Configure" next to "Required Properties" and "Recommended Properties".
3. If you're using the Freshpaint/AdMedia integration for ad attribution purposes, we recommend you send the `$click_id` property. This property is required in order to see ad attribution data in AdMedia. You can do so by checking the box in the popup.
4. Next, add any other properties you'd like to send to AdMedia to the Advanced: HIPAA Allow List.

Once you've followed these steps, you're ready to start sending events to AdMedia.

<figure><img src="/files/5jFCrfP2ZQjUOoXZpChY" alt="AdMedia integration page with recommended properties selected"><figcaption></figcaption></figure>

## Confirm and Validate Events

### Confirm and Validate Conversions in Freshpaint

1. Navigate to your site and visit a page that should trigger your event..
2. Trigger the event.
3. Navigate to the [Event Verification tool](https://app.freshpaint.io/event-verification).
4. Select **AdMedia** and verify your event went through.
   1. This can take up to 90 seconds.
5. Verify the event is marked as `OK` or resolve any missing property issues.

<figure><img src="/files/W7GPrwnJvhenic4ACao4" alt="AdMedia Event Verification example with OK status"><figcaption></figcaption></figure>


# AdMedia Reference

Send advertising conversion events directly to AdMedia

{% hint style="warning" %}
The AdMedia destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **AdMedia** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Advertisesr IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **AdMedia::1234123456.** You can retrieve this value from the AdMedia configuration page for the Advertiser ID of interest.
* Connection Modes:

<table><thead><tr><th align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

This is a reference document for the AdMedia destination. For information on how to set up this integration, see the AdMedia Quick Start Guide.

## Events

### Required Properties

| Freshpaint Property | AdMedia Parameter | Type   | Requirement | Description                                                                                                   |
| ------------------- | ----------------- | ------ | ----------- | ------------------------------------------------------------------------------------------------------------- |
| `source`            | `source`          | String | Required    | Source website or traffic origin. If source is not set on the event, Freshpaint falls back to `$current_url`. |
| `trans_id`          | `trans_id`        | String | Required    | Unique transaction or event identifier. If not provided, Freshpaint sends a masked event identifier.          |

{% hint style="warning" %}
If your Freshpaint account is set up in [HIPAA Mode](https://documentation.freshpaint.io/readme/hipaa-mode), the URL will be redacted by default because it may contain PHI. For example, if the URL of the event is `https://example.com/heart-conditions#treatments?user=alice` then Freshpaint will send `https://example.com/url-redacted-by-freshpaint`. To send the complete URL to AdMedia, add the Built-in URL (`$current_url`) property to your HIPAA allowlist.
{% endhint %}

### Recommended Properties

| Freshpaint Property | AdMedia Parameter | Type   | Requirement | Description                                                                                                                                                                                                                                                    |
| ------------------- | ----------------- | ------ | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `$click_id`         | `click_id`        | String | Recommended | Click ID captured from the landing page URL when a visitor arrives via an AdMedia ad. Required for deterministic click-through attribution. Without this value, AdMedia records the conversion but cannot attribute it to a campaign, publisher, or placement. |
| `sale_amt`          | `sale_amt`        | Float  | Recommended | Conversion value in USD.                                                                                                                                                                                                                                       |
| `status`            | `status`          | String | Recommended | Conversion status.                                                                                                                                                                                                                                             |
| `status_detail`     | `status_detail`   | String | Recommended | Additional detail about the conversion status.                                                                                                                                                                                                                 |

***

### Optional Properties

| Freshpaint Property | AdMedia Parameter | Type   | Requirement | Description                                                                                                              |
| ------------------- | ----------------- | ------ | ----------- | ------------------------------------------------------------------------------------------------------------------------ |
| `ct`                | `ct`              | String | Optional    | Conversion type or event type (e.g. `purchase`, `lead`, `signup`).                                                       |
| `$ip`               | `ip`              | String | Optional    | The user's IP address. Blocked entirely in HIPAA Mode unless `$ip` is explicitly added to the Advanced HIPAA Allow List. |


# AppLovin Event API (Early Access)

Send advertising events directly to AppLovin.

{% hint style="warning" %}
The AppLovin Event API destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

{% content-ref url="/pages/TjUydgcqFx7oyT1bqEGk" %}
[AppLovin Event API Quick Start Guide](/integrations/destinations/direct-response-ads/applovin-event-api-early-access/applovin-event-api-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/0zpm0FmiWyskvRxZNIM6" %}
[AppLovin Event API Reference](/integrations/destinations/direct-response-ads/applovin-event-api-early-access/applovin-event-api-reference)
{% endcontent-ref %}


# AppLovin Event API Quick Start Guide

{% hint style="warning" %}
The AppLovin Event API destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Refer to this destination as **AppLovin** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

This guide enables you to fully enable the AppLovin Event API destination for your site. For simplicity the event used for demonstration purposes is the generic `Page View` event. For more complex events see[ our additional documentation](/readme/setting-up-your-events). Additionally this guide assumes you have the Freshpaint snippet installed on your site, if you do not please follow[ this guide](/readme/guides/quickstart/installing-freshpaint).

1. Find/create your **AppLovin** **Events Key** for AppLovin
2. Enable the Freshpaint AppLovin destination
   * If in HIPAA mode enable the required fields
3. Confirm and validate events

### Find your AppLovin Events Key for AppLovin

1. Log into your [AppLovin Ads Manager](https://ads.applovin.com/auth/signin?redirectTo=%2F).
2. Select **Events** in the left-hand menu.
3. Copy the ID at the top of the page.

<figure><img src="/files/7iHoXuSEdxobQiZWixI7" alt="AppLovin UI showing where to find AppLovin Event Key"><figcaption></figcaption></figure>

### Enable the Freshpaint AppLovin destination

1. Navigate to the [Freshpaint Integrations page](https://app.freshpaint.io/destinations/catalog).
2. Search for the **AppLovin** integration.
3. Select **Configure** to paste your **AppLovin** **Event Key** from the above step.
4. Customers that use HIPAA mode should then configure the required, recommended, and recommended view-through properties. You can find all properties that the Freshpaint AppLovin integration supports here: [AppLovin Event API Reference](/integrations/destinations/direct-response-ads/applovin-event-api-early-access/applovin-event-api-reference).
5. Enable AppLovin.

Once you've followed the steps above you can start sending events to the AppLovin Event API.

<figure><img src="/files/MlAsJ8KGITpiGjAQ37wA" alt=""><figcaption></figcaption></figure>

## Confirm and validate events

### Confirm and Validate Events in Freshpaint

1. Navigate to your site and visit a page that should trigger your event
2. Trigger your event (Our demonstration event is a `page_view`).
3. Navigate to the [Event Verification tool](https://app.freshpaint.io/event-verification).
4. Select **AppLovin** and verify your event went through.
   * This can take up to 90 seconds.
5. Verify the event is marked as `OK` or resolve missing property issues.

<figure><img src="/files/ScFay4larf56OXHfQPoZ" alt=""><figcaption></figcaption></figure>

### Confirm and Validate Events in AppLovin

When first setting up your AppLovin account, you will be required to send 1 of each required event before you can view the Event Manager.

You can view the list of required parameters for each of these events types[ in their documentation](https://support.axon.ai/en/growth/promoting-your-websites/axon-pixel-integration/events-and-objects).

<figure><img src="/files/Ay4dgdA2VcXm5M7q6m3Y" alt=""><figcaption></figcaption></figure>

Afterwards, to check whether AppLovin is receiving events:

1. Log into your [AppLovin Ads Manager](https://ads.applovin.com/auth/signin?redirectTo=%2F).
2. Select **Events** in the left-hand menu.
3. You should see events coming through under the large graph under **Event details** on this page.
   1. Successfully sent events will increment the Count and the "Last seen" time. It's usually within a few seconds. They mention at the top of the page it can be up to 2 hours.
4. See that your event has a status of :green\_circle: <mark style="color:$success;">**All Working**</mark>. Click to spot check events.

<figure><img src="/files/gzP5C0kxiocLcSk8P5t0" alt=""><figcaption></figcaption></figure>


# AppLovin Event API Reference

{% hint style="warning" %}
The AppLovin Event API destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Refer to this destination as **AppLovin** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

This is a reference document for the AppLovin destination. For information on how to set up this integration, see the [AppLovin Event API Quick Start Guide](/integrations/destinations/direct-response-ads/applovin-event-api-early-access/applovin-event-api-quick-start-guide).

## Events

When you send an event to the AppLovin Event API destination from Freshpaint, Freshpaint will create an event in the AppLovin event manager by hitting AppLovin's API.

### Event Properties

<table data-full-width="true"><thead><tr><th width="179.2666015625">Freshpaint property</th><th width="191.19317626953125">AppLovin parameter</th><th width="255.7099609375">Type</th><th width="130.4307861328125">Requirement</th><th>Description</th></tr></thead><tbody><tr><td><code>$aleid</code></td><td><code>aleid</code></td><td>string</td><td><mark style="color:$danger;"><strong>Required</strong></mark></td><td>The clickID of the event, from the <code>?aleid</code> query parameter.</td></tr><tr><td><code>applovin_event_name</code></td><td><code>name</code></td><td>string</td><td><mark style="color:$danger;"><strong>Required</strong></mark></td><td><p>The AppLovin event name to track. *See below Events Reference for all values.</p><p>Note: If this property is absent, Freshpaint will attempt to use the name of the Freshpaint event. This will only work if the Freshpaint event name is one of the specific supported AppLovin names, so we recommend sending event name separately.</p></td></tr><tr><td><code>$time</code></td><td><code>event_time</code></td><td>number</td><td><mark style="color:$danger;"><strong>Required</strong></mark></td><td>The current Unix epoch time in milliseconds.<br><br>Freshpaint will autofill this value if missing.</td></tr><tr><td><code>dedupe_id</code></td><td><code>dedupe_id</code></td><td>string</td><td><mark style="color:$danger;"><strong>Required</strong></mark></td><td>Unique identifier for the event, used for deduplication.<br><br>Freshpaint will autofill this value if <code>dedupe_id</code> is not explicitly provided.</td></tr><tr><td><code>event_source_url</code></td><td><code>event_source_url</code></td><td>string</td><td><mark style="color:$danger;"><strong>Required</strong></mark></td><td>The URL where the event occurred, must start with "http://" or "https://".<br><br>Freshpaint will use the Freshpaint SDK's built in <code>$current_url</code> with the full URL redacted if <code>event_source_url</code> is not provided.</td></tr><tr><td><code>$ip</code></td><td><code>client_ip_address</code></td><td>string</td><td><mark style="color:$danger;"><strong>Required</strong></mark></td><td>The IP address of the user from the browser where the event was performed.<br><br>Freshpaint will use the Freshpaint SDK's built in <code>$ip</code> value from the browser event.</td></tr></tbody></table>

### Events Reference

The AppLovin / Axon Event API has a number of specific event types and corresponding values required for each of those event types. You can view the [full list of details in their documentation](https://support.axon.ai/en/growth/promoting-your-websites/axon-pixel-integration/events-and-objects).

**Valid Event Names:**

* add\_to\_cart
* add\_payment\_info
* begin\_checkout
* generate\_lead
* login
* purchase
* page\_view
* remove\_from\_cart
* search
* sign\_up
* subscribe
* view\_cart
* view\_item

**Required event fields**

Many of the events have required fields if that type of event is sent. For example:

1. `items` must be provided for `view_item`, `add_to_cart`, `begin_checkout`, and `remove_from_cart`.
2. `value` must be provided for `begin_checkout` and `purchase`
3. `currency`, `shipping` , `tax` , and `transaction_id` are also required for `purchase` events.
4. `searchTerm` must be provided for `search`

**Example**

An example set of these properties might look like:

```json
{
    "currency": "USD",
    "items": [
        {"item_id": "abc-123", "item_category_id": 111}
    ],
    "value": 1200
}
```

### User Data Properties

When you send events to AppLovin they will attempt to match those actions to a particular user in AppLovin.

{% hint style="warning" %}
Note: although listed as Recommended, **at least one of the following user properties is required by AppLovin:** `client_id`, `axwrt`, and `alart`.
{% endhint %}

<table data-full-width="true"><thead><tr><th width="160.6484375">Freshpaint property</th><th>AppLovin parameter</th><th>Type</th><th>Requirement</th><th>Description</th></tr></thead><tbody><tr><td><code>$device_id</code></td><td><code>client_id</code></td><td>string</td><td><mark style="color:$success;">Recommended*</mark></td><td><p>A stable first-party identifier that should be unique to the user.</p><p>Freshpaint provides this value with from a cookie set by the Freshpaint SDK.</p></td></tr><tr><td><code>axwrt</code></td><td><code>axwrt</code></td><td>string</td><td><mark style="color:$info;">Optional</mark></td><td>A custom value typically set by the Axon native Pixel.<br><br>This is not needed with Freshpaint as long as the $device_id is used, which is provided by default with the Freshpaint SDK.</td></tr><tr><td><code>alart</code></td><td><code>alart</code></td><td>string</td><td><mark style="color:$info;">Optional</mark></td><td>A custom value typically set by the Axon native Pixel.<br><br>This is not needed with Freshpaint as long as the $device_id is used, which is provided by default with the Freshpaint SDK.</td></tr><tr><td><code>$user_agent</code></td><td><code>client_user_agent</code></td><td>string</td><td><mark style="color:$info;">Optional</mark></td><td>The user agent of the browser.</td></tr><tr><td><code>$session_id</code></td><td><code>session_id</code></td><td>string</td><td><mark style="color:$info;">Optional</mark></td><td>The ID of the user session.</td></tr><tr><td><code>esi</code></td><td><code>esi</code></td><td>string</td><td><mark style="color:$info;">Optional</mark></td><td>Source of event. <code>app</code> or <code>web</code>.<br><br>Freshpaint will default this to <code>web</code>.</td></tr><tr><td><code>ifa</code></td><td><code>ifa</code></td><td>string</td><td><mark style="color:$info;">Optional</mark></td><td>The user’s identifier for advertisers. <code>idfa</code> or <code>gaid</code></td></tr><tr><td><code>idfv</code></td><td><code>idfv</code></td><td>string</td><td><mark style="color:$info;">Optional</mark></td><td>The user’s identifier for vendors</td></tr><tr><td><code>os</code></td><td><code>os</code></td><td>string</td><td><mark style="color:$info;">Optional</mark></td><td>The user’s operating system: <code>ios</code>, <code>android</code>, or <code>desktop_os</code>.</td></tr></tbody></table>


# Bing Insights

The Bing Insights destination allows Freshpaint to pull campaign performance data (spend, clicks, conversions) from your Bing ad account to power the Ad Performance and Insights Overview dashboard. This destination provides visibility into how your Bing advertising spend drives appointments and revenue.

{% hint style="info" %}
This destination pulls data *from* Bing—it does not send events to Bing. If you need to send conversion events to Bing, use the Microsoft Ads Conversions API destination instead.
{% endhint %}


# Bing Insights Quick Start Guide

### Prerequisites

Before you begin, ensure you have the following:

1. Microsoft Advertising account with active ad campaigns
2. Add the service principal of Microsoft Advertising API Service to your organization. Use an account with Global Administrator or Cloud App Administrator permissions.&#x20;
3. Developer Token - The person authenticating must have access to a Developer Token in the Microsoft Ads dashboard. Without this, the integration cannot access campaign data.
4. Manager Account ID and Account ID - You'll need both your top-level customer (manager) account ID and the specific ad account ID you want to connect.
5. Active ad campaigns - The integration pulls data from your running or completed campaigns

{% hint style="info" %}
Note for agency-managed accounts: If your Microsoft Ads account is managed by an agency, you may need to coordinate with them to grant appropriate access before authenticating.
{% endhint %}

### Getting Started

1. Get Your Ad Account IDs
   * Navigate to [https://ads.microsoft.com](https://ads.microsoft.com/) and sign in
   * Click on "Settings"
   * Your Account ID can be found under "Account Settings"
   * Your Manager Account ID can be found under "Manager account settings"

2. Get Your Developer Tokens
   * In Microsoft Ads, go to Settings > Developer Settings
   * Copy your Developer Token

3. Create the Bing Insights Destination in Freshpaint
   * In Freshpaint, navigate to your [Destinations page](https://app.freshpaint.io/destinations/catalog?category=overview) and search for Bing Insights
   * Enter your Developer Token, Account ID, and Manager Account ID

4. Click "Connect with Microsoft"

5. Enable Destination
   * Click on the "Enable" button at the top of the configuration settings

### Configuring Attribution Parameters

The Insights Attribution page shows performance for each individual Microsoft Advertising campaign. This breakdown relies on two inputs: campaign spend, which Freshpaint pulls automatically from the Microsoft Advertising API, and a mapping between each ad click and the campaign it came from. Microsoft Advertising does not expose that click-to-campaign mapping through its API, so a tracking template adds the campaign ID to each ad click URL instead.&#x20;

Once the tracking template is live, Freshpaint reads the campaign ID from the `mscid` parameter on each incoming click and attributes the click to that campaign automatically.

#### 1. Open the account-level tracking template

This setup uses a Microsoft Advertising tracking template, which can be set at the account level. In Microsoft Advertising, go to **Campaigns → Settings → Account level options → Tracking template**. Microsoft recommends setting the tracking template at the account level so it applies to every campaign in the account, including campaigns added later.

For Microsoft's full list of tracking parameters, see [Microsoft Advertising: URL tracking with upgraded URLs](https://learn.microsoft.com/en-us/advertising/guides/url-tracking-upgraded-urls).

#### 2. Set the tracking template value

For an account with no existing tracking template, set the value to:

```
{lpurl}?mscid={CampaignID}
```

For an account that already has a tracking template, append the parameter to the end of the current value instead:

```
&mscid={CampaignID}
```

`{lpurl}` is a required Microsoft placeholder for the landing page URL. `{CampaignID}` is a Microsoft Advertising parameter that Microsoft replaces with the campaign's ID each time an ad is clicked. `mscid` is the parameter key Freshpaint reads, so enter it exactly as shown.

{% hint style="warning" %}
**Configure every active campaign.** Freshpaint pulls spend for all campaigns from the Microsoft Advertising API, but a click only maps to a campaign when that campaign's URLs carry `mscid={CampaignID}`. When some campaigns are missing it, their cost per acquisition (CPA) appears inflated, because Freshpaint counts the spend for those campaigns but cannot match their conversions. Setting the tracking template at the account level is the most reliable way to cover every campaign.
{% endhint %}

{% hint style="info" %}
**Data starts at setup - not retroactively.** Campaign breakdown data starts populating only after this setup is complete. Clicks that happened before the parameter was in place are not attributed to a campaign.
{% endhint %}

#### 3. Verify campaign breakdown in Insights

After the tracking template is live and new clicks have arrived, open the **Attribution page** in Insights and expand the Microsoft Advertising (Bing) source.&#x20;

Clicks that Freshpaint cannot match to a campaign appear under an `UNKNOWN` row. A large or growing `UNKNOWN` row could mean one or more campaigns are still missing the `mscid={CampaignID}` parameter.

{% hint style="success" %}
**Success:** Individual campaign names appear in the campaign breakdown, and the `UNKNOWN` row stays small relative to total volume.
{% endhint %}

### Best Practices & Reminders

**Set the tracking template at the account level**

Adding `fp_insights_cid={CampaignID}` once at the account level covers every current campaign and any campaign created later. Reserve per-campaign overrides for campaigns that genuinely need different URL options.

**Monitor the `UNKNOWN` row**

Check the `UNKNOWN` campaign row in the campaign breakdown periodically. Growth in that row usually means a new campaign shipped without the parameter. Add the parameter to that campaign to restore accurate attribution going forward.

**No Retroactive Data**

Campaign breakdown reflects clicks captured after setup only. Note the date the parameter went live so campaign-level numbers are read in the correct time context.

**Coordinate with the agency for managed accounts**

For agency-managed Microsoft Advertising accounts, have the agency add the parameter to the account URL options, since that team controls campaign configuration.

### What's Next?

* **Configure other ad platforms** — Freshpaint uses the same campaign-ID pattern across ad platforms. Set up the [Google Ads campaign ID parameter](https://documentation.freshpaint.io/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversion-api-quick-start-guide#add-the-campaign-id-to-your-final-url-suffix) and the [Meta Insights URL parameters](https://documentation.freshpaint.io/integrations/destinations/direct-response-ads/meta-insights/meta-insights-quick-start-guide#required-url-parameters) to enable campaign breakdown for those platforms.
* **Review campaign performance in Insights** — Open Bing Insights, select **Group By Campaigns**, and compare spend and conversions across campaigns to guide budget decisions.
* **Monitor attribution health** — Keep the `UNKNOWN` campaign row small by confirming every new campaign inherits the `fp_insights_cid={CampaignID}` parameter.


# Everflow (Early Access)

Send conversion events directly to Everflow.

{% hint style="warning" %}
The Everflow destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

{% content-ref url="/pages/qxIxfI4rh1QXO4XSoe04" %}
[Everflow Quick Start Guide](/integrations/destinations/direct-response-ads/everflow-early-access/everflow-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/hRR8KqRZH3FQrOx49V5M" %}
[Everflow Reference](/integrations/destinations/direct-response-ads/everflow-early-access/everflow-reference)
{% endcontent-ref %}


# Everflow Quick Start Guide

Send conversion events directly to Everflow.

{% hint style="warning" %}
The Everflow destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Everflow** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Tag IDs, you can choose a specific one by suffixing the Advertiser ID, such as: **Everflow::1.** You can retrieve this value from the Everflow configuration page.
* Connection Modes:

<table><thead><tr><th align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

This guide enables you to fully enable the Everflow destination for your site. This guide assumes you have the Freshpaint snippet installed on your site — if you do not, please follow [this guide](https://documentation.freshpaint.io/readme/guides/quickstart/installing-freshpaint).

### Locate the Network ID, Advertiser ID and Tracking Domain in Everflow

1. Log in to the Everflow platform.
2. Copy the Network ID - this is the unique identifier for the Everflow network account.
3. Copy the Advertiser ID.
4. Navigate to the tracking domain settings and copy the Tracking Domain URL.

### Enable the Freshpaint Everflow destination <a href="#enable-the-freshpaint-snapchat-destination" id="enable-the-freshpaint-snapchat-destination"></a>

1. Navigate to the [Freshpaint Destinations page](https://app.freshpaint.io/destinations/catalog).
2. Search for the **Everflow** destination.
3. Select **Configure** to paste your Network ID, Advertiser ID and tracking domain from the above steps.
4. Customers that use HIPAA mode should then configure the required, recommended, and recommended view-through properties. You can find [all properties that the Freshpaint Everflow integration supports here](/integrations/destinations/direct-response-ads/everflow-early-access/everflow-reference).
5. Enable Everflow.

Once you've followed the steps above you can start sending events to Everflow.

### If you are a HIPAA account, you will need to add event properties to the allowlist. If you are not a HIPAA account, you can skip this step.

1. Go to the Everflow configuration page in Freshpaint.
2. Click "Configure" next to "Recommended Properties".
3. If you're using the Freshpaint/Everflow integration for ad attribution purposes, we recommend you send the `$ef_transaction_id` property. This property is required in order to see ad attribution data in Everflow. You can do so by checking the `$ef_transaction_id` box in the popup.
4. If you want to track attribution tied to coupon codes, you'll need to send the `coupon` property. Similarly, you should send `value` to track the revenue partners generate.

<figure><img src="/files/qWd1FLLm5fODXPoMEeMi" alt="Freshpaint Everflow destination showing Required Properties"><figcaption></figcaption></figure>

Once you've followed these steps, you're ready to start sending events to Everflow!

## **Confirm and Validate Events**

### **Confirm and Validate Conversions in Freshpaint**

1. Navigate to your site and visit a page that should trigger your event.
2. Trigger your event.
3. Navigate to the [Event Verification tool](https://app.freshpaint.io/event-verification).
4. Select **Everflow** and verify your event went through.
   * This can take up to 90 seconds.
5. Verify the event is marked as `OK` or resolve any missing property issues.

<figure><img src="/files/I55U7lMMA6KaCbuX6ogl" alt="Freshpaint test event showing OK status"><figcaption></figcaption></figure>


# Everflow Reference

Send conversion events directly to Everflow.

{% hint style="warning" %}
The Everflow destination is currently in Early Access. Please contact <support@freshpaint.io> for more information about this integration.
{% endhint %}

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Everflow** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Tag IDs, you can choose a specific one by suffixing the Network ID, such as: **Everflow::1234123456.** You can retrieve this value from the Everflow configuration page for the Network ID of interest.
* Connection Modes:

<table><thead><tr><th align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

This is a reference document for the Everflow destination. For information on how to set up this integration, see the [Everflow Quick Start Guide](/integrations/destinations/direct-response-ads/everflow-early-access/everflow-quick-start-guide).

## Events

### Required Properties

| Freshpaint Property  | Everflow Parameter | Type   | Requirement                                                    | Description                                                                                                                                                                                           |
| -------------------- | ------------------ | ------ | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `$ef_transaction_id` | `transaction_id`   | string | At least one of `$ef_transaction_id` and `coupon` is required. | The Everflow transaction ID (click ID) captured automatically from the landing page URL or through the Everflow transaction ID cookie. Required for click-through attribution.                        |
| `coupon`             | `coupon_code`      | string | At least one of `$ef_transaction_id` and `coupon` is required. | The coupon code tied to the partner. We do not automatically capture this value like how we capture the transaction ID. The coupon code should be sent within a track event when the order is placed. |
| `$ip`                | `user_ip`          | string | Recommended                                                    | The IP of the user.                                                                                                                                                                                   |
| `$user_agent`        | `user_agent`       | string | Recommended                                                    | The user agent of the user.                                                                                                                                                                           |

## Troubleshooting

**Conversion events not showing up in Everflow**: For an event to show up as a conversion event it must have a `$ef_transaction_id` or `coupon` property. You can validate that events going to Everflow have at least one of these properties using the [Freshpaint Liveview](https://documentation.freshpaint.io/events/liveview).

**Events show "Missing Required Property" in Event Verification**: The `$ef_transaction_id` and `coupon` properties were absent when the event was processed. If it's occurring on events that should have the transaction ID, check that the Freshpaint snippet is installed on the landing page and that `$ef_transaction_id` isn't being stripped by redirects or link-shorteners before the visitor lands.

**The Tracking Domain URL is rejected during configuration**: The Tracking Domain must begin with `http://` or `https://`. Bare domains without a scheme (e.g. `tracking.example.com`) are not accepted.


# Facebook Conversions API

The Facebook Conversions API allows advertisers to send events directly to Facebook via a server-side connection.

Server-side events are sent to Facebook via the Facebook Conversions API (formerly known as Facebook Server-Side API). The Facebook Conversions API enables you to measure events that may not happen in the browser, improve accuracy by tracking events both in the browser and on the server, and more.

{% content-ref url="/pages/u9E5DYpvFdZa1ilDOslU" %}
[Facebook Conversions API Quick Start Guide](/integrations/destinations/direct-response-ads/facebook-conversions-api/facebook-conversions-api-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/OLNHBEf4SjkJxvTPSIia" %}
[Facebook Conversions API Reference](/integrations/destinations/direct-response-ads/facebook-conversions-api/facebook-conversions-api-reference)
{% endcontent-ref %}


# Facebook Conversions API Quick Start Guide

The Facebook Conversions API allows advertisers to send events directly to Facebook via a server-side connection.

Server-side events are sent to Facebook via the Facebook Conversions API (formerly known as Facebook Server-Side API). The Facebook Conversions API enables you to measure events that may not happen in the browser, improve accuracy by tracking events both in the browser and on the server, and more.

## Destination Info

* Accepts [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Facebook Conversions API** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Pixel IDs, you can choose a specific one by suffixing the Pixel ID, such as: **Facebook Conversions API::0123456789012345.** You can retrieve this value from the Facebook Conversions API configuration page for the Pixel ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Pixel IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What You'll Need

1. Your Facebook Pixel ID and Access Token
2. Conversion events configured in your Freshpaint account
3. The [Freshpaint Autotrack script tag](https://app.freshpaint.io/sources) installed on your site

### To set up the Facebook Conversions API with Freshpaint, first follow these steps:

1. Go to the Facebook Conversions API [configuration page](https://app.freshpaint.io/destinations/apps/facebook-conversions-api) in Freshpaint and click "Configure".
2. In Facebook, go to Events Manager > Data Sources and find your Pixel ID and copy this value into your Freshpaint Facebook Conversions API destination:

   <figure><img src="/files/04ZttJjdLItcpdZhqwsh" alt=""><figcaption></figcaption></figure>
3. To use the Facebook Conversions API, you'll need to generate an access token. Copy this value into your Freshpaint Facebook Conversions API destination:

   <figure><img src="/files/xQbmlePWAvHHrsPyqIqT" alt=""><figcaption></figcaption></figure>

You have successfully set up the Facebook Conversions API destination in Freshpaint!

{% hint style="info" %}
If you are using this integration to map Freshpaint events to Facebook Standard Events, see the Reference Guide [here](/integrations/destinations/direct-response-ads/facebook-conversions-api/facebook-conversions-api-reference#standard-facebook-events) for more details.
{% endhint %}

{% hint style="warning" %}
Healthcare companies may be restricted from using lower-funnel Standard Events due to recent Meta changes. We recommend using custom events with generic naming (e.g., "Event1", "Event2"). See the [Custom Events](https://documentation.freshpaint.io/integrations/destinations/direct-response-ads/facebook-conversions-api/facebook-conversions-api-reference#custom-facebook-events) section for details.
{% endhint %}

### If you are a HIPAA account, you will need to add event properties to the allowlist. If you are not a HIPAA account, you can skip this step.

1. Go to the Facebook Conversions API [configuration page](https://app.freshpaint.io/destinations/apps/facebook-conversions-api) in Freshpaint.
2. You should see a message indicating that required properties are not allowed. Click "Configure" next to "Required Properties".

   <figure><img src="/files/fv6DilID16BzdptWOKAQ" alt=""><figcaption><p>Configuring required properties for Facebook Conversions API</p></figcaption></figure>
3. Facebook requires that you send the User Agent from the browser where the event was performed for each event. After your organization's legal/compliance team approves this, check the box next to "User Agent" and click "Confirm".

   <figure><img src="/files/tCZlVNOhRZqdTv3F6mZa" alt=""><figcaption></figcaption></figure>
4. Returning to the Facebook Conversions API configuration page, click "Configure" next to "Recommended Properties".

   <figure><img src="/files/9Q76pidpz3XEZzWAQy3X" alt=""><figcaption></figcaption></figure>
5. Freshpaint recommends sending the following additional properties to facebook. After your organization's legal/compliance team approves this, check the box next to "$fbclid", and the box next to "action\_source", and click "Confirm".\
   \
   $fbclid: When a user clicks on your ad on Facebook, the url sometimes includes a fbclid query parameter. Freshpaint captures this click ID from the url and sends the value as the Facebook Ad Click ID to help improve ad matching scores.

<figure><img src="/files/HPJvN38bV3zzh22qucOG" alt="Allow Freshpaint to send the facebook click id, action source, facebook browser id, and facebook event name to Facebook"><figcaption><p>Allow Freshpaint to send the facebook click id, action source, facebook browser id, and facebook event name to Facebook</p></figcaption></figure>

1. You've now allowed all the basic properties for Facebook Conversions API. Your destination should now look like this:

<figure><img src="/files/0vPwrh0ZxeaqXbsvUD0N" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
With HIPAA Mode enabled, the url value will be redacted by default because it may contain PHI. For example, if the URL of the event is <https://example.com/heart-conditions#treatments?user=alice> then Freshpaint will send <https://example.com/url-redacted-by-freshpaint>
{% endhint %}

{% hint style="warning" %}
If you add the Built-in `Url` to your allowlist, the url will not be redacted.
{% endhint %}

### That's it! Now all you need to do to send an event to Facebook Conversions API is enable the destination on your Freshpaint event definitions:

<figure><img src="https://lh4.googleusercontent.com/hkG__M8jlIOmYQ5I3jhwdFOE3euhY9YZfSz9D-Ai23EkqndadpjW57IrLXVj6vTIqx1HBrLsKl56xhSiVDvxrub7CLswSfOASDF8RtgZDWtg6NefHch5NrO_1PZ9zDqzEFfZh2pMQM3KljdTWZPn-5TC6g=s2048" alt=""><figcaption></figcaption></figure>

Navigate to your Freshpaint event, and toggle the destination on to enable the event to be sent to the Facebook destination.

If you've configured multiple Facebook pixels, you'll need to toggle each pixel individually for each Freshpaint event.

<figure><img src="/files/Qk5vQ6sZGzZJyyGwKjwE" alt=""><figcaption></figcaption></figure>

If you're using Google Tag Manager to send data to Facebook, and you have multiple pixel IDs enabled, you'll need to specify which pixel ID(s) you'd like to enable the event for in the event tag.

<figure><img src="/files/H2nCoGFru2mrwoXH5LoA" alt=""><figcaption></figcaption></figure>

### Confirm and validate conversions in Events Manager

To make sure that Freshpaint is connected to your Facebook Pixel, navigate to your Events Manager.

<figure><img src="https://lh3.googleusercontent.com/cjCqdnPHUsG4G1z4TZ3PrYjDLfMYhJ7-gl6s2wW7oyqgiCBfn4cwbyzY-kA0K1IT91SvcCTul8uNfuqtM5V5jI1OFqqKtFUFQnUsqfiB0zxoSt1urzyANijfV6s-QEyONkYUqABjjn5JBZ1yIwiJXxUfEw=s2048" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Events may take a few minutes to appear in your Facebook Events manager overview.
{% endhint %}


# Facebook Conversions API Reference

## Destination Info

* Accepts [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Facebook Conversions API** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Pixel IDs, you can choose a specific one by suffixing the Pixel ID, such as: **Facebook Conversions API::0123456789012345.** You can retrieve this value from the Facebook Conversions API configuration page for the Pixel ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Pixel IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

This is a reference document for the Facebook Conversions API destination. For information on how to set up this integration, see the[ Quick Start guide](/integrations/destinations/direct-response-ads/facebook-conversions-api/facebook-conversions-api-reference).

## Events

When you send an event to Facebook from Freshpaint, Freshpaint will create an event in Facebook by hitting Facebook's [event API](https://developers.facebook.com/docs/graph-api) endpoint at:[ ](https://graph.facebook.com/%7BAPI_VERSION%7D/%7BPIXEL_ID%7D/events?access_token={TOKEN})[https://graph.facebook.com/{API\_VERSION}/{PIXEL\_ID}/events?access\_token={TOKEN}](https://graph.facebook.com/%7BAPI_VERSION%7D/%7BPIXEL_ID%7D/events?access_token={TOKEN})[.](https://graph.facebook.com/%7BAPI_VERSION%7D/%7BPIXEL_ID%7D/events?access_token={TOKEN})

### Standard Facebook Events

See below for a complete list of Facebook standard events, the Freshpaint event definitions they are mapped to, and the available properties that can be sent in with each event. All properties are optional unless otherwise noted as "Required".

| Facebook Event         | Freshpaint Event Definition | Available Facebook Properties                                                                                                                                                                                                  |
| ---------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `AddToCart`            | AddToCart                   | `content_ids`, `content_name`, `content_type`, `contents`, `currency`, `value`                                                                                                                                                 |
|                        | product added               |                                                                                                                                                                                                                                |
|                        | added product               |                                                                                                                                                                                                                                |
| `AddToWishlist`        | AddToWishlist               | `content_name`, `content_category`, `content_ids`, `contents`, `currency`, `value`                                                                                                                                             |
| `AddPaymentInfo`       | AddPaymentInfo              | `content_category`, `content_ids`, `contents`, `currency`, `value`                                                                                                                                                             |
| `CustomizeProduct`     | CustomizeProduct            | \`\`                                                                                                                                                                                                                           |
| `Contact`              | Contact                     |                                                                                                                                                                                                                                |
| `CompleteRegistration` | CompleteRegistration        | `content_name`, `currency`, `status`, `value`                                                                                                                                                                                  |
| `Donate`               | Donate                      |                                                                                                                                                                                                                                |
| `InitiateCheckout`     | InitiateCheckout            | `content_category`, `content_ids`, `contents`, `currency`, `num_items`, `value`                                                                                                                                                |
|                        | checkout started            |                                                                                                                                                                                                                                |
|                        | started checkout            |                                                                                                                                                                                                                                |
| `Lead`                 | Lead                        | `content_category`, `content_name`, `currency`, `value`                                                                                                                                                                        |
| `Purchase`             | Purchase                    | <p><strong>Required</strong>: <code>value, currency</code><br><strong>Optional:</strong> <code>content\_ids</code>, <code>content\_name</code>, <code>content\_type</code>, <code>contents</code>, <code>num\_items</code></p> |
|                        |                             |                                                                                                                                                                                                                                |
| `Schedule`             | Schedule                    |                                                                                                                                                                                                                                |
| `Search`               | Search                      | `content_category`, `content_ids`, `contents`, `currency`, `search_string`, `value`                                                                                                                                            |
|                        | products searched           |                                                                                                                                                                                                                                |
|                        | searched products           |                                                                                                                                                                                                                                |
| `StartTrial`           | StartTrial                  | `value, currency, predicted_ltv`                                                                                                                                                                                               |
| `SubmitApplication`    | SubmitApplication           |                                                                                                                                                                                                                                |
| `Subscribe`            | Subscribe                   | `value, currency, predicted_ltv`                                                                                                                                                                                               |
| `ViewContent`          | ViewContent                 | `content_ids`, `content_category`, `content_name`, `content_type`, `contents`, `currency`, `value`                                                                                                                             |
|                        | product list viewed         |                                                                                                                                                                                                                                |
|                        | viewed product list         |                                                                                                                                                                                                                                |
|                        | product category viewed     |                                                                                                                                                                                                                                |
|                        | viewed product category     |                                                                                                                                                                                                                                |
|                        | product viewed              |                                                                                                                                                                                                                                |
|                        | viewed product              |                                                                                                                                                                                                                                |

{% hint style="info" %}
Facebook Events are case-sensitive
{% endhint %}

Any of the space-delimited names above are case-insensitive and may be alternatively delimited by an underscore or no separation. For example, "product added" can also be expressed as:

* Product\_added
* productAdded

These non-Facebook-specific names can be useful when sending to multiple destinations, such as **Facebook Conversion API** and **TikTok Ads**, without requiring a Rename Transformation for one or both destinations.

### Custom Facebook Events

{% hint style="warning" %}
Due to recent Meta changes, healthcare companies may be restricted from using lower-funnel Standard Events such as "Schedule" or "Add to Cart". Freshpaint recommends sending custom events with generic naming that excludes any health information.
{% endhint %}

#### Steps

1. Create an event in Freshpaint or GTM, using the Freshpaint template.
2. Use a generic name, excluding health context (ex: Event1). You can also do this by adding a Rename Transformation in Freshpaint.

<figure><img src="/files/rEjZaNp7qL2CRCwuod7c" alt=""><figcaption></figcaption></figure>

3. Accept the custom event(s) in Events Manager > Overview. After creating custom events, you'll need to review and confirm them in [Meta Events Manager](https://www.facebook.com/business/help/642275438032995). Review and select events.
4. These events should now show up in your Data Sources view.

### Required Server Event Parameters

Parameters are JSON-formatted objects that you can include when tracking standard and custom events. They allow you to provide additional information about your users and their actions.

#### Event Source URL

{% hint style="warning" %}
If your Freshpaint account is set up in [HIPAA Mode](/readme/hipaa-mode), the URL will be redacted by default because it may contain PHI. For example, if the URL of the event is `https://example.com/heart-conditions#treatments?user=alice` then Freshpaint will send `https://example.com/url-redacted-by-freshpaint`. To send the complete URL to facebook, add the Built-in `URL` (`$current_url) property` to your HIPAA allowlist.
{% endhint %}

#### Action Source

{% hint style="warning" %}
Facebook requires every event sent to the Conversions API to have an `action_source` parameter describing where the event came from. If `action_source` is "website" (the default value), then the Built-in User Agent`($user_agent) / user_agent` is required to be Allowlisted, if in HIPAA mode. The URL must also be sent in some form - as noted above, Freshpaint will always send a value for URL. These correspond to the `client_user_agent` and `event_source_url` properties described in [facebook's documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/best-practices/#req-rec-params).
{% endhint %}

`action_source` is set to "website" by default for server-side events. `action_source` should be included under `properties` on track events.

| Action source value | Description                                                                                                                                                                                               |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `website`           | Conversion was made on your website.                                                                                                                                                                      |
| `app`               | Conversion was made on an application(Android, iOS, Windows). See Facebook conversions app data [documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/app-data/). |
| `email`             | Conversion happened over email.                                                                                                                                                                           |
| `phone_call`        | Conversion was made over the phone.                                                                                                                                                                       |
| `chat`              | Conversion was made via a messaging app, SMS, or online messaging feature.                                                                                                                                |
| `physical_store`    | Conversion was made in person at your physical store.                                                                                                                                                     |
| `system_generated`  | Conversion happened automatically, for example, a subscription renewal that’s set on auto-pay each month.                                                                                                 |
| `other`             | Conversion happened in a way that is not listed.                                                                                                                                                          |

#### Client User Agent

`client_user_agent` is automatically set from the built-in `$user_agent` property, or by including the `user_agent` property on track events. The value should be the user agent of the browser where the event occurred.

####

### Additional Parameters

When you send user actions to Facebook, Facebook will attempt to match those actions to a particular Facebook user. In most cases, you'll want to send additional user traits and [Facebook parameters](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc) to improve the number of the events that are matched to a Facebook user. See [Facebook's documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters) on all of the parameters that Facebook Conversions API accepts. The Freshpaint integration also supports the values seen in [conversion app data parameters](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/app-data/).

#### User Traits

User traits you can include as event properties to improve match rate include:

* `email`
* `phone`
* `last_name`
* `first_name`
* `ip_address`(is automatically set from built-in `$ip` property, or from `ip_address` property)
* `user_agent`
* `state`
* `city`
* `zip`
* `country`
* `dob`
* `gender`

Facebook requires the following [customer info parameters](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters/) to be hashed:

* `email`
* `phone`
* `last_name`
* `first_name`
* `state`
* `city`
* `zip`
* `country`
* `dob`
* `gender`

Freshpaint will automatically hash the values sent with any of these properties when sending them to Facebook.

Read [Facebook's documentation](https://www.facebook.com/business/help/765081237991954) on how match quality for events helps deliver ads to people who are more likely to take the action you care about, and attribute those actions back to your ads.

#### Facebook's fbp and fbc Parameters

{% hint style="warning" %}
You should ensure the`fbc`parameter, at minimum, is sent whenever possible.
{% endhint %}

The `fbc` parameter is automatically derived and sent by Freshpaint when the `fbclid` query parameter is available (captured by Freshpaint as `$fbclid`). If in HIPAA mode, you must have the Recommended property `$fbclid` Allowlisted for this to work. You may explicitly send `fbc` if desired, in which case it will be sent, overriding the `$fbclid`-derived value if any (provided that it's Allowlisted, if in HIPAA mode).

The `fbp` parameter is automatically generated and sent by Freshpaint. This generated value can be overridden if you send the value with the event (Allowlisting applies here in HIPAA mode). See [Facebook's documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc) for more information.

## Configuration Options

### Transformations

#### Converting Freshpaint Events Into Facebook Standard Events

Freshpaint events can be converted into one of Facebook's [standard events](https://developers.facebook.com/docs/meta-pixel/reference#standard-events). A popular use case would be to convert an existing conversion event into Facebook's Purchase event. The Conversions API creates a connection between your first-party customer data and the Meta systems that optimize ad targeting and help measure the results of your advertising efforts.

In the example below, we are going to transform an existing "Test Event" into one of Facebook's standard Purchase events.

To get started, create a new [Transformation](https://app.freshpaint.io/transformations/new) and select [Standard Event](https://app.freshpaint.io/transformations/new/standard-event). Next, select the existing Freshpaint event you want to transform and the destination you want to send it to:

<figure><img src="/files/4uGlBb9MftkDxTr0zQJ9" alt=""><figcaption></figcaption></figure>

Then, select the "Purchase" event from the list of standard mappings and click "Save" to go to the following step:

<figure><img src="/files/0fFnPyD5zuIwrD2iuW0F" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Some of Facebook's [standard events](https://developers.facebook.com/docs/meta-pixel/reference#standard-events) requires a certain set of properties.
{% endhint %}

In the case of the Purchase event, your existing Freshpaint event will need the following event properties:

* `value` (amount of the conversion)
* `currency` (USD, CAD, etc)

In the case of the InitiateCheckout event, your existing Freshpaint event will also need the following event property:

* num\_items (number of items)

For this transformation, you'll see that the event will be sent to Facebook named as "Purchase" while converting the `value` property type into a number and sending the `currency` property value in all uppercase characters as required by Facebook.

<figure><img src="/files/7q6UHGlASypLjFDsHirn" alt=""><figcaption></figcaption></figure>

If a `currency` property isn't sent with your conversion event and all of your conversions are in a single currency type such as USD, you can add a new transformation rule to send `USD` as a constant property for your conversion event:

<img src="/files/zhNppYIAhCrdCCEw0vJI" alt="" data-size="original">

As new instances of "Test Event" occur, the transformation would then send them to the Facebook Conversions API destination as standard Purchase events.

If a `currency` property isn't sent with your conversion event and all of your conversions are in a single currency type such as USD, you can add a new transformation rule to send `USD` as a constant property for your conversion event:

<img src="/files/zhNppYIAhCrdCCEw0vJI" alt="" data-size="original">

As new instances of "Test Event" occur, the transformation would then send them to the Facebook Conversions API destination as standard Purchase events.

Finally, visit your [Facebook Events Manager account](https://business.facebook.com/events_manager2/list) and navigate to the Overview tab and confirm the Purchase event is in the list:

<figure><img src="/files/t9ay94utu5p2qgNGbKBP" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Note: events may take a few minutes to populate in this view.
{% endhint %}

## Options for Configuring Facebook Destinations

There are a few different ways to implement conversion tracking with Freshpaint's Facebook Conversions API integration. You can use it to complement tracking with your [Facebook Pixel](/integrations/destinations/apps/facebook-pixel), or you can use it as a standalone integration. The option that's best for you depends on your specific goals with the Facebook Conversions API.

{% hint style="info" %}
If you are a HIPAA customer, you should use only Facebook Conversions API
{% endhint %}

### Use Only Facebook Conversions API

This approach is best if you don't want to load the Facebook Pixel on your site, or if you want more control over what gets sent to Facebook.

{% hint style="info" %}
HIPAA customers should use this approach to remain HIPAA complaint
{% endhint %}

#### Matching

When you send user actions to Facebook, Facebook will attempt to match those actions to a particular Facebook user. When using just the Facebook Conversions API without including many properties normally collected in the browser, the match rate will likely be lower than if they were included.

The match rate can be improved by including [additional parameters](#additional-parameters).

#### Deduplication

In this approach, events are only sent from the server, so no deduplication is necessary.

## Validation

To validate that your events are making it to Facebook, you can use Facebook's `test_event_code` property. To set up a test event code, see: <https://www.facebook.com/business/help/1624255387706033?id=818859032317965>.

<figure><img src="/files/2DcBoh71N0jOSYxs43GG" alt=""><figcaption></figcaption></figure>

Then, you can send the test event code from your browser console like so:

* `freshpaint.track("Test Event", {test_event_code: 'TEST60659'})` OR
* `freshpaint.addEventProperties({test_event_code: 'TEST60659'})`

## View-Through Conversions and Retargeting

View-through conversions and retargeting are possible for a user when the [user traits provided](https://documentation.freshpaint.io/integrations/destinations/advertising-destinations/facebook-conversions-api/facebook-conversions-api-reference#additional-parameters), such as email or IP address, match a user in Facebook.

If user traits are not provided, then view-through conversions and retargeting are not possible.


# Google Ads Conversion API

{% hint style="info" %}
The Google Ads Conversion API requires setting up new Conversion Actions within Google Ads. If you want to re-use your existing Google Ads configuration, take a look at the [server-side mode of the Google Ads destination](https://documentation.freshpaint.io/integrations/destinations/advertising-destinations/google-ads/google-ads-reference#server-side).
{% endhint %}

{% hint style="info" %}
For [Insights](https://documentation.freshpaint.io/admin-panel/insights): You must enable the Google Ads API in your Google Cloud account before Freshpaint can pull spend and campaign data. If you don't have a Google Cloud account set up, you'll need to create one and enable the API. Contact your Google Ads administrator or IT team if you need assistance.
{% endhint %}

Optimize your Google Ads spend by attributing ad clicks to conversion and other key behaviors.

{% content-ref url="/pages/Fk257Ri7xpzniwL396cO" %}
[Google Ads Conversion API Quick Start Guide](/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversion-api-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/eaBrwXFi2W4sXqt112cS" %}
[Google Ads Conversions API Reference](/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversions-api-reference)
{% endcontent-ref %}


# Google Ads Conversion API Quick Start Guide

{% hint style="info" %}
The Google Ads Conversion API requires setting up new Conversion Actions within Google Ads. If you want to re-use your existing Google Ads configuration, take a look at the [Google Ads Proxy Destination](/integrations/destinations/direct-response-ads/google-ads).
{% endhint %}

{% hint style="info" %}
For [Insights](https://documentation.freshpaint.io/admin-panel/insights): You must enable the Google Ads API in your Google Cloud account before Freshpaint can pull spend and campaign data. If you don't have a Google Cloud account set up, you'll need to create one and enable the API. Contact your Google Ads administrator or IT team if you need assistance.
{% endhint %}

Optimize your Google Ads spend by attributing ad clicks to conversion and other key behaviors.

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Refer to this destination as **Google Ads Conversion API** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

### What You'll Need

1. Your Google Ads Customer ID
2. [Conversion Actions](https://support.google.com/google-ads/answer/12216226?hl=en) configured in your Google Ads account
3. Conversion Events configured in your Freshpaint account

### To set up Google Ads Conversions API with Freshpaint, first follow these steps:

1. Find your customer-id in your [Google Ads account](https://ads.google.com/aw/overview). The Customer ID will be shown when logged into your Google Ads account above you email address. It should look similar to 123-123-1234.\
   ![](/files/7vzEnMm46vaI4lmDCZOG)
2. Go to the [Google Ads Conversion API configuration page](https://app.freshpaint.io/destinations/apps/google-ads-conversion-api) in Freshpaint.
3. Configure the Customer ID within Freshpaint.\
   ![](/files/Z266EkKc1e9GUlJwx4Ew)
4. Use the `Connect with Google Ads` button to grant Freshpaint access to your Google Ads account.\
   ![](/files/MXQd3oGajL3fIJS9wQ2d)
5. Select `User Account` and then click `Connect with Google CM360` as the method to connect Freshpaint to Google Ads
6. Select the user you want Freshpaint to use when sending events to Google Ads. This user requires `Admin` access level within Google Ads.\
   ![](/files/RphMEkJ5fThZD1GpdFP0)
7. Grant access to Freshpaint by selecting `Continue`.\
   ![](/files/QakLbWAdS28zDmwYfMmU)
8. The [Google Ads Conversion API configuration page](https://app.freshpaint.io/destinations/apps/google-ads-conversion-api) should now show the Access Permission as connected.\
   ![](/files/0DSdw19cMVUw65DwkpoI)

### Next, you'll need to setup Conversion Actions in Google Ads

When using the conversion API to send conversions to Google Ads, you will need to create new `import` conversion actions.

1. In your Google Ads account go to `Goals > Summary`. Scroll down and click on the `+ Create Conversion Action` button to create a new conversion action.

<div align="left"><figure><img src="/files/hYn0WHjWlJssg7VfRJKB" alt="" width="375"><figcaption></figcaption></figure></div>

2. Select `Import`\
   ![](/files/iQayMVGJuIP0lwZJ9zHI)
3. Select `CRMs, files, or other data sources` and `Track conversions from clicks`, and then `Continue` to the next page.\
   ![](/files/Y867y7OG6rdFz6CiAa9R)
4. In the `Data source` section, select `Skip this step and set up a data source later`.![](/files/yZELC4A0BxojIFay1fB8)
5. Configure your conversion action within Google Ads. This configuration is the same as any other action in Google Ads. Choose any conversion goal that makes sense for your organization.

<div align="left"><figure><img src="/files/fAr1a7aXN5IK7B4pZLi3" alt="" width="375"><figcaption></figcaption></figure></div>

7. Click `Add` and then `Save and continue`.
8. On the next page, scroll down, skip the section on setting up data sources, and click `Done` .

<div align="left"><figure><img src="/files/3kNv3n4IkhD925jUlffU" alt="" width="375"><figcaption></figcaption></figure></div>

### Finally, link your Freshpaint Event to your Google Ads Action

1. In your Freshpaint account, click on `Transformations` in the sidebar navigation.

<div align="left"><figure><img src="/files/8pqKRT1QhUkBxd4rX3hk" alt="" width="375"><figcaption></figcaption></figure></div>

2. Click on the `Create new` button to create a new transformation.

<div align="left"><figure><img src="/files/unpHBU82EmBZYoprFPz4" alt="" width="375"><figcaption></figcaption></figure></div>

3. Select `Modify Data` transformation type.

<div align="left"><figure><img src="/files/0oYqVECG6MpP89BDXzh8" alt="" width="375"><figcaption></figcaption></figure></div>

4. Select the Freshpaint event you want to send as the conversion. Then select `Google Ads Conversion API` for the destination. Finally, click `Save & Add Transformations`.

<div align="left"><figure><img src="/files/sW0pKU5nOm4LoiQMYZGO" alt="" width="375"><figcaption></figcaption></figure></div>

5. On the next page, select `Send Constant Property` in the `Add new transformation` dropdown options.

<div align="left"><figure><img src="/files/az0yluFvRZFHpx7cMld0" alt="" width="375"><figcaption></figcaption></figure></div>

6. Fill in `ctname` for `Property Name` . `Property Value` should be the Google Ads Conversion Name of the conversion you created in the previous section. Select `Text` for `Constant Type`.

<div align="left"><figure><img src="/files/6tTNB9ApPdkClnyz4hX9" alt="" width="375"><figcaption></figcaption></figure></div>

7. Click "Save" to save the transformation for the event. You've now linked your Freshpaint event to your Google Ads Conversion Action.<br>

<div align="left"><figure><img src="/files/xvnMo5uX1R36ddRdnXw3" alt="" width="375"><figcaption></figcaption></figure></div>

{% hint style="info" %}
Conversions may take up to 24 hours to appear in your Google Ads Conversion Goals.
{% endhint %}

### Required Properties

{% hint style="info" %}
The following event properties are **required** in order to attribute events to specific ads.
{% endhint %}

<table data-header-hidden data-full-width="true"><thead><tr><th width="165"></th><th width="164"></th><th width="103"></th><th></th></tr></thead><tbody><tr><td><strong>Freshpaint property</strong></td><td><strong>Google Ads parameter</strong></td><td><strong>Type</strong></td><td><strong>Description</strong></td></tr><tr><td><code>$gclid</code> or <code>$gbraid</code> or <code>$wbraid</code></td><td><code>gclid</code> or <code>wbraid</code> or <code>gbraid</code></td><td>string</td><td>gclid (Google Click ID) is generated at ad click time and appended to the landing page URL. <strong>Freshpaint will automatically capture gclid for events from your website</strong>. If you wish, you may provide <code>$gclid</code> as an event property to override the automatically captured value. <code>wbraid</code> or <code>gbraid</code> can be used instead of <code>gclid</code>.</td></tr><tr><td><code>ctname or ctid</code></td><td><code>ctid</code></td><td>string</td><td>The Conversion Name or Conversion Id of the conversion action in Google Ads. When using the Conversion Name, the Freshpaint integration will lookup the Conversion Id before sending the event to Google. The name of the Freshpaint Event must exactly match the name of the Google Ads Conversion name.</td></tr></tbody></table>

{% hint style="info" %}
Freshpaint will only deliver events to Google when a user arrives on your site by clicking on a Google Ad, thus generating an `gclid`. Without `gclid`, Google will not be able to attribute conversions.
{% endhint %}

There are other optional parameters you can add to your events in order to achieve different use cases. You can view the full list of parameters [here](/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversions-api-reference#server-side).

### Add the Campaign ID to your Final URL Suffix

To ensure visits with `$gbraid`or `$wbraid`are attributed to the correct campaign, add the Campaign ID to your [Final URLs](https://support.google.com/google-ads/answer/9054021?hl=en). This can be configured globally or at the campaign, ad group, or individual ad level.

To do this globally:

1. Go to the Admin -> Account Settings page.\
   ![](/files/K2Ew2pS4fHPVhYqUmrnE)
2. Under "Tracking" add `gacid={campaignid}` to the Final URL Suffix. If you are already using a Final URL Suffix, you will need to separate parameters with `&` .\ <img src="/files/OppQvWBca078FEsad8fV" alt="" data-size="original">

Note: If you set the Final URL Suffix in an ad, campaign, or ad group it will override this global setting, so you will need to append `&gacid={campaignid}` to the new Final URL Suffix.

### If you are a HIPAA account, you will need to add event properties to the allowlist. If you are not a HIPAA account, you can skip this step.

1. Configure the [HIPAA allowlist](https://app.freshpaint.io/hipaa/allowlist) destination specific HIPAA allowlist
2. Edit the Event Properties allowlist and add the following properties:
   1. `$gclid` or `$gbraid` or `$wbraid`
   2. `ctname or ctid`

### That's it! Now all you need to do to send an event to Google Ads is enable the destination in the Freshpaint event definition:

Navigate to your Freshpaint event, and toggle the destination on to enable the event to be sent to the Google Ads destination.<br>

<figure><img src="/files/juStlLH0obW3L9zWITI7" alt=""><figcaption></figcaption></figure>

### Confirm and Validate Conversions in Google Ads

<figure><img src="https://lh3.googleusercontent.com/hKKqRTB-9mTPYJG6psiqdQRxeyGQip44zrkr2gLBjIEnTkNGH3NppgqUkDwV12mlZBb1KVWdtKBoSYhtqQ3syY7T4-i2tkLLTOFQUi2sRXh_GJSGK9Es4a4HToyr3GQrBR2T-P8bN8i6NWOJqjn3pcP2Bw=s2048" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Data from the previous day may not be ingested and displayed by Google in your until 3:30pm ET the following day and can even take up to 24 hours to appear in your Google Ads conversion goals.
{% endhint %}

Congratulations! Once you have confirmed conversion in Google Ads, you have finished setting up this integration.

You can find more detailed documentation on this integration in the [reference guide document.](/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversions-api-reference)


# Google Ads Conversions API Reference

{% hint style="info" %}
The Google Ads Conversion API requires setting up new Conversion Actions within Google Ads. If you want to re-use your existing Google Ads configuration, take a look at the [Google Ads Proxy Destination](/integrations/destinations/direct-response-ads/google-ads).
{% endhint %}

Optimize your Google Ads spend by attributing ad clicks to conversion and other key behaviors.

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Refer to this destination as **Google Ads Conversion API** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

This is a reference document for the Google Ads Conversions API destination. For information on how to set up this integration, see the[ Quick Start guide](/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversion-api-quick-start-guide).

### Events

Freshpaint `.track()` events map to any **Click Conversions** you've already created in Google Ads.

## Track Events

When you send an event to Google Ads, you can track conversions from your ad campaigns based on those events.

### Server-side

You may provide the following additional event properties:

<table data-header-hidden data-full-width="true"><thead><tr><th width="153"></th><th width="135"></th><th width="87"></th><th width="113"></th><th></th></tr></thead><tbody><tr><td><strong>Freshpaint property</strong></td><td><strong>Google Ads parameter</strong></td><td><strong>Type</strong></td><td><strong>Required?</strong></td><td><strong>Description</strong></td></tr><tr><td><code>$gclid</code> or <code>$gbraid</code> or <code>$wbraid</code></td><td><code>gclid</code> or <code>wbraid</code> or <code>gbraid</code></td><td>string</td><td>Required</td><td>gclid (Google Click ID) is generated at ad click time and appended to the landing page URL. <strong>Freshpaint will automatically capture gclid for events from your website</strong>. If you wish, you may provide <code>$gclid</code> as an event property to override the automatically captured value. <code>wbraid</code> or <code>gbraid</code> can be used instead of <code>gclid</code>.</td></tr><tr><td><code>ctname or ctid</code></td><td><code>ctid</code></td><td>string</td><td>Required</td><td>The Conversion Name or Conversion Id of the conversion action in Google Ads. When using the Conversion Name, the Freshpaint integration will lookup the conversion id before sending the event to google. When using the Conversion Id, the name of the Freshpaint Event must exactly match the name of the Google Ads Conversion name.</td></tr><tr><td><code>time</code></td><td><code>conversionDateTime</code></td><td>number</td><td>Optional</td><td>The time the event occurred as a unix epoch. The time needs to be after the ad is clicked or it won't be accepted by google.</td></tr><tr><td><code>cart_data</code></td><td><code>cartData</code></td><td>object</td><td>Optional</td><td>The cart data associated with this conversion. <a href="https://developers.google.com/google-ads/api/reference/rpc/v23/CartData">Google Docs</a></td></tr><tr><td><code>external_attribution_data</code></td><td><code>externalAttributionData</code></td><td>list</td><td>Optional</td><td>Additional data about externally attributed conversions. This field is required for conversions with an externally attributed conversion action, but should not be set otherwise. <a href="https://developers.google.com/google-ads/api/rest/reference/rest/v13/customers/uploadClickConversions#ExternalAttributionData">Google Docs</a></td></tr><tr><td><code>custom_variables</code></td><td><code>customVariables</code></td><td>list</td><td>Optional</td><td>The custom variables associated with this conversion. <a href="https://developers.google.com/google-ads/api/rest/reference/rest/v13/CustomVariable">Google Docs</a></td></tr><tr><td><code>conversion_environment</code></td><td><code>conversionEnvironment</code></td><td>enum</td><td>Optional</td><td>The environment this conversion was recorded on, for example, App or Web. <a href="https://developers.google.com/google-ads/api/rest/reference/rest/v13/customers/uploadClickConversions#ConversionEnvironment">Google Docs</a></td></tr><tr><td><code>value</code> or <code>total</code> or <code>revenue</code></td><td><code>value</code></td><td>number</td><td>Optional</td><td>Value of the conversion. See <a href="https://support.google.com/google-ads/answer/3419241?hl=en#zippy=%2Cmeasure-transaction-specific-conversion-values%2Cconversion-value-currency">About conversion values</a> for more information</td></tr><tr><td><code>currency</code></td><td><code>currency_code</code></td><td>string</td><td>Optional</td><td>Currency of the conversion value, "USD" by default. See the list of <a href="https://support.google.com/merchants/answer/160637?hl=en">supported currency codes</a>.</td></tr><tr><td><code>email</code></td><td><code>email</code></td><td>string</td><td>Optional</td><td>The email address of the user</td></tr><tr><td><code>phone</code> or <code>phone_number</code></td><td><code>phone</code></td><td>string</td><td>Optional</td><td>The phone number of the user</td></tr><tr><td><code>mobile_id</code></td><td><code>mobileID</code></td><td>string</td><td>Optional</td><td>Mobile device ID (advertising ID/IDFA). Accepted only for Customer Match.</td></tr><tr><td><code>third_party_user_id</code></td><td><code>thirdPartyUserID</code></td><td>string</td><td>Optional</td><td>Advertiser-assigned user ID for Customer Match upload, or third-party-assigned user ID for Store Sales. Accepted only for Customer Match and Store Sales.</td></tr><tr><td><code>address_info</code></td><td><code>offlineAddressInfo</code></td><td>object</td><td>Optional</td><td>Address information. Accepted only for Customer Match, Store Sales, and ConversionAdjustmentUploadService. <a href="https://developers.google.com/google-ads/api/rest/reference/rest/v13/UserIdentifier#OfflineUserAddressInfo">Google Docs</a></td></tr><tr><td><code>order_id</code></td><td><code>orderID</code></td><td>string</td><td>Optional</td><td>The order ID associated with the conversion. An order id can only be used for one conversion per conversion action. Used to avoid duplicate conversions in Google Ads.</td></tr></tbody></table>

{% hint style="info" %}
Freshpaint will only deliver events to Google when a user arrives on your site by clicking on a Google Ad, thus generating an `gclid`. Without `gclid`, Google will not be able to attribute conversions.
{% endhint %}

## Setup Conversion Actions

Please refer to the [Quick Start Guide](/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversion-api-quick-start-guide#next-youll-need-to-setup-conversion-actions-in-google-a-ds-and-link-your-freshpaint-event-to-your-go) for instructions on how to set up conversion actions.

## Misc. Considerations

* Conversions may take up to 24 hours to appear in your Google Ads Conversion Goals.
* [Google Ads API v15 introduces a consent object](https://support.google.com/google-ads/answer/14546648?hl=en) to indicate whether users within the European Economic Area have consented to the event being shared with Google. If the event is enabled and consented to within Freshpaint using the Freshpaint consent management features, Freshpaint will automatically mark the event as consented to when sending the event to Google's servers. See [Consent Management](/integrations/consent-management) for more information.

## Conversion Event Imports Between Google Analytics and Google Ads

The workflow of importing GA4 events as conversion actions in Google Ads is considered non-compliant, primarily related to the handling of user identifiers like the GCLID (Google Click Identifier).

To remain compliant for both GA4 and Google Ads, Freshpaint recommends:

* **Not allowlisting the Google Click Identifier (GCLID) property for your Google Analytics destination.**
* **Creation of net-new Website Conversion Actions in Google Ads:** Instead of passing the GCLID directly to GA4, create specific Website conversion actions. The conversion action name can be used as the "ctname" property, along with a "conversion label" property which allows Freshpaint to map an event to a specific conversion action in Google Ads.
* **Unlinking your Google Analytics 4 property from your Google Ads account:** The process for how these 2 tools are unlinked is documented [here](https://support.google.com/analytics/answer/9379420), under the "Unlinking Google Ads accounts from Analytics" section of the article.

## Authentication

Freshpaint supports using either a User Account or Service Account for accessing the Google Ads Conversion API.

#### User Account

A user who has access to both Freshpaint and Google Campaign Manager 360 may delegate access to Freshpaint using the user account. Freshpaint will be granted the limited permissions necessary to send conversion events to google CM360 and be directly tied to the account of the user who delegated access. If that user account is removed or reset, google may revoke the authentication credentials that have been delegated to Freshpaint under that user account.

{% hint style="info" %}
The user delegating access to their User Account needs to have the "Insert offline conversions" permission as part of their role within Campaign Manager 360.
{% endhint %}

Navigate to the destination configuration page and click either `Connect` or `Reconnect` in the `Access Permission` row of the destination configuration page. In the popup dialog select User Account and then `Connect with Google CM360` which will redirect you to Google to complete setting up authentication between Freshpaint and Google services.

<figure><img src="/files/TCKRJDkGlv9wnOvLkX2m" alt=""><figcaption></figcaption></figure>

#### Service Account

An account within google can be created only for Freshpaint that will provide Freshpaint with a set of credentials for Freshpaint to use when sending conversion events to Google. The creation of this account will require necessary permissions to the underlying google account.

Please follow the Google documentation on the creation and configuration of a service account available at: <https://developers.google.com/google-ads/api/docs/oauth/service-accounts>

{% hint style="info" %}
The service account should be provided with the <https://www.googleapis.com/auth/adwords>scope which will allow access to send conversion events to Google.
{% endhint %}

Once the service account has been created within Google, the credentials file can be uploaded to the Freshpaint application.

Navigate to the destination configuration page and click either `Connect` or `Reconnect` in the `Access Permission` row. In the popup dialog select `Service Account` and upload the json file that google provided with the credentials for Freshpaint.

## View-Through Conversions and Retargeting

Freshpaint does not currently support view-through conversions. We only support click-based conversions that include a `gclid`, `gbraid`, or `wbraid` parameter.

Note that retargeting of anonymous users is not possible due to the absence of an identifier that can be used to retarget that user.


# Google Ads

Send advertising events directly to Google Ads from Freshpaint

Optimize your Google Ads spend by attributing ad clicks to conversion and other key behaviors.

{% content-ref url="/pages/uLi6ESIPAjeFvu92dT3D" %}
[Google Ads Quick Start Guide](/integrations/destinations/direct-response-ads/google-ads/google-ads-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/QHSnXejWKUPq60VHQYIq" %}
[Google Ads Reference](/integrations/destinations/direct-response-ads/google-ads/google-ads-reference)
{% endcontent-ref %}


# Google Ads Quick Start Guide

Send advertising events directly to Google Ads from Freshpaint

Optimize your Google Ads spend by attributing ad clicks to conversion and other key behaviors.

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Google AdWords New** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Conversion IDs, you can choose a specific one by suffixing the Conversion ID, such as: **Google AdWords New::123456789.** You can retrieve this value from the Google Ads configuration page for the Conversion ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Conversion IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th align="right"></th><th width="229" data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>true</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

{% hint style="info" %}
When using Server-Side connection mode you are using a Proxy Integration for Google Ads. This destination runs on Freshpaint's servers, but emulates a native installation of Google Universal Analytics Tag. That means the integration behaves the same as if you did a native installation of Google Universal Analytics Tag, but the data first flows through Freshpaint before it's sent to Google. [See our docs on proxy integrations for more information](/reference/faqs/what-is-a-proxy-integration).
{% endhint %}

{% hint style="info" %}
If you’d like to send a server-side event to Google Ads (such as one generated from our [HTTP API](https://documentation.freshpaint.io/reference/developer/http-api), or an event from [CallRail](https://documentation.freshpaint.io/integrations/sources/callrail) or [Invoca](/integrations/sources/invoca)), we recommend using the **Google Ads Conversions API** destination for the best results.

If you’d still prefer to use this Google Ads destination, please reach out to us at **<support@freshpaint.io>**, and we’ll assist you in configuring your server event.
{% endhint %}

## Getting Started

### What You'll Need

1. Your Google Ads Conversion ID
2. [Conversion Actions](https://support.google.com/google-ads/answer/12216226?hl=en) configured in your Google Ads account
3. Conversion Events configured in your Freshpaint account

### To set up Google Ads with Freshpaint, first follow these steps:

1. Get your Google Conversion ID. In your Google Ads account go to [Tools > Conversions](https://ads.google.com/aw/conversions).
2. Click on the relevant conversion action

<figure><img src="/files/vWN6JDftal0LvXOmZPVr" alt=""><figcaption></figcaption></figure>

3. Select Tag Setup

<figure><img src="/files/ghQTKrq5wImeacpxJpmY" alt=""><figcaption></figcaption></figure>

4. Select Use Google Tag Manager. This option will only be there for conversion actions created manually in Google Ads - click [here](https://support.google.com/google-ads/answer/12216226?hl=en#zippy=%2Cinstructions) for instructions on how to create this kind of conversion action in Google Ads.

<figure><img src="/files/Iow4i9ulypAVw9EGQZTj" alt=""><figcaption></figcaption></figure>

5. Get the Conversion ID from the instructions

<figure><img src="/files/ZSKyUfg4HiNR1WRTjOp3" alt=""><figcaption></figcaption></figure>

6. Go to the [Google Ads configuration page](https://app.freshpaint.io/destinations/apps/google-ads) in Freshpaint.
7. Configure your Tag ID. Paste the value that you copied from the previous step.

<figure><img src="/files/itQ1OyTPUDeMXGRmbh6A" alt=""><figcaption></figcaption></figure>

8. **Configure your connection mode.** If you are a HIPAA customer, configure connection mode to server-side. If not, you may choose either connection mode. Learn more about Connection Modes [here](https://documentation.freshpaint.io/faqs/what-is-the-difference-between-client-side-and-server-side-connection-mode).
9. If you are NOT a HIPAA customer and have chosen client-side connection mode, you'll need to setup Conversion Labels from Google Adwords for the actions you want to attribute, as shown below. If you are a HIPAA customer, you can skip this step.

   ![Conversion Labels in Google Analytics](/files/6twNSwN3DBlCWMpXY0jP)

   #### Add transformations that map your Freshpaint events to Conversion Labels:

   ![](/files/iOT9UukvyRJhu6Vkknvz)

### Next, you'll need to link your Freshpaint event to your Google Ads action

Each conversion action in Google Ads uses a conversion label to uniquely identify the conversion action. Follow these steps to link your Freshpaint event to your Google Ads Action:

1. Go to [Tools > Conversions](https://ads.google.com/aw/conversions) and click on the conversion action you want to link
2. Select Tag Setup, then select the Use Google Tag Manager option

   <figure><img src="https://lh3.googleusercontent.com/cPYV9ZtHJbSEyyRNHCFpRtdyEk_kHItrnVImCOHpGmR_oSs1FAYKIH7_vN8aYJxBn2RGXEEoHuC-3JRtqfRxmh-wrul6HX9KrvAwPoLedShzxzGODlRBgxEVm0iAmip-lSlre9Z1ErwsUOccO3q9Zmecag=s2048" alt=""><figcaption></figcaption></figure>
3. Copy the Conversion label under the instructions

   <figure><img src="https://lh5.googleusercontent.com/ufPMd9VYAa3r8Bi-bwsG2J0Wl5TE6H1s0GV0CfoIC7pToHm0RDBOo7Paritntj-WysBcZ-j9u0yVWk9hmUKa2RtU-1rxwHjmxkpyZcU7m7a-_uqMozeiuj8v8SfrZ3eXcSuMkZNGEizOgnmQUJCHiHBz6w=s2048" alt=""><figcaption></figcaption></figure>
4. Attach the conversion label to the related event in Freshpaint by creating a Transformation in Freshpaint:
   1. Click on "Create New" in [Transformations](https://app.freshpaint.io/transformations)
   2. Click "Modify Data"
   3. Select your Freshpaint conversion event, select the Google Ads destination, then click Save & Add Transformations

      <figure><img src="https://lh3.googleusercontent.com/4GAuD8jzPwE1minumD68XpqQnpz2aKQwTsRZbYyifg6czyoxPjOdOx6SjCN7EgG_spP_jO65PBUB4-NeFlWt26jqCkMIQM3XJ3OLSNZxOJVqCb059uWO33JP-Cwc9_F_1B-nTCPFw5F4wRE9t92Btdn2GA=s2048" alt=""><figcaption></figcaption></figure>
   4. Select the Send Constant Property transformation option, copy the Conversion label value, and send it as the conversion\_label property value

      <figure><img src="https://lh4.googleusercontent.com/CNW7WAEz9cyVOahHp1Ff2EzMXP3iBuKeZPbTQsJwpPP_4Z15aWlk1ly0YGqxF-Xfnc5Geq5MSDOnAjfB8lKLK7yVROvLtgMMtTaeqIqdHJFtflwvnFjBF3daYSun5yBwCwqVHqFREtXqPvcXduzLVJFwbw=s2048" alt=""><figcaption></figcaption></figure>

### If you are a HIPAA account, you will need to add event properties to the allowlist. If you are not a HIPAA account, you can skip this step.

1. Configure the [HIPAA allowlist](https://app.freshpaint.io/destinations/apps/google-ads/phiallowlist)
2. Edit the Event Properties allowlist and add the following properties:

   1. conversion\_label
   2. $gclid

   <figure><img src="https://lh3.googleusercontent.com/mAb7tJPlmE5cTF1vVYvhKyQ44IRCZYl0vi2SqL96el8gJjZ-5yFdhbLZFG38hvZiWs97o_KkXP1wQd7RwOA_RNdAvH_OJUOJszgiIfQyF7bJAGH2iy2To6fBD6gui9WrIpEZ7RF_Baeby9oHTACra3FX2Q=s2048" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Freshpaint will only deliver events to Google Ads when a user arrives on your site by clicking on your Google ad, and the Google Click ID value ([$gclid](https://support.google.com/google-ads/answer/9744275?hl=en)) is captured from the clickthrough url. Without a $gclid value, Google will not be able to attribute events to your ad campaigns.
{% endhint %}

### That's it! Now all you need to do to send an event to Google Ads is enable the destination in the Freshpaint event definition:

Navigate to your Freshpaint event, and toggle the destination on to enable the event to be sent to the Google Ads destination.<br>

<figure><img src="https://lh3.googleusercontent.com/VVSSyzLpR2VFTkzWEjqFbz09bTzYUzCtFRowCr9VeAx2L8OpgLi9n3gS1Oj8bBlXccGkC0Qh1tSZdyWWJwnWhff5DahwVdshzecSo5tt17tpbfsf1zgRqYSa2XuIcUB6MuYesgGWXz6qKwy5cPKixlVgSA=s2048" alt=""><figcaption></figcaption></figure>

If you've configured multiple Google Ads Conversion IDs, you'll need to toggle each Conversion ID individually for each Freshpaint event.

If you're using Google Tag Manager to send data to Google Ads, and you have multiple Conversion IDs enabled, you'll need to specify which Conversion ID(s) you'd like to enable the event for in the event tag.

### Confirm and Validate Conversions in Google Ads

<figure><img src="https://lh3.googleusercontent.com/hKKqRTB-9mTPYJG6psiqdQRxeyGQip44zrkr2gLBjIEnTkNGH3NppgqUkDwV12mlZBb1KVWdtKBoSYhtqQ3syY7T4-i2tkLLTOFQUi2sRXh_GJSGK9Es4a4HToyr3GQrBR2T-P8bN8i6NWOJqjn3pcP2Bw=s2048" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Data from the previous day may not be ingested and displayed by Google in your until 3:30pm ET the following day and can even take up to 24 hours to appear in your Google Ads conversion goals.
{% endhint %}

Congratulations! Once you have confirmed conversion in Google Ads, you have finished setting up this integration.

You can find more detailed documentation on this integration in the [reference guide document.](/integrations/destinations/direct-response-ads/google-ads/google-ads-reference)


# Google Ads Reference

Send advertising events directly to Google Ads from Freshpaint

Optimize your Google Ads spend by attributing ad clicks to conversion and other key behaviors.

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **Google AdWords New** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
  * If you've configured multiple Conversion IDs, you can choose a specific one by suffixing the Conversion ID, such as: **Google AdWords New::123456789.** You can retrieve this value from the Google Ads configuration page for the Conversion ID of interest.

{% hint style="info" %}
When no suffix is specified, all configured Conversion IDs are selected for inclusion / exclusion.
{% endhint %}

* Connection Modes:

<table><thead><tr><th align="right"></th><th width="229" data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>true</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

{% hint style="info" %}
When using Server-Side connection mode you are using a Proxy Integration for Google Ads. This destination runs on Freshpaint's servers, but emulates a native installation of Google Universal Analytics Tag. That means the integration behaves the same as if you did a native installation of Google Universal Analytics Tag, but the data first flows through Freshpaint before it's sent to Google. [See our docs on proxy integrations for more information](/reference/faqs/what-is-a-proxy-integration).
{% endhint %}

This is a reference document for the Google Ads destination. For information on how to set up this integration, see the[ Quick Start guide](/integrations/destinations/direct-response-ads/google-ads/google-ads-quick-start-guide).

## API Mapping

### Events

Freshpaint.`track()` events map to any **Click Conversions** you've already created in Google Ads. Any `properties` you've created will be passed along as well.

## Track Events

When you send an event to Google Ads, you can track conversions from your ad campaigns based on those events.

### Client-side

Freshpaint uses the [Google Tag](https://support.google.com/google-ads/answer/11994839) to send events to Google Ads. You may provide the following additional event properties:

| **Freshpaint property** | **Google Ads parameter** | **Type** | **Required?** | **Description**                                                                                         |
| ----------------------- | ------------------------ | -------- | ------------- | ------------------------------------------------------------------------------------------------------- |
| `category`              | `ec`                     | string   | Optional      | Event category defined as you wish. Can be used as an additional filter criterion for conversion goals. |
| `revenue`               | `gv`                     | number   | Optional      | Value of the conversion in USD. Must be between 0 and 9999999 with up to 3 decimal places.              |

### Server-side

{% hint style="warning" %}
This is a Proxy Integration for Google Ads. This destination runs on Freshpaint's servers, but emulates a native installation of Google Universal Analytics Tag. That means the integration behaves the same as if you did a native installation of Google Universal Analytics Tag, but the data first flows through Freshpaint before it's sent to Google. [See our docs on proxy integrations for more information](/reference/faqs/what-is-a-proxy-integration).
{% endhint %}

{% hint style="info" %}
The Proxy integration allows you to re-use your existing google ads configuration. If you're starting fresh, we recommend using the [Google Ads Conversion API](/integrations/destinations/direct-response-ads/google-ads-conversion-api) destination.
{% endhint %}

Freshpaint's servers use the same API as the client-side Google Tag. You may provide the following additional event properties:

| **Freshpaint property**         | **Google Ads parameter** | **Type** | **Required?** | **Description**                                                                                                                                                                                                                                                                    |
| ------------------------------- | ------------------------ | -------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `$gclid`                        | `gclid`                  | string   | Required      | gclid (Google Click ID) is generated at ad click time and appended to the landing page URL. **Freshpaint will automatically capture gclid for events from your website**. If you wish, you may provide `$gclid` as an event property to override the automatically captured value. |
| `conversion_label`              | `label`                  | string   | Required      | The Conversion Label configured within google ads to identify which conversion action the event should trigger                                                                                                                                                                     |
| `$gbraid`                       | `gclgb`                  | string   | Optional      | gbraid is generated at ad click time and appended to the landing page URL. It will be used as the click ID if `$gclid` is not provided.                                                                                                                                            |
| `$wbraid`                       | `gclgb`                  | string   | Optional      | wbraid is generated at ad click time and appended to the landing page URL. It will be used as the click ID if `$gclid` and `$gbraid` are not provided.                                                                                                                             |
| `transaction_id`                | oid                      | string   | Optional      | Allows overriding the [Transaction ID](https://support.google.com/google-ads/answer/6386790) generated by Freshpaint with a custom id to avoid duplicate conversions in Google Ads.                                                                                                |
| `_gcl_aw` or `gclaw`            | `gclaw`                  | string   | Optional      | Defaults to the gclid                                                                                                                                                                                                                                                              |
|                                 | `gac`                    | string   | Optional      | The google analytics code. Will only be sent to google ads if configured within your account.                                                                                                                                                                                      |
|                                 | `gtm_ee`                 | string   | Optional      | Enable Enhanced Ecommerce on the event.                                                                                                                                                                                                                                            |
| `$title`                        | `tiba`                   | string   | Optional      | The title of the page being visited                                                                                                                                                                                                                                                |
| `$referrer`                     | `ref`                    | string   | Optional      | The referrer to the page being visited                                                                                                                                                                                                                                             |
| `user_agent_arch`               | `uaa`                    | string   | Optional      | The User-Agent Architecture                                                                                                                                                                                                                                                        |
| `user_agent_bitness`            | `uab`                    | string   | Optional      | The User-Agent Bitness                                                                                                                                                                                                                                                             |
| `user_agent_full_version_list`  | `uafvl`                  | string   | Optional      | The User-Agent Full Version List                                                                                                                                                                                                                                                   |
| `user_agent_mobileness`         | `uamb`                   | string   | Optional      | The User-Agent Mobileness. Must be 1 for a mobile device and 0 for non-mobile devices.                                                                                                                                                                                             |
| `user_agent_platform`           | `uap`                    | string   | Optional      | The User-Agent Platform.                                                                                                                                                                                                                                                           |
| `user_agent_platform_version`   | `uapv`                   | string   | Optional      | The User-Agent Platform Version                                                                                                                                                                                                                                                    |
| `user_agent_wow64`              | `uaw`                    | string   | Optional      | The User-Agent WoW64 (Win32 on Win64)                                                                                                                                                                                                                                              |
| `utm_campaign`                  | `utm_campaign`           | string   | Optional      | The advertising campaign the specific event belongs to                                                                                                                                                                                                                             |
| `utm_source`                    | `utm_source`             | string   | Optional      | The advertising source that the user followed to reach the site.                                                                                                                                                                                                                   |
| `utm_medium`                    | `utm_medium`             | string   | Optional      | The medium or channel that the user followed to reach the site.                                                                                                                                                                                                                    |
| `utm_content`                   | `utm_content`            | string   | Optional      | The content tag used to track the specific content or variation of an ad that the user followed to reach the site.                                                                                                                                                                 |
| `utm_term`                      | `utm_term`               | string   | Optional      | The keywords the user used when searching that led to the ad impression.                                                                                                                                                                                                           |
| `$screen_height`                | `u_ah`                   | number   | Optional      | The screen height of the device visiting the page                                                                                                                                                                                                                                  |
| `$screen_width`                 | `u_aw`                   | number   | Optional      | The screen width of the device visiting the page                                                                                                                                                                                                                                   |
| `$viewport_height`              | `u_h`                    | number   | Optional      | The visible height of the web page                                                                                                                                                                                                                                                 |
| `$viewport_width`               | `u_w`                    | number   | Optional      | The visible width of the web page                                                                                                                                                                                                                                                  |
| `u_tz`                          | `u_tz`                   | number   | Optional      | The timezone offset of the device                                                                                                                                                                                                                                                  |
| `value` or `total` or `revenue` | `value`                  | number   | Optional      | Value of the conversion. See [About conversion values](https://support.google.com/google-ads/answer/3419241?hl=en#zippy=%2Cmeasure-transaction-specific-conversion-values%2Cconversion-value-currency) for more information                                                        |
| `currency`                      | `currency_code`          | string   | Optional      | Currency of the conversion value, "USD" by default. See the list of [supported currency codes](https://support.google.com/merchants/answer/160637?hl=en).                                                                                                                          |
| `$os`                           | `os`                     | string   | Optional      | The operating system of the device. Freshpaint will only send this property if it is allowlisted.                                                                                                                                                                                  |

{% hint style="info" %}
Freshpaint will only deliver events to Google when a user arrives on your site by clicking on a Google Ad, thus generating an `gclid`, `gbraid`, or `wbraid`. Without one of these click IDs, Google will not be able to attribute conversions.
{% endhint %}

#### Setup Conversion Labels

{% hint style="warning" %}
If you are using conversion actions that trigger off of a Page load, you will need to create new manual conversion actions in google ads. Freshpaint does not pass the URL to google ads which could expose HIPAA sensitive data when using the server-side integration.
{% endhint %}

Each Google Adwords conversion action uses a conversion label to uniquely identify the conversion action.

1. Get your google conversion label. In you're google ads account go to [Tools > Conversions](https://ads.google.com/aw/conversions).
2. Click on the conversion action you're setting up

<figure><img src="/files/vWN6JDftal0LvXOmZPVr" alt=""><figcaption></figcaption></figure>

3. Select Tag Setup

<figure><img src="/files/ghQTKrq5wImeacpxJpmY" alt=""><figcaption></figcaption></figure>

4. Select Use Google Tag Manager

<figure><img src="/files/Iow4i9ulypAVw9EGQZTj" alt=""><figcaption></figcaption></figure>

5. Get the Conversion label from the instructions

<figure><img src="/files/oMddsUznjcP9zV2IU0zP" alt=""><figcaption></figcaption></figure>

6. Configure a [transformation](/admin-panel/transformations) for the Event within Freshpaint to attach the conversion\_label or any other fields to send to the destination.

<figure><img src="/files/pDzPM8Dkb5jpRV0wY6D9" alt=""><figcaption></figcaption></figure>

## Using Multiple Google Ads Accounts

If you need to send conversion actions to more than one different Google Ads account, this can be achieved by configuring additional instances, each with its own Conversion ID. After doing this, you'll see them listed in the Overview list, for example:

<figure><img src="/files/Su0de8iAdeoA7hM7d7Vc" alt=""><figcaption></figcaption></figure>

You can then select which Conversion ID you want for a given Event using the toggles in your [Library](https://app.freshpaint.io/events/schema):

<figure><img src="/files/zNQHUn2nrCGGwSHQG5M7" alt=""><figcaption></figcaption></figure>

If you're using precision tracking, see [#destination-info](#destination-info "mention") above.

If you're using the [Google Tag Manager integration](/integrations/google-tag-manager-integration) integration, you enter the specific Conversion ID on the Freshpaint GTM Template tag:

<figure><img src="/files/3V4d6idgo6EpnmskLaY7" alt=""><figcaption></figcaption></figure>

## Call Conversions

To use Google Ads call conversions, you need to call `freshpaint.registerCallConversion`. If you have an existing Google Ads Call Conversion configuration that looks like:

```javascript
gtag('config', <TAG_ID/CONVERSION_LABEL>, {
  'phone_conversion_number': <phone-number>
});
```

You need to replace it with the following call to the Freshpaint SDK:

```javascript
freshpaint.registerCallConversion('<TAG_ID/CONVERSION_LABEL>', <phone-number>)
```

Here's an example:

```javascript
freshpaint.registerCallConversion('AW-1234567/aLabel', '312-555-1212')
```

{% hint style="info" %}
If you have call conversions configured through Google Tag Manager, you can use the Google Ads Call Conversions on the Freshpaint GTM Template instead of calling `freshpaint.registerCallConversion` directly.
{% endhint %}

## Considerations

{% hint style="info" %}
Conversions may take up to 24 hours to appear in your Google Ads Conversion Goals.
{% endhint %}

### Conversion Actions Configuration

The way you set up your conversion actions can affect the data that shows in the Google Ads console downstream. For example, if you have your conversion action set up to "Count one conversion", only one click per user will be shown in your console. This means that even if recent events are triggered, if they are triggered by the same user and ad as a previous event that was already counted, it will not show again. You can read more about how click ids are generated by Google Ads [here](https://support.google.com/searchads/answer/7342044?hl=en).

Similarly, the click through conversion setting on your conversion action can be important. For example, if you have a 30-day click through conversion setting on your conversion action, any of the corresponding events sent to Google Ads from outside that 30-day window will not be shown in the Google Ads console under that conversion action. You can read more about that [here](https://support.google.com/google-ads/answer/3123169?hl=en).

## Conversion Event Imports Between Google Analytics and Google Ads

The workflow of importing GA4 events as conversion actions in Google Ads is considered non-compliant, primarily related to the handling of user identifiers like the GCLID (Google Click Identifier).

To remain compliant for both GA4 and Google Ads, Freshpaint recommends:

* **Not allowlisting the Google Click Identifier (GCLID) property for your Google Analytics destination.**
* **Creation of net-new Website Conversion Actions in Google Ads**: Instead of passing the GCLID directly to GA4, create specific Website conversion actions. This method generates a "conversion label" which allows Freshpaint to map an event to a specific conversion action in Google Ads.
* **Unlinking your Google Analytics 4 property from your Google Ads account.** The process for how these 2 tools are unlinked is documented [here](https://support.google.com/analytics/answer/9379420), under the "*Unlinking Google Ads accounts from Analytics*" section of the article.

## View-Through Conversions and Retargeting

View-through conversions and retargeting are possible with the Google Ads Conversions API destination:

{% content-ref url="/pages/eaBrwXFi2W4sXqt112cS" %}
[Google Ads Conversions API Reference](/integrations/destinations/direct-response-ads/google-ads-conversion-api/google-ads-conversions-api-reference)
{% endcontent-ref %}


# LinkedIn Ads

As of September 12, 2025, the LinkedIn Ads integration has been deprecated.

To continue sending conversion data to LinkedIn, please migrate to our new [LinkedIn Ads Conversions API integration.](/integrations/destinations/direct-response-ads/linkedin-ads-conversions-api) Contact your Account Manager or email **<support@freshpaint.io>** for assistance on the migration.


# LinkedIn Ads Conversions API

Send advertising events directly to LinkedIn Campaign Manager

{% content-ref url="/pages/3IR7q9xCfRCDbxt0oeHE" %}
[LinkedIn Ads Conversions API Quick Start Guide](/integrations/destinations/direct-response-ads/linkedin-ads-conversions-api/linkedin-ads-conversions-api-quick-start-guide)
{% endcontent-ref %}

{% content-ref url="/pages/VBkU5yQU6gPGzgm92pb1" %}
[LinkedIn Ads Conversions API Reference](/integrations/destinations/direct-response-ads/linkedin-ads-conversions-api/linkedin-ads-conversions-api-reference)
{% endcontent-ref %}


# LinkedIn Ads Conversions API Quick Start Guide

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **LinkedIn Ads Conversions API** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

## Getting Started

This guide enables you to fully enable the LinkedIn Ads Conversions API destination for your site. For simplicity the event used for demonstration purposes is the generic `Page View` event. For more complex events see[ our additional documentation](/readme/setting-up-your-events). Additionally this guide assumes you have the Freshpaint snippet installed on your site, if you do not please follow[ this guide](/readme/guides/quickstart/installing-freshpaint).

1. [Enable the Freshpaint LinkedIn Ads destination](#enable-the-linkedin-a-ds-destination)
   * If in HIPAA mode enable the required fields
2. [Find/create your conversion IDs](#your-first-conversion-id)
3. [Enable LinkedIn Ads destination for the appropriate events](#enable-linkedin-a-ds-events)
4. [Connect the conversion ID to appropriate events](#connect-conversion-id-to-events)
5. [Confirm and validate events](#confirm-and-validate-conversions-in-linkedin)

### Configure Freshpaint

To configure your LinkedIn Ads Conversions API destination you will need to connect with LinkedIn via OAuth 2.0. Click the "Connect With LinkedIn" button on the destination configuration page to get started. You must have one of the following Ad Account Roles in LinkedIn to authenticate:

* Account Billing Admin
* Account Manager
* Campaign Manager
* Creative Manager

<figure><img src="/files/PJy0IjUuAuSDTNDzcwpG" alt=""><figcaption></figcaption></figure>

1. Customers that use HIPAA mode should then configure the required properties and enable `conversion_id`.

<figure><img src="/files/mhbC0ujH54sa8yZex0hY" alt=""><figcaption></figcaption></figure>

2. At least one of `$li_fat_id`, `email`, `acxiom_id`, or `oracle_moat_id` are required to send conversions to LinkedIn Ads Conversion API. Enable at least one of these properties under recommended properties.

<figure><img src="/files/K4ZgSiIEhqnIRhGqLqCx" alt=""><figcaption></figcaption></figure>

3. Click "Enable"

Once you've successfully authenticated and follow the steps above you can start sending events to LinkedIn Conversions API.

### Your First Conversion ID

To configure your LinkedIn Ads Conversions API destination events, you'll first need at least one Conversion Rule.

1. Log in to [LinkedIn Campaign Manager](https://www.linkedin.com/campaignmanager/)
2. Click `Measurement > Conversion tracking` on the left menu
3. Click `Create Conversion`
4. Click `Conversions API`

<figure><img src="/files/KEEtBGsYlGGGXdTxYl4d" alt=""><figcaption></figcaption></figure>

5. Select **'Direct API' as the Data Source**

<figure><img src="/files/PyqjZnaExsFau9mguyUo" alt=""><figcaption></figcaption></figure>

6. Save the event

### Finding the Conversion ID

Once you have created a Conversion Rule, you'll need to locate the Conversion ID to configure your Freshpaint events.

1. Log in to your LinkedIn campaign manager account
2. Select the ‘Measurement tab’ on the left toolbar
3. Select ‘Conversion tracking’
4. Click into the applicable conversion event.
5. Reference the 2nd ID listed in the URL string – this is the numeric portion of the `conversion_id`, also known as the Conversion Rule ID (or `conversion_ruleid`) within LinkedIn Campaign Manager:

   `https://www.linkedin.com/campaignmanager/accounts/{account_id}/conversions/{conversion_ruleid}`

   1. Your `conversion_id` will be `urn:lla:llaPartnerConversion:{conversion_ruleid}`
      1. **Example**: With the URL `https://www.linkedin.com/campaignmanager/accounts/123/conversions/2233445566`, your final `conversion_id` will be `urn:lla:llaPartnerConversion:2233445566`

{% hint style="danger" %}
**Conversion rules must have a data source of 'Direct API', otherwise conversion events will not be able to be streamed to your account.**
{% endhint %}

### Enable LinkedIn Ads Events

1. Navigate to the [Event Library](https://app.freshpaint.io/events/schema).
2. Select/create the event you want your `conversion_id` to be associated with.
   * In this example we are going to associate it with every page view for demonstration purposes.
3. At the bottom of the event page enable `LinkedIn Ads Conversions API`.

<figure><img src="/files/RVGn4gRJutE9VNxXak0r" alt=""><figcaption></figcaption></figure>

### Connect Conversion ID to Events

The best way to send the required Conversion ID depends on how you're generating your events. Below are two of the most common scenarios.

#### Using Autotrack

1. Navigate to [Event Transformations](https://app.freshpaint.io/transformations).
2. Click the `Create New` button.
3. Select `Modify Data.`
   * Select your event (in this demo we will select `Page View`) .
   * Select `LinkedIn Ads Conversions API` for the destination.
4. Set the following values for the transform fields.
   * `Send Constant Property` for transform type.
   * Your conversion ID for the property value.
   * `Text` for the property type.
   * `conversion_id` for property name.

<figure><img src="/files/6Bx4FFTTX7kwQr1XWHlB" alt=""><figcaption><p>Send conversion_id as a constant property transformation</p></figcaption></figure>

#### Using the GTM Integration

When using the [Google Tag Manager integration](/integrations/google-tag-manager-integration), the Conversion ID is specified by the Freshpaint LinkedIn Ads Conversions API tag:

<figure><img src="/files/S49bEmnM53hN3BWXZmjD" alt=""><figcaption></figcaption></figure>

### Confirm and Validate Conversions in Freshpaint

1. Navigate to your site and visit a page that should trigger your event (For demonstration purposes we will use [FreshHealth.co](https://www.freshhealth.co/)).
2. Add a query parameter called `li_fat_id` to the URL (Example: [https://www.freshhealth.co/?li\_fat\_id=TEST](https://www.freshhealth.co/)).
3. Trigger your event (Our demonstration event is any `Page View`).
4. Navigate to the [Event Verification tool](https://app.freshpaint.io/event-verification).
5. Select `LinkedIn Ads Conversions API` and verify your event went through.
   * This can take up to 90 seconds.
6. Verify the event is marked as `OK` or resolve missing property issues.

<figure><img src="/files/SpVY1aUs4f0i2TUDuhQK" alt=""><figcaption><p>Our LinkedIn Ads event went through smoothly with all required properties in place</p></figcaption></figure>

### Confirm and Validate Conversions in LinkedIn

To check whether LinkedIn Ads is receiving events.

1. [Sign in to LinkedIn Campaign Manager](https://www.linkedin.com/campaignmanager/)
2. Click `Analyze > Conversion tracking` on the left menu.
3. Click on `Data sources` in the middle of the screen.

The source status should show up as `Active` if receiving events from your website. More information on status definitions is available in the official [LinkedIn documentation](https://www.linkedin.com/help/lms/answer/a489395).

<figure><img src="/files/F5G3n9vLOOObMrStEPrS" alt=""><figcaption><p>Example of conversion with no data</p></figcaption></figure>

## Required Properties

`$li_fat_id`, `email`, `acxiom_id`, and `oracle_moat_id` are all considered "external IDs" by LinkedIn. At least one of these properties is required to be allowlisted if in HIPAA mode.

> External IDs provide a way to leverage unique/proprietary identifiers for improved signal quality and identity resolution. This helps in accurately matching users across devices and platforms, thereby enhancing the overall effectiveness of advertising efforts while complying with global privacy regulations.

{% hint style="info" %}
The following event properties are **required** in order to attribute events to specific ads, and if in HIPAA mode, must be selected in the Required Properties Allow List.
{% endhint %}

<table data-header-hidden data-full-width="true"><thead><tr><th width="165"></th><th width="164"></th><th width="103"></th><th></th><th></th></tr></thead><tbody><tr><td><strong>Freshpaint property</strong></td><td><strong>LinkedIn Ads</strong><br><strong>parameter</strong></td><td><strong>Type</strong></td><td><strong>Requirement</strong></td><td><strong>Description</strong></td></tr><tr><td><code>conversion_id</code></td><td><code>conversion</code></td><td>string</td><td>Required</td><td>A conversion rule ID provided by LinkedIn that allows you to trigger a specific event.<br><br>The conversion ID will have a similar format to: <code>urn:li:sponsoredAccount:5123456</code></td></tr><tr><td><code>$li_fat_id</code></td><td><code>LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID</code></td><td>string</td><td>Required [conditional]</td><td>A query parameter that connects a page view or conversion event to a specific ad, which Freshpaint captures as <code>$li_fat_id</code>.<br><br>At least one of <code>$li_fat_id</code>, <code>email</code>, <code>acxiom_id</code>, or <code>oracle_moat_id</code> are required.</td></tr><tr><td><code>email</code></td><td><code>SHA256_EMAIL</code></td><td>string</td><td>Required [conditional]</td><td>The email address of the contact associated with the conversion event. Used for view-through conversions.<br><br>Use with caution. LinkedIn will be able to match hashes with original emails if the emails are recorded in their system.<br><br>At least one of <code>$li_fat_id</code>, <code>email</code>, <code>acxiom_id</code>, or <code>oracle_moat_id</code> are required.</td></tr><tr><td><code>acxiom_id</code></td><td><code>ACXIOM_ID</code></td><td>string</td><td>Required [conditional]</td><td>User identifier for matching with LiveRamp identity graph. Used for view-through conversions.<br><br>At least one of <code>$li_fat_id</code>, <code>email</code>, <code>acxiom_id</code>, or <code>oracle_moat_id</code> are required.</td></tr><tr><td><code>oracle_moat_id</code></td><td><code>ORACLE_MOAT_ID</code></td><td>string</td><td>Required [conditional]</td><td>User identifier for matching with Oracle MOAT Identity. Used for view-through conversions.<br><br>At least one of <code>$li_fat_id</code>, <code>email</code>, <code>acxiom_id</code>, or <code>oracle_moat_id</code> are required.</td></tr></tbody></table>


# LinkedIn Ads Conversions API Reference

## Destination Info

* Supports [Track](https://documentation.freshpaint.io/developer/freshpaint-sdk-reference#track) calls
* Supports [HIPAA mode](https://documentation.freshpaint.io/hipaa-mode)
* Supports forwarding from the [Google Tag Manager Integration](/integrations/google-tag-manager-integration)
* Refer to this destination as **LinkedIn Ads Conversions API** in the [Integrations object](https://documentation.freshpaint.io/reference/developer/freshpaint-sdk-reference#using-the-integrations-object)
* Connection Modes:

<table><thead><tr><th width="200.33333333333331" align="right"></th><th data-type="checkbox">Client-side</th><th data-type="checkbox">Server-side</th></tr></thead><tbody><tr><td align="right">Web</td><td>false</td><td>true</td></tr><tr><td align="right">Mobile</td><td>false</td><td>true</td></tr><tr><td align="right">Server</td><td>false</td><td>true</td></tr></tbody></table>

This is a reference document for the LinkedIn Ads destination. For information on how to set up this integration, see the [LinkedIn Ads Conversions API Quick Start Guide](/integrations/destinations/direct-response-ads/linkedin-ads-conversions-api/linkedin-ads-conversions-api-quick-start-guide).

### Events

When you send an event to the LinkedIn Ads Conversions API destination from Freshpaint, Freshpaint will create an event in the LinkedIn campaign manager by hitting LinkedIn's API.

## Track Events

When you send an event to the LinkedIn Ads Conversions API destination, you can track conversions from your ads based on those events.

Below are the Required, Recommended, and Optional properties which are mapped to the LinkedIn Ads Conversions API request:

<table data-header-hidden data-full-width="true"><thead><tr><th width="165"></th><th width="164"></th><th width="103"></th><th></th><th></th></tr></thead><tbody><tr><td><strong>Freshpaint property</strong></td><td><strong>LinkedIn Ads</strong><br><strong>parameter</strong></td><td><strong>Type</strong></td><td><strong>Requirement</strong></td><td><strong>Description</strong></td></tr><tr><td><code>conversion_id</code></td><td><code>conversionId</code></td><td>string</td><td>Required</td><td>A conversion ID provided by LinkedIn that allows you to trigger a specific event.<br><br>The conversion ID will have a similar format to: <code>urn:li:sponsoredAccount:5123456</code></td></tr><tr><td><code>$li_fat_id</code></td><td><code>LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID</code></td><td>string</td><td>Required [conditional]</td><td>A query parameter that connects a page view or conversion event to a specific ad, which Freshpaint captures as <code>$li_fat_id</code>.<br><br>At least one of <code>$li_fat_id</code>, <code>email</code>, <code>acxiom_id</code>, or <code>oracle_moat_id</code> are required.</td></tr><tr><td><code>email</code></td><td><code>SHA256_EMAIL</code></td><td>string</td><td>Required [conditional]</td><td>Email hashed with SHA 256 algorithm. Used to improve match rates.<br><br><strong>Use with caution. LinkedIn will be able to match hashes with original emails if the emails are recorded in their system.</strong><br><br>At least one of <code>$li_fat_id</code>, <code>email</code>, <code>acxiom_id</code>, or <code>oracle_moat_id</code> are required.</td></tr><tr><td><code>acxiom_id</code></td><td><code>ACXIOM_ID</code></td><td>string</td><td>Required [conditional]</td><td>User identifier for matching with LiveRamp identity graph. Used for view-through conversions.<br><br>At least one of <code>$li_fat_id</code>, <code>email</code>, <code>acxiom_id</code>, or <code>oracle_moat_id</code> are required.</td></tr><tr><td><code>oracle_moat_id</code></td><td><code>ORACLE_MOAT_ID</code></td><td>string</td><td>Required [conditional]</td><td>User identifier for matching with Oracle MOAT Identity. Used for view-through conversions.<br><br>At least one of <code>$li_fat_id</code>, <code>email</code>, <code>acxiom_id</code>, or <code>oracle_moat_id</code> are required.</td></tr><tr><td><code>currency_code</code></td><td><code>currencyCode</code></td><td>string</td><td>Optional</td><td>Currency code in ISO format (e.g. "USD")<br><br>Must be provided with <code>amount</code></td></tr><tr><td><code>amount</code></td><td><code>amount</code></td><td>string</td><td>Optional</td><td>Monetary amount as a decimal string (e.g. "50.0")<br><br>Must be provided with <code>currency_code</code>.</td></tr><tr><td><code>first_name</code></td><td><code>first_name</code></td><td>string</td><td>Optional</td><td>User's first name. Can improve match rates.<br><br><strong>Unmasked PII. Use with caution.</strong></td></tr><tr><td><code>last_name</code></td><td><code>last_name</code></td><td>string</td><td>Optional</td><td>User's last name. Can improve match rates.<br><br><strong>Unmasked PII. Use with caution.</strong></td></tr><tr><td><code>job_title</code></td><td><code>title</code></td><td>string</td><td>Optional</td><td>User's job title. Can improve match rates.<br><br><strong>Unmasked PII. Use with caution.</strong></td></tr><tr><td><code>company_name</code></td><td><code>company_name</code></td><td>string</td><td>Optional</td><td>User's company name. Can improve match rates.<br><br><strong>Unmasked PII. Use with caution.</strong></td></tr><tr><td><code>country_code</code></td><td><code>country_code</code></td><td>string</td><td>Optional</td><td>User's country code. Can improve match rates.<br><br><strong>Unmasked PII. Use with caution.</strong></td></tr></tbody></table>


# LinkedIn Insights

The LinkedIn Insights destination allows Freshpaint to pull campaign performance data (spend, clicks, conversions) from your LinkedIn ad account to power the Ad Performance and Insights Overview dashboard. This destination provides visibility into how your LinkedIn advertising spend drives appointments and revenue.

{% hint style="info" %}
This destination pulls data *from* LinkedIn—it does not send events to LinkedIn. If you need to send conversion events to LinkedIn, use the LinkedIn Ads Conversions API destination instead.
{% endhint %}




---

[Next Page](/llms-full.txt/1)

