Whop Ads Tracking
Track conversions from your funnel pages to the Whop Pixel using the HandL JS library.
Base Installation
Prerequisites
- HandL JS library must be loaded on your page
- You must have a Whop Account ID from your Whop Dashboard
Step 1: Get Your Whop Account ID
- Log in to your Whop Dashboard
- Look at the dashboard URL
- Copy the portion after
dashboard/that begins withbiz_(format:biz_xxxxxxxxxxxxx)
Step 2: Initialize Whop Pixel
Add the following script to your HTML page before the HandL script tag:
<script>
// Set your Whop Account ID
window.whop_account_id = 'YOUR_WHOP_ACCOUNT_ID_HERE';
</script>
<!-- Load HandL script --> Make sure to change your license key
<script>
var handl_custom_params = [];
var handl_js = document.createElement("script");
handl_js.setAttribute("src", "https://track.utmsimple.com/utm.js?license=<license code goes here>"), document.head.appendChild(handl_js),
handl_js.onload = function() {
/*This is the UTM Simple ready event, you can put any code you'd like to trigger after the script fully loaded here*/
console.log("I'm ready")
console.log("prnting all the cookies")
console.log(HandL.getAll())
};
</script>
Example:
<script>
window.whop_account_id = 'biz_xxxxxxxxxxxxx';
</script>
<script src="https://cdn.example.com/utm.js"></script>
Multiple Accounts
To track the same funnel across several Whop accounts, pass an array of Account IDs:
<script>
window.whop_account_id = ['biz_xxxxxxxxxxxxx', 'biz_yyyyyyyyyyyyy'];
</script>
Note: Do not also paste Whop's own pixel snippet on the page. HandL loads it for you, and adding both will double-count your events.
Step 3: Verify Installation
After the page loads, the Whop Pixel will automatically:
- Load the Whop Pixel script
- Set your account scope
- Fire a
pageevent
You can verify the installation by:
- Opening browser DevTools (F12)
- Going to the Network tab
- Filtering for
t.whop.tw - You should see requests to Whop's tracking endpoint
Event Sending
Basic Event Sending
Use the HandL.sendWhopEvent() function to send events to Whop:
HandL.sendWhopEvent(eventName, eventData);
Parameters:
eventName(string, required): The name of the eventeventData(object, optional): Event properties and customer information
Note: Do not track Whop's native checkout, subscriptions or trials. Whop records those itself. Use sendWhopEvent only for funnel steps on your own pages.
Standard Events
Whop supports the following standard events:
lead
Track contact info or opt-in form submissions:
HandL.sendWhopEvent('lead', {
event_id: 'lead_8f21c0'
});
schedule
Track call or appointment bookings:
HandL.sendWhopEvent('schedule', {
value: 50,
currency: 'USD'
});
submit_application
Track application submissions:
HandL.sendWhopEvent('submit_application');
contact
Track conversation or contact requests:
HandL.sendWhopEvent('contact');
complete_registration
Track signup or registration completion:
HandL.sendWhopEvent('complete_registration');
view_content
Track key page or content views:
HandL.sendWhopEvent('view_content');
add_to_cart
Track items added to cart:
HandL.sendWhopEvent('add_to_cart', {
value: 19.99,
currency: 'USD'
});
purchase
Track completed sales on your own checkout only:
HandL.sendWhopEvent('purchase', {
value: 29.99,
currency: 'USD',
event_id: 'order_12345'
});
Custom Events
You can also send custom events with any event name:
HandL.sendWhopEvent('CustomEventName', {
value: 10,
currency: 'USD'
});
Event Data Parameters
Common event parameters you can include:
| Parameter | Type | Description | Example |
|---|---|---|---|
value | number | Monetary value of the event | 29.99 |
currency | string | Currency code (ISO 4217), defaults to USD | 'USD', 'EUR' |
event_id | string | Unique identifier, prevents duplicate counting | 'order_12345' |
Customer information fields can also be passed here. See Advanced Matching.
Advanced Matching
Advanced matching allows Whop to match events to users more accurately by sending customer identifiers alongside the event.
Important: Unlike TikTok and Meta, Whop expects customer fields in plain text. HandL sends them unhashed by design. Do not hash emails or phone numbers before passing them.
How It Works
- Data Collection: When users fill out forms, HandL automatically captures customer details. Data is stored in localStorage with keys such as
em(email) andph(phone). - Automatic Merging: Every call to
HandL.sendWhopEvent()merges any stored customer values into the event payload. Fields you pass directly always override the stored values. - External ID: Uses the
first_handlIDcookie asexternal_id. This is automatically generated on first visit. - Full Name: When a first or last name is available, HandL composes
nameautomatically.
Manual Data Collection
You can pass customer fields directly on any event:
HandL.sendWhopEvent('lead', {
event_id: 'lead_8f21c0',
email: 'visitor@example.com',
first_name: 'Jane',
last_name: 'Doe',
phone: '+15551234567'
});
Advanced Matching Parameters
Whop supports the following identifiers (all sent as plain text):
| Parameter | Description | Source |
|---|---|---|
email | User's email address | localStorage.getItem('em') |
first_name | User's first name | localStorage.getItem('fn') |
last_name | User's last name | localStorage.getItem('ln') |
name | Full name | Composed from first and last name |
phone | User's phone number | localStorage.getItem('ph') |
city | User's city | localStorage.getItem('ct') |
state | User's state | localStorage.getItem('st') |
postal_code | User's postal code | localStorage.getItem('zp') |
country | User's country | localStorage.getItem('country') |
external_id | Unique identifier | Cookies.get('first_handlID') |
Empty fields are dropped automatically and never sent.
Verification
To verify advanced matching is working:
- Open browser DevTools (F12)
- Go to the Network tab
- Filter for
t.whop.tw - Inspect the request payload and confirm your customer fields are present
Custom Events / Listeners
Listening to Whop Events
HandL fires custom events you can listen to:
// Listen for Whop initialization
document.body.addEventListener('UTMSimpleWhopInitCompleted', function(event) {
console.log('Whop Pixel initialized');
});
// Listen for any Whop event completion
document.body.addEventListener('UTMSimpleWhopEventCompleted', function(event) {
console.log('Whop event sent');
});
// Listen for specific event completion
document.body.addEventListener('UTMSimpleWhoppurchaseCompleted', function(event) {
console.log('Purchase event sent to Whop');
});
Note: The event-specific listener name is UTMSimpleWhop + your event name + Completed, using the event name exactly as you passed it. Because Whop's standard events are lowercase, sendWhopEvent('purchase') fires UTMSimpleWhoppurchaseCompleted.
Example: Track Button Clicks
document.getElementById('book-call-button').addEventListener('click', function() {
HandL.sendWhopEvent('schedule', {
value: 50,
currency: 'USD'
});
});
Example: Track Form Submissions
<form id="contact-form" onsubmit="trackFormSubmission(event)">
<!-- form fields -->
</form>
<script>
function trackFormSubmission(event) {
// Form submission logic here
HandL.sendWhopEvent('lead', {
event_id: 'lead_' + Date.now()
});
}
</script>