Política de privacidad
AdLupa — https://adlupa.netlify.app
- Última actualización: 2026-08-20
- Versión de la extensión que cubre este documento: 0.1.0
- Contacto: adlupa@proton.me
Resumen en una línea
La extensión lee, en tu propia máquina, el Post ID de los anuncios que ya están cargados en la página de Meta Ads Manager que tenés abierta, lo guarda en chrome.storage.local, donde vence a los 30 días, y no lo manda a ningún lado. No hay servidores, no hay cuentas, no hay analytics.
1. Qué datos lee la extensión
Mientras tenés abierta una pestaña de Meta Ads Manager (y solo ahí), la extensión lee tres cosas del contenido de esa página:
| Dato | Qué es | De dónde sale |
|---|---|---|
| Ad ID | El identificador numérico del anuncio (adgroup) | Respuestas JSON que Ads Manager ya pidió, y los props internos de la tabla |
| Post ID / Story ID | El campo effective_object_story_id (alternativa: object_story_id), con forma pageId_postId | Las mismas respuestas JSON |
| Nombre del anuncio | El texto que vos le pusiste al anuncio | Las mismas respuestas JSON y la tabla |
Cada registro que se guarda lleva esos tres campos y nada más que se haya leído de la página. Lo que sí lleva además son dos cosas que la extensión deriva sola: el Story ID guardado partido en sus dos mitades (pageId y postId, para no tener que partirlo cada vez que se dibuja un badge) y la fecha de la última vez que se vio ese anuncio, que es lo que hace funcionar el vencimiento a los 30 días. El id de la cuenta publicitaria va en la clave del registro.
Los registros de una misma cuenta se guardan juntos adentro de un envoltorio, y ese envoltorio lleva otras dos cosas que también quedan en disco: un número de versión del formato del caché (hoy 1), que sirve para descartar de una un caché escrito por una versión vieja de la extensión, y el id de la cuenta otra vez, esta vez adentro del valor además de en la clave. Con eso está completo el inventario de lo que se escribe.
También guarda cuatro preferencias tuyas: si la extensión está encendida, el idioma elegido, si el panel flotante está abierto y si el modo debug está encendido (apagado por defecto).
Nada más se guarda. No se guardan métricas, ni presupuestos, ni gasto, ni datos de facturación, ni el resto de la cuenta publicitaria.
Precisión sobre "leer" y "guardar", que no es lo mismo: para encontrar los Post IDs, la extensión parsea el cuerpo completo de las respuestas que pasan el filtro de URL. Esas respuestas pueden contener otras cosas además de los Post IDs. De todo eso, lo único que se retiene son los tres campos de la tabla de arriba; el resto se descarta al terminar de parsear y nunca se guarda ni se transmite. Decir "no se leen métricas" sería inexacto; lo exacto es que no se guardan.
Aviso honesto sobre el nombre del anuncio: el nombre es texto libre que escribiste vos. Si pusiste datos personales adentro del nombre de un anuncio, esos datos quedan en el caché local igual que ya estaban en Ads Manager. La extensión no los interpreta ni los separa.
2. Cómo los obtiene: extracción 100 % pasiva
Esto es lo que más importa entender, porque es lo que separa a esta extensión de otras parecidas:
- La extensión no hace ningún request por su cuenta: ni en segundo plano, ni a la Graph API, ni a ningún endpoint, ni a servidores propios o de terceros. No hay telemetría de ningún tipo.
- La única excepción, y la disparás vos: el menú del badge tiene un ítem "Abrir en Facebook" que abre la publicación en una pestaña nueva, como si hicieras click en un link. Eso es navegación que iniciás con un click, no una petición automática de la extensión.
- Lo único que hace es envolver el
fetchy elXMLHttpRequestque la propia página ya usa, para leer el texto de respuestas que Ads Manager pidió por su cuenta, y mirar los bloques<script type="application/json">que la página ya trae adentro del HTML. - Solo mira respuestas cuya URL contiene
graph.facebook.com,/api/graphqlo/adsmanager/. El resto se ignora sin abrirse. - No lee cookies. La extensión no declara el permiso
cookiesy no accede a ninguna API de cookies del navegador. - No lee ni usa tokens de sesión,
access_token,fb_dtsgni credenciales de ningún tipo. - No modifica lo que la página envía ni lo que recibe: solo lee una copia del texto de respuesta.
Si Meta cambia la forma de su JSON, la extracción deja de encontrar datos y no aparecen badges. La página sigue funcionando normal. Esa es la degradación buscada: nunca hay un plan B que implique pedirle algo a un servidor.
Con la extensión apagada sigue leyendo y guardando. El interruptor del popup apaga todo lo que se ve —badges, panel flotante, contador del icono— pero la lectura pasiva y el guardado en
chrome.storage.localcontinúan, para que los Post IDs ya estén listos apenas la vuelvas a encender. Lo decimos acá y no solo en la ayuda del interruptor porque apagada no significa que deje de recolectar, y esa diferencia te la tenemos que contar sin que la tengas que descubrir. Si querés que no lea nada, desactivá la extensión desdechrome://extensionso desinstalala.
3. Dónde quedan los datos
- En
chrome.storage.local, o sea: en el disco de tu computadora, dentro del perfil de Chrome. - Organizados por cuenta publicitaria, bajo claves con el prefijo
postids:(por ejemplopostids:act_000000000000000), más una clavesettingscon tus preferencias. - Cada registro vence a los 30 días desde la última vez que se vio ese anuncio. Vencido, la extensión deja de leerlo y de mostrarlo en el acto.
- Cuándo desaparece del disco, con precisión: leer el caché no lo limpia. Cuando abrís Ads Manager en esa cuenta, el script de contenido saltea los registros vencidos y no los carga en memoria —por eso dejan de leerse y de mostrarse en el acto—, pero la clave en disco queda igual: esa lectura no escribe nada. Lo que los borra del disco es la siguiente escritura de esa clave, que vuelca a disco lo que quedó en memoria y por eso deja lo vencido afuera. Esa escritura ocurre cuando la extensión guarda pares nuevos de esa cuenta, o cuando un registro se vence con la pestaña ya abierta. Abrir la cuenta es necesario pero no alcanza: si en esa visita no se extrae ningún par nuevo, la clave vencida sigue en disco. Y no hay ninguna tarea de fondo que barra el disco: la extensión no usa
chrome.alarmsni corre nada al iniciar Chrome. Consecuencia, y la decimos porque es la parte incómoda: si dejás de abrir una cuenta, su clavepostids:se queda guardada —vencida, sin usarse y sin mostrarse— hasta que vuelvas a abrir esa cuenta y la extensión vuelva a guardar algo de ella, borres los datos a mano o desinstales la extensión. - Hay un tope de 5000 registros por cuenta publicitaria: al pasarse, se tiran los más viejos.
- No se usa
localStoragenisessionStorage. La regla está forzada por el linter del proyecto, no es solo una promesa. - La extensión no usa
chrome.storage.sync, así que estos datos tampoco se sincronizan con tu cuenta de Google ni con tus otros dispositivos.
3.1 Las tres salidas fuera de chrome.storage.local
Nada de esto sale de tu máquina, pero sí sale del pedazo de disco que la extensión administra, y por eso va escrito. Las tres las disparás vos con un click:
- Exportar CSV. El botón "Exportar CSV" —está en el popup y también en el pie del panel flotante— genera un archivo
postids-act_...-AAAA-MM-DD.csven tu carpeta de Descargas con una fila por registro de esa cuenta: Ad ID, nombre del anuncio, Post ID, Story ID completo y la URL pública de la publicación. El archivo lo arma el navegador con el flujo de descarga normal (unBloby un link, sin el permisodownloads), y desde que se guarda es un archivo tuyo como cualquier otro: la extensión no lo controla, no lo vuelve a leer y no lo borra nunca — ni a los 30 días, ni con "Borrar datos", ni al desinstalarla. - Copiar al portapapeles. "Copiar Post ID" y "Copiar nombre + Post ID" en el menú del badge, "Copiar selección" en la barra de selección múltiple, "Copiar todo" en el popup y en el panel (que vuelca los Post IDs de toda la cuenta, uno por línea) y cada fila del panel flotante —la fila entera es el botón: un click sobre ella, o Enter o Espacio con la fila enfocada, copia ese Post ID— escriben en el portapapeles del sistema operativo. Ese portapapeles es del sistema, no de la extensión: no podemos vaciarlo ni saber dónde lo pegás. Ojo con "Copiar nombre + Post ID", que copia el nombre del anuncio, o sea el texto libre del aviso de arriba.
- Copiar diagnóstico. Hay un modo de desarrollador escondido, que se destraba haciendo cinco clicks seguidos sobre el número de versión del pie del popup. Con eso aparece el botón "Copiar diagnóstico", que arma un reporte técnico y lo copia a tu portapapeles para que vos lo pegues donde quieras. No se envía a ningún lado, porque la extensión no tiene a dónde enviarlo. El reporte incluye la versión y el build, el idioma de Chrome, si el modo debug está encendido, el host y la ruta de la página sin el query string, el id de la cuenta actual truncado a sus últimos 4 dígitos, si la extensión está encendida y si el panel está abierto, cuántos Post IDs tiene en caché la cuenta actual y cuántos registros tiene en memoria, cuántas cuentas tienen caché guardado (para contarlas se le pide a
chrome.storage.localsu contenido entero de una sola vez —claves y valores, o sea el caché de todas las cuentas pasa un instante por la memoria de la pestaña—, pero al reporte entra solamente el número: los ids de las otras cuentas no salen, ni truncados), cuántos fetch/XHR hizo la página y cuántos pasaron el filtro de URL, hasta 12 de esas URLs descartadas —sin query string y con los ids truncados, y solo cuando ninguna pasó el filtro: si al menos una pasa, no se lista ninguna—, y los últimos errores retenidos con el mensaje enmascarado (sin stack, cortado desde la primera comilla y con las corridas largas de dígitos truncadas). De lo que hay en la página no sale ningún valor: ni nombres de anuncios, ni texto de celdas, ni ids completos, ni el cuerpo de las respuestas. Lo que sí sale es la forma de la página, y esto es todo lo que sale: nombres de tags, roles ARIA y los tipos internos que publica React, únicamente si tienen forma de identificador corto —lo que no la tiene se reemplaza por una marca de "no imprimible", y un rol que no la tiene sale como?—; los nombres de los atributosdata-*yaria-*de los elementos que la sonda recorre, nunca sus valores, hasta 8 por elemento y cada uno cortado a 40 caracteres, que no pasan por ese filtro de identificador corto (sí por el truncado de ids); ellangque la página declara en su<html>, tal cual; y, si la extracción no encontró ni un par y además tenías el modo debug encendido cuando se capturó la muestra, hasta 40 nombres de claves de primer nivel del último payload de Meta que no dio resultados, tal cual vienen —son nombres de campos del JSON de Meta, no texto tuyo, pero salen sin filtrar—, o, si ese payload ni siquiera parsea, sus primeros 80 caracteres reducidos a pura puntuación: se borran todas las letras, todos los dígitos y todos los espacios, y queda el esqueleto, que alcanza para ver si era JSON, HTML o un prefijo anti-hijacking.
4. A dónde se transmiten los datos
A ningún lado.
- No hay servidor propio. No existe un backend de este proyecto.
- No hay servicios de terceros: ni analytics, ni Sentry, ni Supabase, ni Firebase, ni un procesador de pagos, ni un servidor de licencias.
- No hay cuentas de usuario, no hay login, no hay suscripción, no hay pagos.
- No hay telemetría, ni "estadísticas anónimas de uso", ni pings de activación.
- El
manifest.jsonno declarahost_permissions, no declaraexternally_connectabley no incluye ningún dominio de servidor. Sin esos permisos, la extensión no podría hablar con un servidor externo aunque quisiera. - No se carga ni ejecuta código remoto. Todo el JavaScript que corre viene adentro del paquete publicado, sin minificar y sin ofuscar, para que cualquiera lo pueda leer.
Podés verificarlo vos mismo: abrí las DevTools en una pestaña de Ads Manager, pestaña Network, y no vas a encontrar una sola petición originada por la extensión.
5. Qué NO se recolecta
Ninguna de estas cosas se lee, se guarda ni se transmite:
- Credenciales, contraseñas, tokens de sesión ni cookies.
- Datos de pago, tarjetas, facturación o métodos de pago de la cuenta publicitaria.
- Historial de navegación, pestañas abiertas, marcadores o historial de descargas.
- Contactos, agenda, correo o mensajes.
- Ubicación, dirección IP registrada por nosotros, o identificadores de dispositivo.
- Datos de audiencias, listas de clientes o cualquier información de las personas que ven tus anuncios.
- Contenido de cualquier sitio que no sea Meta Ads Manager: la extensión no corre en otras webs.
Nada de esta lista se le pide a Meta ni se guarda. Y donde "no se lee" no alcanza —lo que Meta ya haya metido adentro de una respuesta que la extensión parsea— vale la precisión de la sección 1: pasa por el parser y se descarta ahí mismo, sin guardarse y sin transmitirse.
6. Dónde corre la extensión
Los scripts de contenido se inyectan únicamente en estas tres rutas:
https://adsmanager.facebook.com/adsmanager/*https://business.facebook.com/adsmanager/*https://www.facebook.com/adsmanager/*
Solo en el marco principal de la pestaña (all_frames: false). En cualquier otra página — incluido el resto de facebook.com y de business.facebook.com — la extensión ni siquiera se carga.
Lo que te va a decir Chrome al instalarla, que suena más grande que esto: el aviso de instalación de Chrome nombra dominios y descarta la ruta del patrón. Como uno de los tres patrones es
https://www.facebook.com/adsmanager/*, Chrome va a nombrarwww.facebook.comentero —igual queadsmanager.facebook.comybusiness.facebook.com—, sin la parte/adsmanager/. Es una limitación de cómo Chrome redacta el aviso, no un permiso más ancho: lo que manda es elmatchesdelmanifest.json, y ahí la ruta está escrita. Fuera de/adsmanager/el script no se inyecta. El patrón dewww.facebook.comestá porque esa URL sirve Ads Manager de verdad, y sacarlo dejaría afuera una puerta de entrada que la gente usa.
7. Permisos que pide y por qué
| Permiso | Para qué |
|---|---|
storage | Guardar el caché de Post IDs y tus cuatro preferencias en tu propia máquina. Es el único permiso declarado. |
No pide host_permissions, ni tabs, ni cookies, ni webRequest, ni downloads, ni identity, ni activeTab. La justificación completa está en store/permissions.md.
8. Cómo borrar tus datos
Estas son todas las formas, con lo que alcanza cada una:
- Botón "Borrar datos" del popup (pide un segundo click para confirmar) o botón "Borrar lista" del pie del panel flotante: los dos hacen exactamente lo mismo, aunque se llamen distinto — borran de
chrome.storage.locallos Post IDs guardados de la cuenta publicitaria de la pestaña activa. No borran las otras cuentas. - Desinstalar la extensión: Chrome elimina todo su
chrome.storage.localautomáticamente. - Esperar: cada registro vence a los 30 días de la última vez que se vio y desde ese momento no se lee ni se muestra más. Que se vaya del disco depende de que vuelvas a abrir Ads Manager en esa cuenta y de que en esa visita la extensión vuelva a guardar datos de ella, porque lo que limpia la clave es la escritura, no la lectura, como dice la sección 3. Si no pensás volver a esa cuenta, usá una de las dos formas de arriba.
- Si exportaste un CSV, borralo vos desde tu carpeta de Descargas. Ninguna de las tres formas de arriba lo toca: es un archivo tuyo, fuera del alcance de la extensión.
No hay nada que borrar del lado de un servidor porque no hay servidor.
9. Declaración de manejo de datos ante la Chrome Web Store
Esto es contraintuitivo y conviene dejarlo por escrito: aunque todos los datos queden en tu máquina y no se transmitan a ningún lado, la Chrome Web Store igual exige declarar el manejo de datos. Leer el contenido de una página que el usuario visita cuenta como manejo de datos, sin importar que después no salga del dispositivo.
Por eso, en el formulario de "Prácticas de privacidad" de la tienda declaramos la categoría "Contenido del sitio web" (Website content), que es la que corresponde a leer ids y nombres de anuncios de la página de Ads Manager, y aclaramos que ese contenido no se transmite fuera del dispositivo.
Declaramos de más antes que de menos: es más barato ser explícito que que la review lo descubra sola. Y certificamos, porque es verdad:
- Los datos no se venden a terceros.
- Los datos no se usan para ningún propósito ajeno a la función única de la extensión.
- Los datos no se usan para determinar solvencia crediticia ni para otorgar préstamos.
10. Menores
La extensión es una herramienta de trabajo para gente que administra publicidad. No está dirigida a menores de 13 años.
No pide ni recibe la edad de nadie, ni ningún dato de identificación personal: lo único que guarda son ids de anuncios, ids de publicaciones y nombres de anuncios de la cuenta publicitaria que vos tenés abierta, y todo queda en tu máquina. No hay perfilado de usuarios ni forma de distinguir la edad de quien la usa, ni falta.
11. Relación con Meta
Este es un proyecto independiente. No está afiliado, patrocinado ni avalado por Meta Platforms, Inc. "Meta", "Facebook" y "Ads Manager" son marcas de sus respectivos titulares.
12. Cambios en esta política
Si alguna versión futura cambia lo que la extensión lee, guarda o transmite, este documento se actualiza en el mismo commit que el cambio de código, y se sube la fecha de arriba. La política describe lo que el código hace hoy; no es una lista de intenciones.
13. Contacto
adlupa@proton.me
Privacy Policy (English)
AdLupa — Last updated: 2026-08-20 — Covers version 0.1.0 — Contact: adlupa@proton.me
In one line
The extension reads the Post ID of the ads already loaded in the Meta Ads Manager page you have open, stores it locally in chrome.storage.local, where it expires after 30 days, and sends it nowhere. No servers, no accounts, no analytics.
What it reads
Only while a Meta Ads Manager tab is open, and only three things: the ad (adgroup) ID, the effective_object_story_id (fallback: object_story_id) in the form pageId_postId, and the ad name. Plus four of your own preferences (extension on/off, interface language, floating panel open, debug mode — off by default). Nothing else is stored: no metrics, no budgets, no spend, no billing data.
Each stored record carries those three fields and nothing else read from the page. It does carry two things the extension derives on its own: the Story ID also kept split into its two halves (pageId and postId, so it does not have to be split again every time a badge is drawn) and the date the ad was last seen, which is what makes the 30-day expiry work. The ad account id lives in the record's storage key.
All the records of one account are stored together inside a wrapper, and that wrapper carries two more things that also stay on disk: a cache-format version number (currently 1), which is what allows a cache written by an older version of the extension to be discarded outright, and the account id again — this time inside the value, on top of being in the key. That completes the inventory of what gets written.
"Reads" and "stores" are not the same thing, and the difference matters: to find the Post IDs, the extension parses the full body of every response that passes the URL filter. Those responses can contain things other than Post IDs. Out of all of that, the only things retained are the three fields above; the rest is discarded when parsing ends and is never stored or transmitted. Saying "it does not read metrics" would be inaccurate; what is accurate is that it does not store them.
Note in good faith: the ad name is free text that you wrote. If you put personal data inside an ad name, that text is cached locally exactly as it already existed in Ads Manager. The extension does not interpret it or separate it out.
How it reads it: passively
The extension never sends a request of its own — no background requests, no telemetry, no Graph API, no servers of ours or anyone else's. The one exception is user-initiated: the badge menu has an "Open on Facebook" item that opens the post in a new tab, exactly like clicking a link. It wraps the page's own fetch and XMLHttpRequest in order to read responses that Ads Manager itself already requested, and it looks at <script type="application/json"> blocks already present in the HTML. It only inspects responses whose URL contains graph.facebook.com, /api/graphql or /adsmanager/. It does not read cookies (the cookies permission is not declared), does not touch session tokens or credentials, and does not alter any request or response.
Switching the extension off does not stop it from reading. The popup switch hides everything visible — badges, floating panel, toolbar counter — but passive reading and local storage keep running, so the Post IDs are ready the moment you switch it back on. We say this here and not only in the switch's own tooltip because off does not mean it stops collecting, and you should not have to discover that. To stop it from reading anything, disable the extension from chrome://extensions or uninstall it.
Where it is stored
In chrome.storage.local, on your own machine, under keys prefixed with postids: (one per ad account, e.g. postids:act_000000000000000) plus a settings key. Each record expires after 30 days counted from the last time that ad was seen; once expired, the extension stops reading it and stops showing it immediately. There is a cap of 5000 records per ad account; past that, the oldest ones are dropped. localStorage and sessionStorage are not used (the project's linter blocks them). chrome.storage.sync is not used, so nothing syncs to your Google account.
When it actually leaves the disk, precisely: reading the cache does not clean it. When you open Ads Manager on that account, the content script skips the expired records and does not load them into memory — which is why they stop being read and stop being shown immediately — but the key on disk is untouched: that read writes nothing. What removes them from disk is the next write of that key, which dumps to disk whatever is left in memory and therefore leaves the expired ones out. That write happens when the extension stores new pairs for that account, or when a record expires while the tab is already open. Opening the account is necessary but not sufficient: if no new pair is extracted during that visit, the expired key stays on disk. And there is no background sweep: the extension uses no chrome.alarms and runs nothing at browser startup. The uncomfortable consequence, which is why we write it down: if you stop opening an ad account, its postids: key stays on disk — expired, unused and never shown — until you open that account again and the extension writes something for it, clear its data by hand, or uninstall the extension.
Three ways data leaves chrome.storage.local
None of this leaves your machine, but it does leave the slice of disk the extension manages, which is why it is written down here. You trigger all three with a click:
- Export CSV. The "Export CSV" button — in the popup and also in the floating panel's footer — writes a
postids-act_...-YYYY-MM-DD.csvfile to your Downloads folder, one row per record of that account: Ad ID, ad name, Post ID, full Story ID and the public URL of the post. The browser produces the file through the normal download flow (aBloband a link, without thedownloadspermission), and from the moment it is saved it is a file of yours like any other: the extension does not control it, does not read it again and never deletes it — not after 30 days, not with "Clear data", not on uninstall. - Copying to the clipboard. "Copy Post ID" and "Copy name + Post ID" in the badge menu, "Copy selected" in the multi-selection bar, "Copy all" in the popup and in the panel (which dumps every Post ID of the account, one per line), and every row of the floating panel — the whole row is the button: a click on it, or Enter or Space while it has focus, copies that Post ID — write to your operating system's clipboard. That clipboard belongs to the system, not to the extension: we cannot empty it and cannot know where you paste it. Watch out for "Copy name + Post ID", which copies the ad name — the same free text the note above warns about.
- Copy diagnostics. There is a hidden developer mode, unlocked by clicking five times in a row on the version number in the popup's footer. That reveals a "Copy diagnostics" button, which builds a technical report and copies it to your clipboard so you can paste it wherever you want. It is sent nowhere, because the extension has nowhere to send it. The report includes the version and build, the Chrome UI language, whether debug mode is on, the page's host and path without the query string, the current account id truncated to its last 4 digits, whether the extension is on and whether the panel is open, how many Post IDs are cached for the current account and how many records it holds in memory, how many accounts have a stored cache (counting them asks
chrome.storage.localfor its entire contents at once — keys and values, meaning every account's cache passes through the tab's memory for an instant — but only the number goes into the report: the other accounts' ids never appear, not even truncated), how many fetch/XHR calls the page made and how many passed the URL filter, up to 12 of those discarded URLs — without query string and with ids truncated, and only when none of them passed the filter: if at least one passes, none are listed — and the last retained errors with the message masked (no stack, cut from the first quote onwards, and long digit runs truncated). No value from the page comes out: no ad names, no cell text, no full ids, no response bodies. What does come out is the shape of the page, and this is all of it: tag names, ARIA roles and the internal type names React publishes, only if they have the shape of a short identifier — anything that does not is replaced by a "not printable" marker, and a role that does not comes out as?; the names of thedata-*andaria-*attributes of the elements the probe walks, never their values, up to 8 per element and each cut to 40 characters, which do not go through that short-identifier filter (they do go through the id truncation); thelangthe page declares on its<html>, verbatim; and, if extraction found no pair at all and debug mode was also on when the sample was captured, up to 40 first-level key names of the last Meta payload that yielded nothing, exactly as they come — they are field names from Meta's JSON, not text of yours, but they come out unfiltered — or, if that payload does not even parse, its first 80 characters reduced to pure punctuation: every letter, every digit and every space is stripped, and what is left is the skeleton, enough to tell whether it was JSON, HTML or an anti-hijacking prefix.
Where it is transmitted
Nowhere. There is no backend for this project and no third-party service: no analytics, no error reporting, no license server, no payment processor, no user accounts, no telemetry. The manifest declares no host_permissions and no externally_connectable, so the extension has no way to talk to an external server. No remote code is loaded or executed; all shipped JavaScript is unminified and unobfuscated so it can be read.
What is never collected
Credentials, passwords, session tokens, cookies, payment or billing data, browsing history, open tabs, bookmarks, download history, contacts, email, messages, location, device identifiers, customer lists or audience data, or content from any site other than Meta Ads Manager.
None of that list is requested from Meta or stored. And where "not read" is not enough — whatever Meta already put inside a response the extension parses — the precision note above applies: it goes through the parser and is discarded right there, never stored and never transmitted.
Where it runs
Content scripts are injected only into https://adsmanager.facebook.com/adsmanager/*, https://business.facebook.com/adsmanager/* and https://www.facebook.com/adsmanager/*, main frame only. The extension does not load on any other page.
What Chrome will tell you at install time, which sounds broader than this: Chrome's install prompt names domains and drops the path of the pattern. Since one of the three patterns is
https://www.facebook.com/adsmanager/*, Chrome will name the wholewww.facebook.comdomain — along withadsmanager.facebook.comandbusiness.facebook.com— without the/adsmanager/part. That is a limitation of how Chrome words the prompt, not a wider permission: what governs is thematcheslist inmanifest.json, and the path is written there. Outside/adsmanager/the script is not injected. Thewww.facebook.compattern is there because that URL really does serve Ads Manager, and removing it would shut a door people actually use.
Permissions
storage only — to keep the Post ID cache and your four preferences on your own machine. No host_permissions, no tabs, no cookies, no webRequest, no downloads, no identity, no activeTab. The full justification is in store/permissions.md.
Deleting your data
These are all the ways, and what each one covers:
- The "Clear data" button in the popup (it asks for a second click to confirm) or the "Clear list" button in the floating panel's footer: both do exactly the same thing despite the different labels — they delete from
chrome.storage.localthe Post IDs stored for the ad account open in the active tab. Neither touches the other accounts. - Uninstall the extension: Chrome wipes its
chrome.storage.localautomatically. - Wait: every record expires 30 days after the ad was last seen and is neither read nor shown from that moment on. Whether it leaves the disk depends on you opening Ads Manager on that account again and on the extension writing data for it during that visit, because what clears the key is the write, not the read, as described above. If you do not plan to go back to that account, use one of the two options above.
- If you exported a CSV, delete it yourself from your Downloads folder. None of the three options above touches it: it is a file of yours, outside the extension's reach.
There is nothing to delete server-side, because there is no server.
Chrome Web Store data disclosure
Counterintuitive but important: even though everything stays on your device, the Chrome Web Store still requires a data-handling disclosure. Reading the content of a page a user visits counts as data handling regardless of whether it ever leaves the device. We therefore disclose the "Website content" category in the store's Privacy practices form, and state that this content is not transmitted off the device. We also certify — truthfully — that the data is not sold to third parties, is not used for any purpose unrelated to the extension's single purpose, and is not used to determine creditworthiness or for lending purposes.
Children
This is a professional advertising tool. It is not directed at children under 13.
It never asks for or receives anyone's age, or any identifying information: all it stores are ad IDs, post IDs and ad names from the ad account you have open, and everything stays on your machine. There is no user profiling and no way to tell the age of whoever is using it — nor any need to.
Relationship with Meta
Independent project. Not affiliated with, sponsored by, or endorsed by Meta Platforms, Inc. "Meta", "Facebook" and "Ads Manager" are trademarks of their respective owners.
Changes
If a future version changes what the extension reads, stores or transmits, this document is updated in the same commit as the code change. This policy describes what the code does today, not what we intend.