Skip to main content

Checkout Purchase Flow

Understand what happens after a successful purchase

After a user completes a purchase on your Uscreen storefront, they're directed to a confirmation page that appears for 10 seconds before automatically redirecting them. This brief delay serves two important purposes:

  1. It allows any tracking code or conversion pixels to run

  2. It gives users a moment to see the purchase confirmation

ℹ️ INFO: This article covers both Legacy Checkout and Unified Checkout. Where they differ, each section notes it. If you're not sure which one your store uses, contact our support team.


Default Redirect Behavior

After the 10-second delay, users are redirected based on where they started the checkout process.

  • From the Join Us page: Users are redirected to the Catalog (/catalog)

  • From a specific video, collection, or live event: Users are redirected back to that specific content page (/programs/seoURL)

  • From a bundle link: Users are redirected to the Library page if My Library (.../library) is enabled or the Catalog, if disabled

To determine where to redirect users, Uscreen uses cookies to track the last viewed content. This ensures a seamless user experience by returning customers to the content they were interested in.

📝 NOTE: If you're testing the checkout flow and clicking around multiple pages before completing a purchase, you might get redirected to an unexpected location. Use an incognito browser or clear the cookies for more predictable testing.


Custom Conversion Tracking

If you need to track conversions for web purchases in platforms outside of Uscreen (like ad platforms or analytics tools), you can use the purchase payload available on the confirmation page. The payload is a JavaScript object named purchasePayload. Uscreen adds it to the page just before your Purchase Code Snippet runs, so your snippet can read it right away.

Confirmation Page URL Structure

The confirmation page URL depends on which checkout your store uses and how the payment was processed. We recommend reading purchase details from the purchase payload rather than from URL parameters, because URL formats differ between checkouts (see Recommended Setup for Per-Payment Tracking below).

Legacy Checkout: Uscreen Billing

Example: https://yourdomain.com/checkout/success?i=12345678&o=543210&p=543210

ℹ️ INFO: For subscription or bundle purchases, you'll notice that the offer ID and the product ID are identical.

Legacy Checkout: Stripe Billing (Paid Purchase)

Example: https://yourdomain.com/checkout/success?o=543210&payment_intent=pi_abc123

Used when a payment was taken at checkout. This includes subscriptions without a free trial, as well as one-time purchases.

  • payment_intent = the Stripe payment intent ID

  • o = the order ID (offer ID)

Legacy Checkout: Stripe Billing (No Payment Taken)

Example: https://yourdomain.com/checkout/success?o=543210&subscription=sub_abc123

Used when a subscription starts without a payment at checkout, such as a free trial or a fully discounted first period.

  • subscription = the Stripe subscription ID

  • o = the order ID (offer ID)

📝 NOTE: A Stripe subscription ID stays the same across every renewal, so it doesn't identify a single payment.

Legacy Checkout: Stripe Billing (Free or Added via Signup)

  • o = the order ID (offer ID)

  • added_with_signup = true (indicates a free product added via signup and no invoice created)

ℹ️ INFO: For free products added via signup, the confirmation URL uses ?o=...&added_with_signup=true and does not include an invoice ID, as no paid invoice is created.

Unified Checkout

Example: https://yourdomain.com/buy/3f2a9c1e-1b2c-4d5e-8f90-123456789abc/success

  • The value in the path is the checkout session ID. It's created once for each checkout visit and identifies that checkout attempt, not an individual payment.

  • The URL doesn't include payment_intent, subscription, or invoice parameters. Use the purchase payload to read transaction details.

🔗 Learn more about Stripe Billing

Purchase Payload

When a purchase is completed, Uscreen adds a JavaScript object named purchasePayload to the confirmation page.

It's available as soon as the page loads, before your Purchase Code Snippet runs, so your code can read it directly (for example, purchasePayload.transaction_id).

amount: "7.99"
country_code: "US"
coupon: null
customer_email: "user@email.com"
customer_name: "name"
discount: "0.00"
id: "12345678"
ip_address: "192.168.0.0"
offer_id: 543210
origin: "purchased_by_user"
title: "Monthly Subscription"
total: "7.99"
transaction_id: "ch_abc123"

ℹ️ INFO: On both Legacy and Unified Checkout, the purchase payload and your Purchase Code Snippet are added to the confirmation page for every successful checkout, including free trials and $0 checkouts. For those, transaction_id is empty because no payment was taken.

Field

What it contains

transaction_id

The unique ID of the payment. For Stripe payments, this is the Stripe charge ID (ch_…). For PayPal payments, it's the PayPal transaction (capture) ID. It's different for every payment. Empty when no payment was taken, such as a free trial or a $0 checkout

id

The Uscreen invoice ID. It can be empty on the confirmation page because the invoice may be created a few seconds after the page loads. Use transaction_id to identify the payment.

offer_id

The offer ID of the purchased subscription, bundle, or content.

title

The offer's name.

total

The offer's price before discounts.

discount

The discount amount applied.

amount

The final amount Uscreen recorded for the order. It may differ from the amount charged to the customer.

coupon

