How It Works
Instead of redirecting users to a Penbox URL, you load the form inside an<iframe> on your own page. Penbox communicates back to your page using postMessage events.
1
Configure allowed origins
In your workspace Branding settings, add the origins (domains) that are allowed to embed Penbox forms. For example:
https://app.yourcompany.com.2
Enable embedding per form
On each form template, toggle Embedding on in the settings panel. Only forms with this toggle enabled can be embedded.
3
Add the iframe to your page
Use the form URL with the
embed_v=1 query parameter:4
Listen for events
Listen for
postMessage events from the iframe to know when the form is ready and when it’s completed.Configuration
Embedding requires a double opt-in:- Workspace level: declare which origins are allowed to embed forms (in Settings > Branding)
- Form level: enable embedding on each individual form template
Allowed Origins
Origins must be exact matches — no wildcards, no paths, no trailing slashes. HTTPS is required in production.http://localhost (with optional port) is allowed for development.
You can configure up to 20 origins per workspace.
Query Parameters
A typical embedded URL looks like:
Events
Penbox sends events to the parent window usingpostMessage. All events share the same envelope:
ready
Sent when the form layout has mounted and is ready to be displayed.
completed
Sent exactly once when the form is submitted. Includes the request_id for reference.
The
completed event fires regardless of whether an auto-redirect is
configured on the form. It is sent before any redirect delay.close
Sent when the user clicks the close action inside the form. Includes the request_id for reference.
Integration Example
Security
Penbox uses theContent-Security-Policy: frame-ancestors header to control which origins can embed forms. When embedding is properly configured, the X-Frame-Options: DENY header is replaced with a CSP header listing only your allowed origins.
If a page tries to embed a form from an unauthorized origin, the browser blocks it — the iframe will show an error or remain blank.
Known Limitations
- Exact origins only — wildcards and regex patterns are not supported. Each origin must be declared explicitly.
- 20 origins max — contact support if you need more.
- Token visible to parent — the parent page can read the iframe URL. This is standard iframe behavior and does not expose additional data.
- Third-party cookie restrictions — Safari ITP and Chrome strict mode may block third-party cookies. Penbox uses sessionStorage-based authentication, so this is generally not an issue.
- Custom form domains — embedding currently only works with
fill.penbox.ioURLs. Custom domain support is planned.
Next Steps
Form Security
Protect forms with access controls
Form Templates
Build and configure form templates