Apps, Portals & Widgets
This guide covers how to assemble an attendee experience by adding plugin pages, widgets, and themes to a portal.
Adding a Page to a Project
When you install a plugin page into a project, GXP creates a ProjectPage instance — a copy of the plugin template pinned to a specific version.
- Navigate to Project Dashboard → Pages
- Click Add Page
- Browse or search available plugin pages
- Select the plugin and version to install
- Configure the page's settings (each plugin exposes its own configuration form)
The ProjectPage stores:
- The pinned plugin version
- Resolved dependency values (model references for API access)
- Custom settings, language overrides, and style overrides
Binding Pages to a Portal
A page becomes accessible to attendees when you bind it to a portal. This creates a ProjectPortalPage with a URL slug.
- Navigate to Project Dashboard → Portals → [Your Portal]
- Click Add Page
- Select from your project's installed pages
- Configure the portal page:
| Setting | Purpose |
|---|---|
| URL Slug | The page's URL path (e.g., /schedule, /register) |
| Title | Display title in portal navigation |
| Sort Order | Position in the navigation menu |
| Requires Authentication | Whether attendees must log in to view |
| Access Code | Optional access code gate for the page |
Each portal page automatically receives its own Sanctum API token, which is used by the plugin frontend to make authorized API calls scoped to the page's declared dependencies.
Configuring Pages
Portal pages support three layers of customization that override plugin defaults:
Custom Settings
Behavioral configuration exposed by the plugin developer. Each plugin defines its own settings schema — project admins configure values through the dashboard form builder.
Language Overrides
Override any translatable string defined by the plugin. Useful for localization or customizing labels and messages.
Style Overrides
CSS overrides applied on top of the plugin's default styles and the portal theme.
Adding Widgets
Widgets are global components injected into every portal page. They're designed for persistent functionality like analytics, chat, and notifications.
- Navigate to Project Dashboard → Portals → [Your Portal]
- Click Add Widget
- Select and configure the widget
Widgets operate independently from pages — each widget gets its own API token and declares its own dependencies. Common widget types:
- Head scripts — analytics trackers, tag managers (injected into
<head>) - Floating overlays — chat bubbles, help buttons, notification bells
- Banners — cookie consent, announcements
Applying a Theme
Themes control the visual shell of a portal — layout, branding, colors, and fonts.
- Navigate to Project Dashboard → Portals → [Your Portal] → Theme
- Select a theme and version
- Configure theme settings (colors, branding, fonts)
A theme provides three layout templates:
- Public — for unauthenticated pages (login, registration)
- Private — for authenticated pages
- System — for system pages (errors, access code entry)
Adding Tiles to the Dashboard
Tiles are admin-facing analytics displays that appear on the project dashboard overview.
- Navigate to Project Dashboard → Overview
- Click Add Tile
- Select a tile plugin and configure it
Tiles render custom visualizations — attendance counters, registration charts, revenue breakdowns, real-time maps, and more.
Portal Domains and Activation
Each portal is served on one or more custom domains:
- Wildcard domains (e.g.,
*.customer.com) — shared across projects at the team level - Single domains (e.g.,
event.customer.com) — assigned to one portal
To activate a portal:
- Configure at least one domain
- Ensure DNS records point to the GXP platform (CNAME)
- SSL certificates are automatically provisioned
See Portal Architecture for the full domain resolution and authentication flow.
Next Steps
- Portal Architecture — Deep dive into portal domain resolution, authentication, and page loading
- Plugin System — Understand versioning, dependencies, and the security model
- Creating a Plugin — Build your own plugin page