Help Center
How can we help? 👋

Sending Events Server-to-Server (S2S), in Batch, or as an Img Tag

We advise against S2S or batch integrations if you can only send us either the IPv4 or IPv6 address for each event, instead of both. Our JS web tag and Shopify app collect both the IPv4 & IPv6 address for each event, so we can match the IP address to the publisher IP address no matter if they force IPv4 usage, or allow IPv6. Only sending 1 type of IP address per event may require our system to model significantly more, and reduce by ~half the number of conversions we can directly match to without modeling. For this reason, we recommend when possible using JavaScript tags or our Shopify app whenever possible, if you cannot send both IP types for each event.

Sending Podscribe Events

Podscribe's pixel-based attribution works by matching the IPs of site visitors with those of ad listeners (full guide). The guide below will help you understand how to send events to Podscribe, whether you're sending them individually via server-to-server (s2s) or in bulk using batch processing.

Step 1: Begin Sending Data Server-to-Server or in Batch

Server-to-Server (S2S):

In this method, each event is sent individually from your server to our server. This approach ensures that every event is processed in real-time or near real-time, making it suitable for scenarios where immediate action is required.

Image Pixel:

In this method, your website simply calls the below URL of ours, pre-filling out the parameters beforehand using your own web logic, not through our JS tag.

Batch Sending:

Alternatively, you can send a CSV file with multiple events in bulk using an s3 bucket. This method is efficient for processing large volumes of data at once but introduces a delay in data processing.

Below is the format for the image pixel or server call that you can use for each event. If you opt to send a CSV via s3, use the fields listed below. We recommend contacting adops@podscribe.com once you've set everything up so we can confirm that the integration is working correctly.

URL:

GET: https://verifi.podscribe.com/tag

Accepted Query Params:

Field
Type
Required
Description
Example
action
string
Type of event (e.g., user action or conversion).
view, signup, lead, purchase
advertiser
string
Unique advertiser ID assigned by the platform.
12345
user_agent
string
Browser or app user agent string.
Mozilla/5.0 (iPhone; CPU iPhone OS 17_0)
ip
string
IP address of the user. Prefer IPv6 if available.
2607:f8b0:4005:805::200e
ipv4
string
Optional
IPv4 address (used if IPv6 is unavailable).
192.168.0.1
timestamp
integer (Unix epoch)
UTC timestamp of the event.
1735148790
device_id
string
Optional
Internal user or device identifier.
device_abc123
idfa
string
Optional
Apple advertising ID (IDFA).
00000000-0000-0000-0000-000000000000
gaid
string
Optional
Google Advertising ID (GAID).
38400000-8cf0-11bd-b23e-10b96e40000d
event_url
string (URL)
URL where the event took place.
https://example.com/product/123
landing_url
string (URL)
Optional
Landing page URL of the session.
https://example.com/landing
referrer_url
string (URL)
Optional
URL of the page that referred the user.
https://google.com/
value
number
Optional
Purchase or conversion value.
29.99
currency
string (ISO 4217)
Optional
Currency code for the transaction.
USD
order_number
string
Optional
Unique order or transaction ID.
ORD-987654
discount_code
string
Optional
Discount or promo code used.
SUMMER20
hashed_email
string
Optional
SHA256-hashed email address of the user. Trim and lowercase before hashing.
9b74c9897bac770ffc029102a200c5de
source
string
Indicates data source. For server requests, use "server".
server
is_new_customer
boolean
Optional
Whether the user is a first-time customer.
true
is_subscription
boolean
Optional
Indicates if the event involves a subscription.
false
meta
object
Optional
Generic metadata or custom event attributes.
{"category":"electronics","channel":"podcast"}
product
string
Optional
Name or ID of the product involved.
headphones123
cookie
string
Optional
Browser cookie or session identifier.
abc123xyz

{{}} denote values to be replaced. Eg for{{referrer_url}}you would replace with the referrer URL value for each event.

Params with a ? such as order_number? are optional.
Replace ADVERTISER_ID with your advertiser ID! It can be found at the top of your pixel page. Here’s our full guide to generating it.
Notion image
 

Step 2: Ensure the data is coming in correctly:

Ensuring that your setup is correct from the start is pivotal for reliable attribution. This is critical to check before campaigns start, ideally at least 2-3 weeks prior, to give plenty of time for corrections!

Here’s how to confirm all is correct with the integration.

 

Questions?

What pages can I use certain event tags on?

You can use the “signup”, “lead”, or “purchase” events on any page you’d like. For example, if you wanted to measure how many exposed listeners visited a Sign-up page, you could fire the “signup” event on page view. Then, once they completed the form, you could fire the Lead event, passing us the hashed email. We recommend placing the “visit” tag on all pages.

How to update existing Shopify Integration to take advantage of the new s2s tracking?

If you’re already using the Podscribe Shopify app and want to enable the new server-to-server (S2S) tracking functionality, simply open the Podscribe app from your Shopify admin. You’ll see a pop-up prompting you to update, just click Update to enable enhanced tracking.

This update unlocks more granular event tracking, including data that may have been missed due to ad blockers, cookie consent denial, or browser restrictions. It also enables offline and Amazon purchase tracking when those stores are connected to Shopify.

Can I use custom event names? I want to create and track other events besides installs, view, signups, leads, and purchases.

Yes! If the primary 5 events are not adequate, we can track custom, additional events. We can also support re-naming the standard event names on our dashboard to names you're more familiar with, such as "Account Creation". To do so, you would simply change the name of the action in your javascript tag from "purchase" or "view" to the custom event name you'd like:

Notion image
Instead of loading the script bundle, can we call a 1x1 image pixel, or pass events server-side, or in batch?

Yes - please see this guide.

