telemetry.10ips.com, support.tuaxo.cc) are replaced by a single
engage.js from cdn.mailcowai.com.
Follow these steps for every site you want to track.
Most sites restrict which external scripts and API endpoints are allowed.
If your site sends a Content-Security-Policy header (or has a <meta> CSP tag),
you need to add MailcowAI domains before the snippet will load.
Add these three directives to your CSP. Merge with existing values if you already have them.
script-src … https://cdn.mailcowai.com connect-src … https://api.mailcowai.com https://support.mailcowai.com frame-src … https://support.mailcowai.comscript-src … https://cdn.mailcowai.com connect-src … https://api.mailcowai.com https://support.mailcowai.com frame-src … https://support.mailcowai.com
Where to set this depends on your server / framework:
# nginx server block add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.mailcowai.com; connect-src 'self' https://api.mailcowai.com https://support.mailcowai.com; frame-src 'self' https://support.mailcowai.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;" always;
# Caddyfile header Content-Security-Policy "default-src 'self'; \ script-src 'self' 'unsafe-inline' https://cdn.mailcowai.com; \ connect-src 'self' https://api.mailcowai.com https://support.mailcowai.com; \ frame-src 'self' https://support.mailcowai.com; \ style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
// next.config.js — headers() { key: 'Content-Security-Policy', value: [ "default-src 'self'", "script-src 'self' 'unsafe-inline' https://cdn.mailcowai.com", "connect-src 'self' https://api.mailcowai.com https://support.mailcowai.com", "frame-src 'self' https://support.mailcowai.com", "style-src 'self' 'unsafe-inline'", "img-src 'self' data:", ].join(';'), }
# .htaccess or VirtualHost Header always set Content-Security-Policy \ "default-src 'self'; \ script-src 'self' 'unsafe-inline' https://cdn.mailcowai.com; \ connect-src 'self' https://api.mailcowai.com https://support.mailcowai.com; \ frame-src 'self' https://support.mailcowai.com; \ style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
<!-- In <head> — works but HTTP header is preferred --> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.mailcowai.com; connect-src 'self' https://api.mailcowai.com https://support.mailcowai.com; frame-src 'self' https://support.mailcowai.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;">
Remove any existing sdk.js or widget.js tags.
One unified engage.js now handles both telemetry collection and the chat widget.
<script src="https://telemetry.10ips.com/sdk.js" data-project="..."></script> <script src="https://support.tuaxo.cc/widget.js" data-project="..."></script>
<script src="https://cdn.mailcowai.com/engage.js"
data-project="your-slug"
data-public-key="pk_xxx"
defer></script>
Place the tag just before </body> — or anywhere in <head> with the defer attribute.
<script src="https://cdn.mailcowai.com/engage.js" data-project="your-project-slug" data-public-key="pk_your_key" defer></script><script src="https://cdn.mailcowai.com/engage.js" data-project="your-project-slug" data-public-key="pk_your_key" defer></script>
Each site is a separate project. Below are all active projects — copy the slug and public key into your snippet.
Need a new project for a site not listed above? Create it in the admin →
If you have authenticated users, call MailcowAI.identify() after login.
This links session data to a real user, enabling the support context view in FreeScout.
// Call after the user logs in, or on any authenticated page window.MailcowAI.identify("user-123", { email: "alice@example.com", name: "Alice", plan: "pro", // any extra context for campaigns });window.MailcowAI.identify("user-123", { email: "alice@example.com", name: "Alice", plan: "pro", });
Track custom events the same way:
MailcowAI.track("billing.checkout.started", { plan: "pro", trial: false }); MailcowAI.track("onboarding.step.completed", { step: "connect_snippet" });MailcowAI.track("billing.checkout.started", { plan: "pro", trial: false }); MailcowAI.track("onboarding.step.completed", { step: "connect_snippet" });
After deploying the snippet, open your site in a browser. Then check these three places:
[MailcowAI] engage.js v1.1 loaded project=my-site [MailcowAI] session started anon_id=anon_8f3c... [MailcowAI] page_view → / (200ms)
If you see those lines, the SDK is running. If you see a CSP error instead, go back to Step 1.
Then check the admin dashboard:
.identify() you'll see a green dot on that sessiondata-debug="true" to the script tag for verbose console output — no secrets are exposed, just event names and API responses.script-src includes cdn.mailcowai.com · connect-src includes api.mailcowai.com and support.mailcowai.com
No more references to telemetry.10ips.com/sdk.js or support.tuaxo.cc/widget.js
data-project and data-public-key match a project in the admin dashboard
Check DevTools Console and Network tabs — engage.js should return HTTP 200
Filter by project slug and confirm a new row within 5 seconds of page load
Optional but required for support context view and user-targeted campaigns
E.g. pricing page stall, checkout error, onboarding step 3 drop-off
Create your first project, copy the snippet, and see your first session in under five minutes.