Widget Reference

All data-* attributes and theming options for the EarlyPass embeddable widget.

Basic embed

Drop the script tag anywhere in your HTML. The widget renders at that location.

<script
  src="https://your-domain.com/widget/widget.js"
  data-campaign="your-slug"
  async
></script>

Or use the custom element directly (useful when you need finer placement control):

<script src="https://your-domain.com/widget/widget.js" async></script>
<early-pass data-campaign="your-slug"></early-pass>

Data attributes

Attribute Required Default Description
data-campaign Yes Your campaign slug (found in the dashboard)
data-theme No light Visual theme: light or dark
data-accent No #4f46e5 Accent colour for buttons and highlights (any CSS colour value)

Theming examples

Dark theme

<script
  src="https://your-domain.com/widget/widget.js"
  data-campaign="your-slug"
  data-theme="dark"
  async
></script>

Custom accent colour

<script
  src="https://your-domain.com/widget/widget.js"
  data-campaign="your-slug"
  data-accent="#10b981"
  async
></script>

Dark theme with custom accent

<script
  src="https://your-domain.com/widget/widget.js"
  data-campaign="your-slug"
  data-theme="dark"
  data-accent="#818cf8"
  async
></script>

Style isolation

The widget renders inside a Shadow DOM. This means:

The trade-off is that you cannot override widget styles from outside. Use data-accent and data-theme for visual customisation.

Widget states

The widget has four states, each rendered automatically:

StateShown when
FormVisitor has not yet signed up
Verification pendingEmail submitted, waiting for verification click
DashboardEmail verified — shows position, referral link, and leaderboard
InvitedUser has been invited (access granted) via the dashboard

State is persisted in localStorage so the widget remembers returning visitors.

Performance

Domain restriction

If you set a Product URL on your campaign (in the dashboard under Settings), the widget API will only accept signups from that origin. Requests from other origins receive a 403 Forbidden response.

This prevents third parties from embedding your widget on unrelated pages. Leave Product URL blank to allow embeds from any origin (useful during development).