The Nunify registration embed widget can send analytics events to your existing tracking tools — Google Tag Manager, Google Analytics 4, and Facebook Pixel — so you can measure every step of your registration funnel without any extra instrumentation.
This guide explains what events are tracked, what data they carry, where they are sent, and how to turn tracking on.
Before You Begin
Make sure you have:
A Nunify event with an event code.
The Nunify embed script (
embed.js) added to your page.At least one of the following already installed on your page:
Google Tag Manager (
window.dataLayer)Google Analytics 4 (
gtag)Facebook Pixel (
fbq)
Enabling Tracking
Add trackingEnabled: true to your widget configuration. That's it — the widget will automatically detect which analytics tools are present on your page and forward events to all of them.
<script>
window.NunifyWidgets.createRegistrationWidget({
eventCode: 'my-event-code',
elementId: 'registration-widget',
trackingEnabled: true,
});
</script>
What Events Are Tracked?
The widget tracks key moments in the registration funnel. Each event fires automatically as the attendee progresses through the form.
1. Registration Loaded (registration_loaded)
Sent when the registration form finishes loading inside the embed.
Data sent: None — this event simply signals that the form is ready.
2. Tickets Selected (tickets_selected)
Sent when the attendee picks their tickets and moves to the next step.
Data sent:
{
"tickets": [
{ "name": "Early Bird", "quantity": 2 },
{ "name": "VIP Pass", "quantity": 1 }
]
}
3. Attendee Details Filled (attendee_details_filled)
Sent after the attendee submits their details and an order is created on the backend.
Data sent: None.
4. Payment Required (payment_required)
Sent when the attendee is shown the payment step (only applies when the order total is greater than zero).
Data sent: None.
5. Order Success (order_success)
Sent when payment is confirmed and the registration is complete. This is the most data-rich event and carries the full order summary.
Data sent:
{
"order": {
"id": "order_abc123",
"total_amount_paid": 150.00,
"applied_coupon_code": "EARLYBIRD20",
"tickets": [
{ "ticket": "Early Bird", "addons": ["Workshop Access"] },
{ "ticket": "VIP Pass", "addons": [] }
]
}
}
Where Are Events Sent?
The widget maps registration events to standard ecommerce event names that each platform recognises. Events that don't have a specific mapping are forwarded with their original name and payload.
Google Tag Manager (dataLayer)
Registration Event | GTM Event Name | Ecommerce Data |
Tickets Selected |
|
|
Order Success |
| Transaction ID, total value, coupon code, and line-item details |
All other events | Original name | Full payload as-is |
Google Analytics 4 (gtag)
Registration Event | GA4 Event Name | Parameters |
Tickets Selected |
|
|
Order Success |
|
|
All other events | Original name | Full payload as params |
Facebook Pixel (fbq)
Registration Event | FB Pixel Event | Parameters |
Tickets Selected |
|
|
Order Success |
|
|
All other events | Original name | Full payload as params |
UTM Parameter Forwarding
The widget automatically picks up UTM parameters from your page URL and passes them into the registration form. The following parameters are captured:
utm_sourceutm_mediumutm_campaignutm_contentutm_term
If you want to override the auto-detected values, pass a tracking object in the widget config:
window.NunifyWidgets.createRegistrationWidget({
eventCode: 'my-event-code',
elementId: 'registration-widget',
trackingEnabled: true,
tracking: {
utm_source: 'website',
utm_medium: 'embed',
utm_campaign: 'launch-2026',
},
});
Advanced: Handling Events Yourself with onTrackEvent
If you use a different analytics provider, or want to run custom logic when events fire, you can provide an onTrackEvent callback. This works independently of trackingEnabled — you can use both together, or just one.
<script>
window.NunifyWidgets.createRegistrationWidget({
eventCode: 'my-event-code',
elementId: 'registration-widget',
// Send events to GTM / GA4 / FB Pixel automatically
trackingEnabled: true,
// Also handle events yourself
onTrackEvent: function (event) {
console.log('Event:', event.kind, event.data);
// Example: forward to your own backend
fetch('/api/analytics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
event_name: event.kind,
event_data: event.data,
timestamp: new Date().toISOString(),
}),
});
},
// Registration lifecycle callbacks
onRegistrationSuccess: function (data) {
console.log('Registration complete:', data);
},
onRegistrationFailure: function (data) {
console.log('Registration failed:', data);
},
});
</script>
The callback receives an object with two fields:
Field | Type | Description |
| string | The event name (e.g., |
| object | The event payload — an empty object |
Registration Funnel at a Glance
Registration Loaded ← form is ready
↓
Tickets Selected ← attendee picks tickets
↓
Attendee Details Filled ← form submitted, order created
↓
Payment Required ← shown if total > $0
↓
Order Success ← payment confirmed, registration complete
Each step fires an event that flows from the embed to your page, where it is forwarded to your analytics tools.
Frequently Asked Questions
Do I need to install anything extra for tracking to work?
No. Just set trackingEnabled: true and make sure your analytics scripts (GTM, GA4, or Facebook Pixel) are loaded on the same page as the embed. The widget handles the rest.
Can I use tracking with the modal (pop-up) widget too?
Yes. Both createRegistrationWidget (inline) and createRegistrationButtonWidget (modal) support the same tracking options.
What if I don't have GTM, GA4, or Facebook Pixel?
Use the onTrackEvent callback to capture events and send them wherever you need — your own backend, Mixpanel, Segment, or any other tool.
Will tracking slow down the registration form?
No. Events are dispatched asynchronously and do not block the registration flow.