Cross-Domain Tracking
Track users seamlessly across multiple domains without losing session or attribution data.
When You Need Cross-Domain
Cross-domain tracking is needed when:
- Checkout is on a different domain
- You use subdomains with separate tracking
- You have multiple properties that share users
yoursite.com โ checkout.yoursite.com
โ
Without cross-domain: New session, lost attribution
With cross-domain: Same session, preserved attributionHow It Works
Convultra uses a _cvl URL parameter to transfer session data:
1. User on site-a.com
โ
2. Clicks link to site-b.com
โ
3. Convultra appends ?_cvl=<encoded-data>
โ
4. site-b.com SDK reads _cvl parameter
โ
5. Session and attribution continue seamlesslyThe _cvl parameter contains:
- Session ID
- Click IDs (gclid, fbclid, etc.)
- User ID (if identified)
- UTM parameters
Setup
Configure Domains
In your SDK initialization, specify all domains:
Convultra.init({
apiKey: 'your-key',
endpoint: 'https://your-endpoint.com',
crossDomainDomains: [
'yoursite.com',
'checkout.yoursite.com',
'shop.yourbrand.com'
]
})Automatic Link Decoration
The SDK automatically adds _cvl to links pointing to configured domains:
<!-- Before click -->
<a href="https://checkout.yoursite.com/cart">Checkout</a>
<!-- After SDK processes -->
<a href="https://checkout.yoursite.com/cart?_cvl=eyJzZXNzaW9uSWQiOi...">Checkout</a>Install SDK on All Domains
Ensure the SDK is installed on every domain in the list.
Data Attributes Configuration
<script
src="https://cdn.convultra.com/ultra.min.js"
data-convultra-api-key="your-key"
data-convultra-endpoint="https://your-endpoint.com"
data-convultra-cross-domain-domains="yoursite.com,checkout.yoursite.com"
></script>Manual Link Decoration
For dynamically created links:
// Get decorated URL
const url = Convultra.getCrossdomainLink('https://checkout.yoursite.com/cart')
// Result: https://checkout.yoursite.com/cart?_cvl=eyJz...For JavaScript navigation:
document.getElementById('checkout-btn').addEventListener('click', () => {
const targetUrl = 'https://checkout.yoursite.com/cart'
window.location.href = Convultra.getCrossdomainLink(targetUrl)
})Form Submissions
For forms that submit to another domain:
<form id="checkout-form" action="https://checkout.yoursite.com/process">
<!-- Form fields -->
</form>
<script>
document.getElementById('checkout-form').addEventListener('submit', (e) => {
const form = e.target
// Add hidden field with cross-domain data
const cvlInput = document.createElement('input')
cvlInput.type = 'hidden'
cvlInput.name = '_cvl'
cvlInput.value = Convultra.getCrossdomainData() // Gets the encoded data
form.appendChild(cvlInput)
})
</script>What's Transferred
| Data | Transferred | Purpose |
|---|---|---|
| Session ID | โ | Maintain session continuity |
| gclid | โ | Google Ads attribution |
| fbclid | โ | Meta Ads attribution |
| msclkid | โ | Microsoft Ads attribution |
| ttclid | โ | TikTok attribution |
| twclid | โ | Twitter attribution |
| UTM params | โ | Campaign tracking |
| User ID | โ | Identified user tracking |
| Referrer | โ | Traffic source |
Security
Data Encoding
Cross-domain data is:
- Base64 encoded
- Time-limited (expires in 5 minutes)
- Non-sensitive (no PII)
Validation
The receiving SDK validates:
- Timestamp is within window
- Domain is in allowed list
- Data structure is valid
Common Scenarios
Main Site to Checkout
// Main site: yoursite.com
Convultra.init({
crossDomainDomains: ['yoursite.com', 'checkout.yoursite.com']
})
// Checkout domain automatically receives sessionMultiple Brand Sites
// Shared config across all brand sites
Convultra.init({
crossDomainDomains: [
'brand-a.com',
'brand-b.com',
'shop.example.com'
]
})Subdomains
// Include all subdomains
Convultra.init({
crossDomainDomains: [
'example.com',
'www.example.com',
'shop.example.com',
'checkout.example.com'
]
})Troubleshooting
Session Not Continuing
- Check domain list - Is target domain in
crossDomainDomains? - Check SDK on both domains - Is it installed and initialized?
- Check
_cvlparameter - Is it in the URL? - Check expiry - Did user wait too long (>5 min)?
Debug Mode
Convultra.debug(true)
// Look for cross-domain logs in consoleVerify Data Transfer
On the target domain:
// Check if cross-domain data was received
console.log(Convultra.getSessionId())
console.log(Convultra.getClickIds())Limitations
| Limitation | Details |
|---|---|
| Link decoration only | Doesn't work for direct URL entry |
| 5-minute expiry | User must click within 5 minutes |
| JavaScript required | Needs SDK on both domains |
| Public data only | Doesn't transfer sensitive user data |
Alternative: Server-Side
For more control, use server-side session linking:
// On first domain - get session
const sessionId = Convultra.getSessionId()
const clickIds = Convultra.getClickIds()
// Pass to your server
await fetch('/api/create-checkout', {
body: JSON.stringify({ sessionId, clickIds })
})
// On second domain - restore session
Convultra.init({ ... })
Convultra.restoreSession({
sessionId: sessionFromServer,
clickIds: clickIdsFromServer
})