Is ad speedup skip video ads safe?
Ad Speedup is high risk. On install and each ad-skip use, AdSpeedUp makes a permanent ID and sends it with a session ID and event name to Google Analytics. Synced storage carries it across your devices. Capture confirmed five POSTs sharing the same client_id.…
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Persistent UUID synced across devices, reported to Google Analytics
On install and each ad-skip use, AdSpeedUp makes a permanent ID and sends it with a session ID and event name to Google Analytics.
Synced storage carries it across your devices.
Capture confirmed five POSTs sharing the same client_id.
You install the extension, or use any ad-skip feature.
The extension sends your permanent browser ID and a session ID to Google Analytics.
The ID is stored in chrome.storage.sync, which means it follows your Google account across devices.
| Content-Type | application/json |
{
"client_id": "caa46341-f75d-4333-9d8b-c29b4111b3d8",
"events": [
{
"name": "extension_error",
"params": {
"session_id": "1745574612347",
"engagement_time_msec": 100,
"reason": ""
}
}
]
}| Field | Value | Why it matters | |
|---|---|---|---|
Your permanent browser ID | caa46341-f75d-4333-9d8b-c29b4111b3d8 | A random UUID from first install, stored in your synced Google account. The same ID appears on every device using this extension. | |
Your current session ID | 1745574612347 | A timestamp-derived ID reset every 30 minutes of inactivity. Links your actions within a browsing session. | |
What you did | ads_skipped | The name of the feature you used or the lifecycle event that fired. | |
Ad skip count | 3 | For ads_skipped events, the number of ads skipped in the action. |
The tracking class from background.js (shipped minified, deobfuscated below):
async getOrCreateClientId() {
let { clientId } = await chrome.storage.sync.get('clientId');
if (!clientId) {
clientId = self.crypto.randomUUID();
await chrome.storage.sync.set({ clientId });
}
return clientId;
}async fireEvent(eventName, params = {}) {
if (!params.session_id) params.session_id = await this.getOrCreateSessionId();
if (!params.engagement_time_msec) params.engagement_time_msec = 100;
try {
const endpoint = 'https://www.google-analytics.com/mp/collect';
await fetch(
`${endpoint}?measurement_id=G-X6Q0B1MD64&api_secret=<redacted>`,
{
method: 'POST',
body: JSON.stringify({
client_id: await this.getOrCreateClientId(),
events: [{ name: eventName, params: { session_id: await this.getOrCreateSessionId(), engagement_time_msec: 100, ...params } }]
})
}
);
} catch {}
}- www.google-analytics.com
Google Analytics Measurement Protocol endpoint. Receives client_id, session_id, event names, tied to GA property G-X6Q0B1MD64 under the developer's account.