Custom Widgets
Add games, forms, and custom steps to your workflow pages, and save what guests do with their session.
Add custom widgets such as a prize spin wheel, scratch card, countdown, or feedback form to your workflow pages. Widgets are small HTML and JavaScript apps that can save results with the guest session, send a webhook, and launch from a button.
What is a widget?
A widget is a small, self-contained mini app that you place on a page with the Advanced Layout Builder. It is written in HTML, CSS, and JavaScript, and it can be a prize spin wheel, a scratch card, a countdown, a feedback form, a photo picker, or anything else you need. Widgets are ideal for gamification and custom workflows.
Screenshot placeholder — A prize spin wheel widget placed on a landing page
Adding a widget to a page
- 1
Open the layout builder
Open the page you want in the Advanced Layout Builder.
- 2
Add a widget
Click Add element and choose Widget. Only the event owner can add widgets.
- 3
Choose its code
Pick one of the built-in examples, one of My saved widgets, or paste your own code.
- 4
Place it
Move and resize the widget on the canvas like any other element.
- 5
Apply the layout
Click Apply layout to save it with the event.
Screenshot placeholder — The widget element selected on the canvas with the code box and example list
Only the event owner can add widgets and edit their code.
Built-in examples
Start from a ready-made widget and change its settings, or use it as a base for your own:
Prize spin wheel
A casino-style wheel with odds, spin limits, sounds, glowing lights, and confetti. The prize is saved with the session.
Scratch card
A scratch-off card with prize odds, card limits, sounds, and confetti. The prize is saved with the session.
Event countdown
A flip-style countdown with a progress bar, rotating messages, an urgency mode, and confetti at zero.
Feedback and rating
An emoji rating with follow-up reasons and a comment box, saved as a rating, tags, and a comment.
Photo Booth Pick
Guests upload and crop a photo or search for images and add a caption in a polaroid frame. The photo link and caption are saved.
Sticker and icon picker
Guests search stickers and icons and pick one or more. The image links are saved with the session.
Detected settings: edit without code
The builder reads your widget code and turns its main settings into a simple form, so you can change them without touching the code. Changing a field rewrites that line in the code for you.
On and off switches
True or false settings appear as toggles, such as turning sounds or confetti on or off.
Text and numbers
Titles, messages, limits, and similar values appear as text or number fields, and long messages get a larger box.
Colors and dates
Colors open a color picker, and dates and times open a date and time picker.
Lists and tables
Lists such as the prizes on a wheel can be edited row by row, with buttons to add and remove rows.
Screenshot placeholder — The Detected settings form for a prize spin wheel widget
Not a developer? Start from a built-in example and use the detected settings form to rename the prizes, change the odds, and set the colors.
Talking to the event
Widgets run in an isolated frame, so they cannot access the app, your login, or cookies. They talk to the event through a small set of calls on EPD:
EPD.getContext()
Reads information about the event and the session, such as the event name, so the widget can personalize itself.
EPD.submitResult({...})
Saves the values you pass, for example a prize or a rating, with the guest session.
EPD.next()
Moves the guest on to the next step, as if they tapped the page button.
Using the widget API
Beyond the three basic calls, EPD includes helpers for images and webhooks. The Widget API box under the code field in the builder always lists every call available to your widget.
Context fields
EPD.getContext() returns a Promise with eventId, eventName, page, sessionId, and data. On survey and pre-event pages it also includes the answers given so far, keyed by question title.
EPD.submitImage('key', url)
Saves an https:// image link as text under a key. You can then use it anywhere as {widget.key}, for example as a design image or a live background.
EPD.uploadImage(file)
Uploads a JPEG, PNG, or WebP file (up to 5 MB) and returns a Promise with a hosted https:// link.
EPD.searchImages(query, { limit: 12 })
Returns a Promise with a list of { url, thumb, name }. Available to signed-in users only and limited to 10 searches a minute.
EPD.sendWebhook({...})
Posts values to the widget webhook when it is turned on, see Sending widget results to a webhook.
A typical widget follows four steps:
- 1
Read the context
Call
EPD.getContext()to greet the guest or react to earlier answers. - 2
Show your interface
Build the screen with normal HTML, CSS, and JavaScript. Widgets cannot reach the app, your login, or cookies.
- 3
Save the outcome
Call
EPD.submitResult({ ... })for values andEPD.submitImagefor pictures. They are stored with the guest session. - 4
Continue the flow
Call
EPD.next()when the guest is done, optionally after a short delay.
Here is a minimal widget that puts these steps together:
<h2 id="hello"></h2>
<button id="yes">Count me in!</button>
<script>
EPD.getContext().then(function (ctx) {
document.getElementById('hello').textContent = 'Welcome to ' + ctx.eventName;
});
document.getElementById('yes').onclick = function () {
EPD.submitResult({ joined: 'yes' });
setTimeout(function () { EPD.next(); }, 800);
};
</script>Turn on Run Widget above the canvas to try the calls with sample data. The preview log lists every call and nothing is saved.
Where widget results go
Values saved with EPD.submitResult are stored with the guest session. They show up with the survey responses (see Manage Responses), can be sent to your systems with a webhook, and an image link saved by a widget can be used as the background of a camera question, see Live Background Removal.
Launching a widget from a button
A widget can appear on the page right away, or only when a guest taps a button.
- 1
Add a button
Add a button element to the page.
- 2
Set its action to Launch widget
In the button settings, choose the action Launch widget.
- 3
Pick the widget
Choose the widget the button opens from the list of widgets on the page.
- 4
Look for the rocket
A widget that is linked to a button is marked with an orange rocket icon. Hover over it to see what it means.
Screenshot placeholder — A button with the Launch widget action and the linked widget marked with a rocket icon
Sending widget results to a webhook
Every widget can send what it saves to your own system, such as a CRM or a spreadsheet, whatever the widget code does.
- 1
Select the widget
Select the widget on the canvas to open its settings.
- 2
Add a webhook URL
Enter a full https:// address. If the field is empty, nothing is sent.
- 3
Turn the webhook on
Use the toggle to turn sending on or off without deleting the URL.
Previewing a widget
Turn on Run Widget above the canvas to run the widget with sample data. A preview log lists the EPD.submitResult and EPD.next calls and any errors, and nothing in the log is saved. Webhooks are shown in the log, but they are not sent during a preview.
Saving widgets for reuse
Click Save this widget to keep it in My saved widgets, then pick it again on other pages and events. Deleting a saved widget does not affect layouts that already use it, because they keep their own copy.