How do I know which advertiser to pick? There are many that pop up with the name of the advertiser.

Podscribe regularly removes duplicate advertisers, but here are some steps that you can take to ensure you're selecting the right advertiser.

  1. Look up the different advertisers with the same name on Podscribe.
    1. Notion image
      Notion image
  1. Check all of the advertisers one by one. If the logo and website are correct, then that advertiser is likely the correct one.
    1. Notion image

      Select the name displayed on the advertiser page as the advertiser’s name when creating your campaign:

      Notion image

      If you can’t find the advertiser you’re looking for, feel free to reach out to adops@podscribe.com.

What is the Content Security Policy (CSP) for the Podscribe web tag?
Content-Security-Policy:

default-src
self

script-src
d34r8q7sht0t9k.cloudfront.net

connect-src
verifi.podscribe.com
verifi.pdscrb.com
pixel.tapad.com
ipv4.podscribe.com
ipv4.pdscrb.com
How to integrate using a Shopify Custom Pixel, instead of the Shopify app, for Shopify stores?

See here for general info on Shopify Custom Pixels, and below for the Podscribe code.

👆

Be sure to replace YOUR_USER_ID and YOUR_ADVERTISER_ID with your IDs.

(function (w, d) {
    var id = 'podscribe-capture',
        n = 'script';
    var e = d.createElement(n);
    e.type = 'text/javascript';
    e.id = id;
    e.async = true;
    e.src = 'https://d34r8q7sht0t9k.cloudfront.net/tag.js';
    var s = d.getElementsByTagName(n)[0];
    s.parentNode.insertBefore(e, s);
    e.onload = onLoad;
})(window, document);

function onLoad() {
    podscribe('init', { user_id: YOUR_USER_ID, advertiser: YOUR_ADVERTISER_ID });

    analytics.subscribe("page_viewed", (event) => {
        window.podscribe('view', { source: "shopify-custom" });
    });

    analytics.subscribe("product_viewed", (event) => {
        window.podscribe('ViewContent', { source: "shopify-custom" });
    });

    analytics.subscribe("search_submitted", (event) => {
        window.podscribe('Search', { source: "shopify-custom" });
    });

    analytics.subscribe("product_added_to_cart", (event) => {
        window.podscribe('AddToCart', {
            currency: event.data?.cartLine?.merchandise?.productVariant?.price?.currencyCode,
            value: event.data?.cartLine?.merchandise?.productVariant?.price.amount,
            source: "shopify-custom"
        });
    });

analytics.subscribe("payment_info_submitted", (event) => {
    window.podscribe('AddPaymentInfo', {source: "shopify-custom"});
});

analytics.subscribe("checkout_started", (event) => {
    window.podscribe('InitiateCheckout', {source: "shopify-custom"});
});

analytics.subscribe("checkout_completed", (event) => {
    try {
        const allDiscountCodes = event.data?.checkout?.discountApplications?.map(
            (discount) => {
                if (discount.type === "DISCOUNT_CODE") {
                    return discount.title;
                }
            }
        );
        discountCode = allDiscountCodes ? allDiscountCodes.filter(Boolean).join(", ") : undefined;
    } catch (e) {
        console.log(e);
    }

    window.podscribe('purchase', {
        value: event.data?.checkout.totalPrice?.amount,
        currency: event.data?.checkout.totalPrice?.currencyCode,
        order_number: event.data?.checkout?.order?.id,
        hashed_email: event.data?.checkout.email,
        num_items_purchased: event.data?.checkout.lineItems?.length,
        source: "shopify-custom",
        discount_code: discountCode
    });
});
}
 
I have a new client! What's the fastest way to get javascript pixels to send them?

It is to generate them from the Tag Setup tab:

Notion image
How important is it to include a hashed email in the pixel? If we do not, what would we lose out on?

Sending us hashed emails lets us find 10-20% more attributed conversions, so it is certainly helpful to have! Here’s further detail on the part that hashed emails play in attribution. If you send us raw emails, we hash them as they come in and only store the hashed ones.

What mobile device partners (MMPs) does Podscribe work with?

Podscribe works with all major MMPs including: Adjust, Appsflyer, Kochava, Singular, Tealium, Branch, and Segment.

What client data & PII does Podscribe collect as part of its measurement methodology, and how?

The only PII Podscribe collects from advertisers are IP addresses. Podscribe never collects real names, addresses, billing details, raw emails, or any medical info. Podscribe only collects & relies upon anonymous digital identifiers, specifically:

  • IP address
  • User agent
  • Device cookie ID
  • Page URL
  • IDFA or GAID for in-app events
  • MD5 or SHA256 hashed email
  • timestamp
  • Purchase Metadata: Order ID, Amount, Discount Code, Product Name, etc

When the pixel on a brand’s site fires, it sends a request to our AWS servers located in the US. We receive incoming requests and store them in an encrypted format in our Kafka system, which is located in a private VPC. These requests have a Time-to-Live (TTL) of 7 days. We store the complete requests securely for a limited period because we are unable to process all the necessary data quickly enough to maintain a live HTTP connection.

If we receive raw emails (not hashed), we hash them upon receipt, and discard any other PII (other than IP address) in case anything was accidentally shared.

We then store the data in AWS data centers in the US, specifically US-east-1 and US-west-1, encrypting sensitive data. The data is destroyed in 5 years, or if no longer commercially useful, or if deletion is requeste

How can I pass my attribution results back to my MMP?

At the moment, this isn't possible. MMPs like Adjust and Appsflyer send Podscribe raw event data for attribution, but the results stay within Podscribe and aren't sent back. As a workaround, you can use the Individual Conversions CSV export or API to access your attributed conversion data.

Did this answer your question?
😞
😐
🤩