Events Management

    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. 1

      Open the layout builder

      Open the page you want in the Advanced Layout Builder.

    2. 2

      Add a widget

      Click Add element and choose Widget. Only the event owner can add widgets.

    3. 3

      Choose its code

      Pick one of the built-in examples, one of My saved widgets, or paste your own code.

    4. 4

      Place it

      Move and resize the widget on the canvas like any other element.

    5. 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. 1

      Read the context

      Call EPD.getContext() to greet the guest or react to earlier answers.

    2. 2

      Show your interface

      Build the screen with normal HTML, CSS, and JavaScript. Widgets cannot reach the app, your login, or cookies.

    3. 3

      Save the outcome

      Call EPD.submitResult({ ... }) for values and EPD.submitImage for pictures. They are stored with the guest session.

    4. 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. 1

      Add a button

      Add a button element to the page.

    2. 2

      Set its action to Launch widget

      In the button settings, choose the action Launch widget.

    3. 3

      Pick the widget

      Choose the widget the button opens from the list of widgets on the page.

    4. 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. 1

      Select the widget

      Select the widget on the canvas to open its settings.

    2. 2

      Add a webhook URL

      Enter a full https:// address. If the field is empty, nothing is sent.

    3. 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.

    1