- Loader
- fired
- Render
- confirmed
Verdict
Healthy
The widget loaded and it painted. You get volume and render p95, by domain and by version.
Observability for embeddable widgets
Vigie watches your widget from your customers' sites, not from yours. Which customer, which version, which page, since which hour — before the customer emails you.
A 1.8 KB gzip loader, loaded async. No URLs to enter: the inventory discovers itself.
last hour window
The problem
Your code runs on somebody else's machine. A CSP tightened on a Tuesday evening, a blocking extension, a redesign that removes the container, a CMS that rewrites the script tag: the widget never starts. It throws no exception, because there is no code in memory to throw one. Your telemetry stays green. Your customer's page has a hole in it.
Your server logs
See nothing. The failure is in a browser, on a domain that is not yours.
Your error tracker
Sees nothing. No error was thrown: nothing executed.
Your support inbox
Sees everything, last. The ticket arrives days after the breakage, and sometimes never.
Absence is the signal. And absence cannot send itself.
The model
The beacon loads in two stages. The loader fires before your widget; the reporter confirms the render completed. The gap between the two carries all the information.
Verdict
Healthy
The widget loaded and it painted. You get volume and render p95, by domain and by version.
Verdict
Broken
The loader started, the render never came. You know which customer, which version, which page, since which hour. This is the alert the product is bought for.
Verdict
Never heard from
Either the page was not visited, or everything is blocked upstream. Vigie settles it with the domain's history — never on a single hourly window.
The inventory
You probably cannot list the domains your widget runs on. Customers install it, move it to a subdomain, resell it white-label, leave it on a staging page. Vigie does not need the list: every execution declares it.
From your own CDN, inside the snippet your customers already paste. 1.8 KB gzip, async, no dependencies.
Every origin that executes your code shows up in the fleet, with its version, within minutes. Including the ones you had forgotten.
After seven days of history per domain, silence becomes readable and alerting turns on.
The snippet your customers paste
<script src="https://cdn.your-company.example/vigie-loader.js"
data-vigie-key="pk_live_8f3c…"
data-vigie-version="2.14.0" async></script>Then, inside your widget, one line the moment it has painted: markRendered(). The reporter finds the loader in the page, adopts its counters, and exactly one request leaves per hour.
Widget in an iframe? The loader sits in the parent page and hands the customer origin to the reporter over a handshake: inside the frame, location is your own domain and the referrer cannot be trusted.
In the product
A wall of domains, ordered by sessions affected, not alphabetically.
The one signal no error tracker can produce, by construction.
Which version runs where, and which one breaks on arrival.
95th-percentile render time, by domain and by version, by hour.
The alert names the affected customer. Not an aggregate error rate.
The ingest API answers 204 to everyone and never confirms that a key exists.
What it is not
Vigie does not trace your backend, open spans or time your queries. Keep the tool that does.
A site monitor checks that one page responds, and it is bought by the owner of that page. Vigie is bought by you, the widget vendor, and watches hundreds of pages you do not control.
Those tools protect a site from scripts like yours. Same buyer: the host site. None of them tells you how many of your customers your own widget fails to start on.
The honest comparison
Any serious vendor already runs Sentry or its equivalent, and we are not going to pretend otherwise. Here is exactly where the line falls.
| The question | An error tracker | Vigie |
|---|---|---|
| My widget just threw an exception | Yes, with the stack and breadcrumbs | Yes, but aggregated per customer domain |
| My widget never started on this site | Nothing. No code in memory, so no error | Broken state, customer named, start hour |
| How many of my customers am I broken on? | A global error rate, with no customer denominator | A list of domains, each with its history |
| Which customers have never been heard from? | Not a question it can represent | Settled by history, once the baseline exists |
Pricing
Not by event volume. You know how many customers you have; nobody knows their event count in advance, and nobody enjoys a bill that tracks somebody else's traffic.
Up to 100 customer domains
199 €/ month
A first widget in production, a fleet you could still list by hand.
Up to 500 customer domains
349 €/ month
The fleet outgrew what support can hold in its head, and versions now coexist.
Up to 2,000 customer domains
499 €/ month
Several widgets, several white labels, a team that lives in the dashboard.
Excl. VAT, billed monthly, no commitment.
Write to us with your domain count and the versions you have in circulation. You get a price back, not a qualification form.
Email usQuestions
4.0 KB minified, 1.8 KB gzip, loaded async with no dependencies. The reporter, which lives inside your widget, is 6.5 KB gzip. Neither adds a blocking request: traffic leaves once an hour, aggregated.
The origin, the page path truncated to 120 characters with the query string stripped, your widget version, the hour rounded to the hour, and counters: loads, renders, errors, blocks, p95. No cookies, no visitor identifier, no page content, nothing a user typed.
The ingest API answers 204 to every request, valid or not, so it never confirms that a key exists. A stolen key lets somebody push noise into your account; it reads nothing at all. Keys are revoked and replaced from the dashboard.
Not in the first week, and that is deliberate. It takes seven days of history per domain to tell "silent" from "not visited". During that period the dashboard shows the baseline being built, and a domain never heard from is never painted green.
That is the normal case. Vigie groups by origin, not by customer name: you map origins onto your accounts afterwards. A widget served in an iframe works too, through the handshake between the parent page loader and the reporter.
No, and it is not meant to. Keep it for exceptions, stacks and breadcrumbs. Vigie answers a question that tool cannot ask: how many of my customers is my widget not running on at all.
Then the domain goes silent, and Vigie says so instead of painting it green. That is precisely why "never heard from" exists as a state separate from "healthy".
Serve the loader in the snippet your customers already paste. The first domains appear within the hour; the baseline is ready in seven days.
No commitment. No qualification call.