The coupon code used, if any.

country_code

The billing country, when available.

origin

How the purchase was made (for example, purchased_by_user).

customer_email, customer_name, ip_address

Customer details.

⚠️ WARNING: customer_email, customer_name, and ip_address are personal information. Don't send them to analytics or ad platforms unless your privacy policy and the platform's terms allow it.

Working with the Payload Values

Keep these in mind when you send payload values to analytics or ad platforms:

  • Currency: The payload doesn't include a currency field. Amounts are in the currency the customer paid in.

    • If your store sells in a single currency, that's your store's currency, so you can set it directly in your tracking code.

    • If you sell in additional currencies, the payment may be in the customer's local currency, and the confirmation page doesn't expose which one. For those sales, use the Order Paid webhook: its localized_amounts.currency field gives the currency the customer paid in. Its transaction_id matches the payload's, so you can match the two.

  • Number format: Amounts (total, amount, discount) are text values, for example "7.99". Convert them to numbers if your platform requires it, for example with parseFloat(purchasePayload.amount).

  • Empty values: When a field has no value, it may be empty text ("") or null, depending on your checkout. Check whether a field has a value (for example, if (purchasePayload.transaction_id)) rather than comparing it to "".

  • ID format: transaction_id is a different value from the payment_intent URL parameter. A Stripe charge ID starts with ch_, while a payment intent ID starts with pi_. If you switch your tracking from the URL parameter to transaction_id, new conversions will use a different ID than your historical data.

Pair this data with any cookies or URL parameters you might have stored to pass conversion data to another platform.

⚠️ WARNING: Our support team cannot provide in-depth assistance with setting up the custom tracking code. For specialized help, we recommend consulting with a web developer or analytics professional.


Recommended Setup for Per-Payment Tracking

To track each payment once, and to keep your tracking working on both Legacy and Unified Checkout:

  1. In your Purchase Code Snippet, read purchasePayload.transaction_id instead of URL parameters.

  2. Push it to your data layer along with the fields you need

  3. In Google Tag Manager, create a Data Layer Variable for transaction_id and use it in your purchase tag.

📝 NOTE: The confirmation page only appears for the first payment. Subscription renewals never reach it. To track every payment, including renewals, use the Order Paid webhook.

For example:

<script>
if (window.purchasePayload && purchasePayload.transaction_id) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'uscreen_purchase',
transaction_id: purchasePayload.transaction_id,
value: parseFloat(purchasePayload.amount),
currency: 'USD', // replace with your store's currency
offer_id: purchasePayload.offer_id
});
}
</script>

ℹ️ INFO: The check on purchasePayload.transaction_id skips checkouts where no payment was taken. Remove it if you also want to track free trials.


Test the Checkout

You can easily test the checkout and create a mock purchase by using a coupon code. This is a good and simple way to ensure your tracking code is working correctly.

Also, check your third-party application to confirm that the conversion data is being received.

Even with a coupon applied, the successful purchase will generate an invoice, fire the Order Paid webhook and Paid Order trigger, and add the purchase payload to the confirmation page.


Custom Redirect after Successful Purchase

If you want to change the default redirect behavior, you can add custom JavaScript to the Purchase Code Snippet.

📝 NOTE: Uscreen redirects from the confirmation page after ~10 seconds by default. Setting a shorter timeout in your Purchase Code Snippet overrides this. Make sure your tracking code has enough time to run before the redirect happens.

<script>
// Replace with your desired URL
let redirectURL = "https://example.com/thank-you";

// Set a shorter timeout than Uscreen's default (10 seconds)
setTimeout(function() {
window.location.assign(redirectURL);
}, 4000);
</script>

⚠️ WARNING: If you are unfamiliar or uncomfortable working with JavaScript, please consider consulting a developer for proper implementation.


FAQs

Can I track conversions from mobile app purchases?

The purchase payload is only available for web purchases. Mobile app purchases are processed through the app stores and require different tracking methods.

Why is my tracking code not firing?

The success page only appears for 10 seconds, so your code needs to execute within that time frame. Make sure your code is properly placed in the Purchase Code Snippet section and doesn't have any errors.

Can I completely remove the 10-second delay?

We don't recommend removing the delay entirely, as it ensures tracking pixels have time to fire. However, you can reduce it using the custom redirect code above.

How can I track which marketing campaign led to a conversion?

You can use UTM parameters in your marketing links and store them in cookies or local storage. Then, in your tracking code, retrieve these parameters and include them with your conversion data.

Does custom conversion tracking work with Unified Checkout?

Yes. The purchase payload and Purchase Code Snippet work on both checkouts, for every successful purchase. On Unified Checkout, the confirmation URL is different (/buy/<checkout-session-id>/success) and doesn't include payment or invoice parameters. If your tracking reads values from the URL, switch to reading purchasePayload.transaction_id, as shown in Recommended Setup for Per-Payment Tracking.

Can I track subscription renewals on the confirmation page?

No. Renewals are charged automatically and never reach the confirmation page. Use the Order Paid webhook to track renewal payments.

Did this answer your question?