A plain-English guide to setting up the welcome pack offer campaign in Optimove โ no technical background needed.
When a brand-new player visits the site for the first time, a popup appears showing three welcome offers. The player picks one, and Optimove automatically applies the right bonus to their account.
Three things happen in sequence when a new player sees and interacts with the popup.
Optimove detects a new player and shows the welcome pack popup on their first visit to the site.
Player clicks one of the three offer cards. A confirmation screen shows for 1.5 seconds, then the popup closes automatically.
Optimove is notified which offer the player picked and immediately applies the matching bonus to their account.
Each offer has a unique Award ID. Optimove uses these IDs to know which bonus to apply when a player makes their selection. You'll need them when setting up the campaign branches.
Follow these steps inside Optimove to configure the campaign. You'll need access to the Campaigns and Triggers sections.
Create a campaign that targets new players on their first visit. This campaign's only job is to display the welcome pack popup. In the campaign's popup step, open the popup code editor and paste the popup HTML from the bottom of this page โ or use a custom popup you've built (see the guidance in the Popup Code section below).
In Optimove, go to Triggers โ Real-Time. Create three separate triggers, one for each
offer. All three use the same event (promo_award_selected) and the same promo_id
โ which identifies this specific popup campaign and must match whatever value is set in the popup script.
Each trigger then also filters on a different award_id so it only fires for its specific offer.
promo_id to a new unique value in both the popup script and all three triggers. This keeps campaigns isolated so they don't accidentally fire each other's bonuses.
Create a second campaign that is triggered by Campaign 1. Attach it to the three triggers above. Each
trigger fires this campaign with a different award_id, so the campaign knows which bonus to
apply. Set the audience to new players who haven't received a welcome bonus yet.
Use Optimove's test mode to trigger the popup for a test player. Confirm the popup looks right and that
selecting each offer fires the correct trigger. Check the Optimove event stream to verify the right
award_id came through for each offer.
If a developer is modifying the popup HTML, these are the limitations to watch for. The popup code below is already written to work around all of them.
// single-line comments inside scriptsOptimove's editor strips newlines from script blocks. A // comment would comment out all
remaining code on that line. Use /* */ block comments instead, or no comments at all.
?. optional chainingThe editor inserts a space turning ?. into ? ., which breaks JavaScript syntax and
silently kills the entire script. Use && guards instead.
onclick attributesThe site's security policy blocks inline event handlers. Use addEventListener inside the
<script> block โ it works because the script tag itself receives the security nonce.
Attach click handlers to document and use e.target.closest(). Optimove may
re-render the popup DOM after images load, which destroys listeners attached directly to elements.
The block below is an example popup for the welcome pack. You can build your own โ the design and layout can be anything. The only requirement is that the script fires the right event when a player makes a selection.
Every popup that connects to this campaign system needs to do one thing: call optimoveSDK.API.reportEvent() when the player makes a selection. The call must include three values that match what your Optimove triggers are configured to listen for:
promo_award_selected. Must match the event your triggers listen for.welcome_pack_v1). The value in the popup script must exactly match the value in your Optimove triggers โ if they differ, the triggers won't fire. Change it for every new popup campaign.The highlighted lines in teal are the parts that connect to Optimove โ the rest is just design.
<!DOCTYPE html>
<html>
<head>
<title>Optimove Welcome Pack</title>
</head>
<body>
<div class="bee-popup-container">
<style>
.bee-popup-container h1,
.bee-popup-container h2,
.bee-popup-container p {
margin: 0;
padding: 0;
}
.bee-popup-container {
color: #ffffff;
font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
background-color: #000000;
}
.bee-popup-container * {
box-sizing: border-box;
}
.bee-popup-row {
position: relative;
}
.bee-popup-row-content {
max-width: 700px;
position: relative;
margin: 0 auto;
display: flex;
}
.bee-popup-col-w4 {
flex: 4;
}
.bee-popup-col-w12 {
flex: 12;
}
.bee-popup-row-1 .bee-popup-row-content {
flex-direction: column;
align-items: center;
padding: 32px 24px 16px;
gap: 8px;
}
.bee-popup-eyebrow {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.18em;
text-transform: uppercase;
color: #13e3ba;
opacity: 0.8;
}
.bee-popup-heading h1 {
color: #ffffff;
font-size: 30px;
font-weight: 800;
letter-spacing: -0.01em;
text-align: center;
line-height: 1.15;
}
.bee-popup-heading h1 span {
color: #13e3ba;
}
.bee-popup-subheading {
font-size: 13px;
color: rgba(255, 255, 255, 0.45);
text-align: center;
margin-top: 4px;
}
.bee-popup-row-2 .bee-popup-row-content {
padding: 16px 24px 36px;
gap: 12px;
align-items: stretch;
}
.bee-popup-offer {
position: relative;
background: linear-gradient(160deg, #161616 0%, #0e0e0e 100%);
border: 1.5px solid #2a2a2a;
border-radius: 16px;
text-align: center;
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
transition: border-color 0.2s ease, transform 0.15s ease, box-shadow 0.2s ease;
overflow: hidden;
}
.bee-popup-offer::before {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(ellipse at 50% 0%, rgba(19, 227, 186, 0.08) 0%, transparent 70%);
opacity: 0;
transition: opacity 0.2s ease;
pointer-events: none;
z-index: 1;
}
.bee-popup-offer:hover {
border-color: #13e3ba;
transform: translateY(-3px);
box-shadow: 0 8px 28px rgba(19, 227, 186, 0.15);
}
.bee-popup-offer:hover::before {
opacity: 1;
}
.bee-popup-offer:active {
transform: translateY(-1px);
}
.offer-banner {
width: 100%;
display: block;
border-radius: 14px 14px 0 0;
object-fit: cover;
aspect-ratio: 7 / 3;
background-color: #1a1a1a;
}
.offer-body {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
padding: 14px 14px 18px;
width: 100%;
}
.offer-highlight {
font-size: 28px;
font-weight: 800;
color: #13e3ba;
letter-spacing: -0.02em;
line-height: 1;
}
.offer-label {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.55);
margin-top: 2px;
}
.offer-divider {
width: 28px;
height: 1px;
background: rgba(19, 227, 186, 0.25);
margin: 4px auto;
}
.offer-description {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
line-height: 1.4;
}
.offer-badge {
position: absolute;
top: -1px;
right: -1px;
background: #13e3ba;
color: #000000;
font-size: 9px;
font-weight: 800;
letter-spacing: 0.1em;
text-transform: uppercase;
padding: 3px 8px;
border-radius: 0 14px 0 8px;
z-index: 2;
}
.bee-popup-row-divider {
height: 1px;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.06) 30%, rgba(255, 255, 255, 0.06) 70%, transparent);
max-width: 700px;
margin: 0 auto;
}
</style>
<div id="opt-before-select" class="bee-popup-rows-container">
<div class="bee-popup-row bee-popup-row-1">
<div class="bee-popup-row-content">
<div class="bee-popup-eyebrow">New Player Offer</div>
<div class="bee-popup-col bee-popup-col-w12">
<div class="bee-popup-heading">
<h1>CHOOSE YOUR <span>WELCOME PACK</span></h1>
</div>
</div>
<div class="bee-popup-subheading">Pick one offer to claim on your first deposit</div>
</div>
</div>
<div class="bee-popup-row-divider"></div>
<div class="bee-popup-row bee-popup-row-2">
<div class="bee-popup-row-content">
<div class="bee-popup-col bee-popup-col-w4">
<div class="bee-popup-offer" data-award-id="a8822f1a-67d4-4110-be4a-17be0d3480db">
<picture>
<source media="(min-width: 480px)" srcset=" https://swivel-production-public.s3.eu-west-1.amazonaws.com/sw-packages/7a801a29-c686-4a5a-b533-2d3075e164ca.largeImage "><img class="offer-banner" src="https://swivel-production-public.s3.eu-west-1.amazonaws.com/sw-packages/1f1f56c2-20f5-4301-aa89-38c3b00922ba.smallImage" alt="Starter Pack"></picture>
<div class="offer-body">
<div class="offer-highlight">100%</div>
<div class="offer-label">Deposit Bonus</div>
<div class="offer-divider"></div>
<div class="offer-description">Up to $200
<br>matched bonus</div>
</div>
</div>
</div>
<div class="bee-popup-col bee-popup-col-w4">
<div class="bee-popup-offer" data-award-id="0a1ed776-e408-4edf-9f2b-e17d9e6c21a5">
<div class="offer-badge">Popular</div>
<picture>
<source media="(min-width: 480px)" srcset=" https://swivel-production-public.s3.eu-west-1.amazonaws.com/sw-packages/bef4de2e-337e-41ca-83f3-3adb02e24c29.smallImage "><img class="offer-banner" src="https://swivel-production-public.s3.eu-west-1.amazonaws.com/sw-packages/bef4de2e-337e-41ca-83f3-3adb02e24c29.smallImage" alt="Free Spins Pack"></picture>
<div class="offer-body">
<div class="offer-highlight">50</div>
<div class="offer-label">Free Spins</div>
<div class="offer-divider"></div>
<div class="offer-description">No wagering
<br>on winnings</div>
</div>
</div>
</div>
<div class="bee-popup-col bee-popup-col-w4">
<div class="bee-popup-offer" data-award-id="d1fde953-1ed4-4018-a3ba-1f0a9a7defa9">
<picture>
<source media="(min-width: 480px)" srcset=" https://swivel-production-public.s3.eu-west-1.amazonaws.com/sw-packages/99ba733e-6f85-4861-9984-6c7beb27a5bc.largeImage "><img class="offer-banner" src="https://d3aaoo30se75mz.cloudfront.net/1712/2026_05_26_9_00_33/smallImg.png" alt="VIP Pack"></picture>
<div class="offer-body">
<div class="offer-highlight">200%</div>
<div class="offer-label">VIP Bonus</div>
<div class="offer-divider"></div>
<div class="offer-description">Up to $1000
<br>+ priority support</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="opt-after-select" style="display:none; padding:48px 24px; text-align:center; background:#000;">
<div style="font-size:36px; margin-bottom:12px;">โ</div>
<div style="font-size:18px; font-weight:800; color:#13e3ba;">Offer Selected</div>
<div style="font-size:13px; color:rgba(255,255,255,0.45); margin-top:8px;">Your welcome pack will be applied onfirst deposit</div>
</div>
</div>
<script>
console.debug("Popup Open");
document.addEventListener("click", function(e)
{
var offer = e.target.closest(".bee-popup-offer[data-award-id]");
if (!offer)
{
return;
}
var awardId = offer.getAttribute("data-award-id");
if (!window.optimoveSDK)
{
console.warn("[Optimove] SDK missing โ event NOT sent");
return;
}
window.optimoveSDK.API.reportEvent("promo_award_selected",
{
award_id: awardId,
promo_id: 'welcome_pack_v1',
});
document.getElementById("opt-before-select").style.display = "none";
document.getElementById("opt-after-select").style.display = "block";
setTimeout(function()
{
window.optimoveSDK.API.closeRealtimePopup(true);
}, 1500);
});
</script>
</body>
</html>