Set up a custom recording domain
To capture console logs, network requests, and user events in requested Jams, you must connect a custom domain.
Connecting a custom domain allows Jam to:
Serve recording links from your domain
Capture console logs and network requests
Attach developer logs directly to Jams
Support Intercom-requested Jams
Without a custom domain, screen recordings will still work, but developer logs will not be included.
You'll need write permissions to your website to complete these three steps:
Set up Jam's Recorder & Capture Scripts on your site (so your users can start recording & capturing page context)
Register one custom domain URL with Jam (so we can generate links to your site)
Modify your Content-Security-Policy if necessary (so Jam assets can execute on your page)
Set up your custom domain
1. Install Recorder & Capture Scripts
To properly associate your users' recordings with the logs we collect, Jam's Recorder and Capture scripts need to be served under the same origin [MDN] as your site or application.
Locate your Team ID in Jam. This is required to associate recordings and captured logs with your workspace.
You will add your Team ID to the <meta name="jam:team" /> tag shown below.

Install the scripts
Paste the following snippet into the <head> tag of your site.
For best results, install it on all pages — or at minimum on the URL that will host your recording route.
We'll use Jam.js' Recorder and Capture scripts to initialize a recorder on your page and associate captured events.
Tip: In Jam's recording links settings page you can copy the script with your correct team ID already in.
Make sure:
The scripts load successfully
They are not blocked by your Content Security Policy (CSP)
They are available on the URL you plan to verify later
Do not proceed to domain verification until this step is complete.
What each script does
recorder.js
Displays the recording interface when a recording link is opened
Allows users to record their screen directly from your site
If a user dismisses the recorder before starting a recording, they must reopen the recording link to try again.
If a recording is in progress and the user attempts to close the recorder, Jam will ask them to confirm before discarding the recording.
Once a Jam is submitted, the recorder closes automatically and returns control to your page.
capture.js
Captures console logs
Captures network requests
Captures clicks and key interactions
Events are collected only while a recording is in progress. Captured logs are automatically associated with the submitted Jam.
If no recording is active, events are ignored.
Performance
Jam assets are aggressively cached to minimize load impact.
The Capture script prioritizes critical code and defers non-essential logic to ensure your page continues to load and run smoothly.
Note: Jam.js' Capture script can only capture console and network requests made after it initializes.
The <script> tag should be placed as early as possible on the page, and should only use a lazy-loaded import when explicitly trading accuracy for un-cached load performance (e.g. on SEO-optimized pages).
2. Modify your Content-Security-Policy
(If your site does not specify CSP directives, you can skip this step.)
Some sites specify Content-Security-Policy [MDN] directives via either a header or meta tag. A frame-src or script-src directive that doesn't include *.jam.dev will block Jam.js from including console logs with your user's Jams.
To fix this, modify your CSP header or meta tag to allow *.jam.dev as both. For example:
3. Verify your domain
After installing the Recorder and Capture scripts, you must verify your domain before you can connect.
You cannot connect a domain unless verification succeeds.
To verify your domain
Go to: Settings → Recording Links
Click Verify.

Paste the URL where Jam scripts are installed.
Examples:
or
Click Check setup.
What verification checks
Jam verifies that:
The page is publicly accessible
The URL does not redirect
Query parameters are preserved
The Recorder script is installed
The Capture script is installed
If any of these checks fail, verification will not complete.
Important: Redirects and query parameters
If your application redirects users from your recording URL (for example, redirecting unauthorized users to a login page), you must preserve Jam’s query parameters through the redirect.
The most important parameter is:
However, all jam- parameters must be preserved.
If your app strips or rewrites these parameters, the recorder will not initialize correctly and verification will fail.
Before verifying, open your recording URL in an incognito window. If it redirects or removes query parameters, you need to adjust your routing.
Domain scope and log visibility
You must verify at least one URL per domain you want to capture logs from.
Recordings only have access to debug data from pages that:
Run the Capture script
Are on the same domain that initiated the recording
Root domain and subdomains
In most cases:
A recorder installed on the root domain (e.g.
example.com) can capture events from subdomains (e.g.sub.example.com)A recorder installed on a subdomain can capture events from the root domain
However:
Safari limitation
In Safari, logs are only captured when the recorder and capture script are running on the exact same subdomain.
Example:
A recorder on
example.com/recordercan capture events fromsub.example.com— except in Safari.In Safari, both must run on the same subdomain.
If Safari support is critical for your team, consider installing the recorder on the same subdomain where users are active.
Confirm your domain is connected
If verification succeeds:
Your domain is connected
Recording links load from your domain
Console logs and network requests will be captured

If verification fails
Common causes:
Team id miss match
Scripts are not installed
Scripts are blocked by CSP
The URL requires authentication
The URL redirects
Query parameters are stripped
Recorder and Capture scripts are on different domains
Fix the issue and retry verification.
FAQs
Can I put the Recorder and Capture scripts on different pages?
Yes.
If you install them separately:
The
<meta name="jam:team" />tag must be present on pages whererecorder.jsis installed.It is optional on pages that only include
capture.js.
Logs will only be captured from pages where the Capture script is running.
Can I programmatically create Recording Links directly on my page?
Not at this time.
We plan to expose an API that will allow you to create Recording Links programmatically (for example, from Slack, Zendesk, or directly within your app).
Can I customize the Recorder UI?
Not currently.
If you have specific customization requirements, contact us. We are actively evaluating improvements in this area.
Can I mix Jam recordings with custom recording infrastructure?
No.
Jam’s Recorder and Capture scripts are designed to work together. Due to browser storage and cross-origin restrictions, they must be used as a complete pair.
Partial integrations or mixing with external recording systems are not supported.
Current limitations
Verification requirement
Logs will not be captured unless your domain has been successfully verified in:
Settings → Recording Domain
Installing the scripts alone is not sufficient.
Browser support
Log capture is fully supported in:
Chrome (including Incognito)
Firefox (including Private Windows)
Supported in most Safari windows.
Not supported in:
Safari Private Windows
Domain and subdomain behavior
Recordings only capture logs from pages running the Capture script.
Logs are only accessible from pages on the same domain that initiated the recording.
In most cases, a recorder installed on a root domain (e.g. example.com) can capture events from subdomains (e.g. sub.example.com).
However:
In Safari, logs are only captured when the recorder and capture scripts run on the exact same subdomain.
Iframe limitation
If the Capture script is installed inside an iframe:
Top-level logs will not be captured.
For example, embedded Shopify apps cannot capture logs from the parent page.
Script loading behavior
If you load the Capture script using:
asyncdeferLazy-loaded
import(...)
We cannot guarantee it will initialize early enough to capture:
Early console logs
Initial network requests
Early page events
For full log coverage, load the scripts synchronously in the <head> section of your page.
Last updated
Was this helpful?