At a glance
The percentage of Supabase Edge Function invocations that failed in the last hour. Edge Functions are the serverless Deno workers that run your custom server-side logic: webhook receivers, payment confirmations, scheduled jobs, third-party API calls, and the glue between your app and external services. When this number climbs, a slice of your custom backend logic is silently failing. Anything above 2% means real user journeys (or background jobs you depend on) are breaking, and the failures often do not surface as front-end errors because Edge Functions run out of band.
| What it tracks | The share of Edge Function invocations returning a non-2xx outcome (uncaught exceptions, non-zero exits, timeouts, boot failures, and explicit 4xx/5xx responses your handler returns) over the rolling window. Expressed as failed invocations divided by total invocations, times 100. |
| Data source | Supabase Edge Function logs and invocation metrics, surfaced via the project Logs (Edge Functions) and the Functions analytics endpoint. The runtime is Deno; each invocation emits a structured log line with status and execution time. |
| Time window | 1h rolling. Short enough to catch a regression minutes after a deploy, long enough to smooth out single one-off failures. |
| Alert trigger | >2%. Above this, the card turns amber/red and feeds the Nerve Centre incident feed. Tune per project in the Sensitivity tab. |
| Why it matters | Edge Functions usually sit on the revenue path: Stripe webhook handlers, order-confirmation emailers, inventory sync workers. A failing function does not throw a visible 500 in the browser, so a 5% error rate can run for hours before anyone notices a backlog of unprocessed webhooks. |
| Reading the value | 0 to 1% is normal background noise (the occasional upstream timeout). 2 to 5% means a specific function is degraded; drill into which slug. Above 5% means a deploy regression or an upstream dependency outage. |
| Roles | engineering, platform/SRE, owner |
Calculation
The card aggregates Edge Function invocation outcomes over the rolling 1-hour window and computes:- An uncaught exception in the Deno handler (the runtime returns a 500 and logs the stack).
- A handler that explicitly returns a 4xx or 5xx
Response(counted as a failure for this card unless you tag it otherwise). - A wall-clock timeout: the function exceeded the per-tier execution limit (Free and Pro have a CPU/wall-clock cap; the worker is killed and the invocation is marked failed).
- A boot/cold-start failure: the function failed to import a module, hit a missing environment secret, or the bundle failed to load.
- A memory limit breach: the isolate exceeded its memory ceiling and was terminated.
Worked example
A platform team runs a Supabase project (Pro tier) behind a headless storefront. Their Edge Functions includestripe-webhook (payment confirmations), order-confirmation-email, inventory-sync (pulls stock from an ERP every 5 minutes), and image-resize. Snapshot taken on 14 Apr 26 at 09:40 BST, the morning after a Tuesday-night deploy.
| Function slug | Invocations (last 1h) | Failures | Error rate | Dominant failure mode |
|---|---|---|---|---|
stripe-webhook | 1,420 | 0 | 0.0% | healthy |
order-confirmation-email | 1,380 | 9 | 0.7% | upstream SMTP 4xx |
inventory-sync | 12 | 7 | 58.3% | uncaught exception |
image-resize | 6,210 | 12 | 0.2% | occasional timeout |
| Project total | 9,022 | 28 | 0.31% | mixed |
inventory-sync, and that one reads 58.3%, deep red. The Tuesday deploy renamed an environment secret (ERP_API_KEY to ERP_TOKEN) but the function still references the old name, so every invocation throws at boot. Because inventory-sync is low traffic (12 runs/hour), its failures are invisible at the project level.
- Watch per-function, not just project-level. A noisy headline can be dominated by one high-traffic healthy function while a critical low-traffic worker burns. Pin a separate panel for every revenue-path function.
- Boot failures are the silent killer. A renamed secret, a missing import, or a bad bundle fails every invocation instantly. These show as a near-100% rate on the affected slug but barely move the aggregate.
- Pair with the backlog, not just the rate. A failing webhook handler means events are queued upstream (Stripe retries for up to 3 days). Once you fix the function, expect a replay surge; size your pool and rate limits for it.
Sibling cards
| Card | Why pair it with Edge Function Error Rate | What the combination tells you |
|---|---|---|
| PostgREST 5xx Error Rate % | The other API surface. Edge Functions often call PostgREST internally. | If both spike together, the database layer is the root cause; if only Edge Functions spike, the fault is in your function code or an external dependency. |
| Database Query Error Rate % | Functions that hit Postgres directly surface DB errors here. | A function failing on query errors links the two; fix the query, the function recovers. |
| Supavisor Pool Saturation % | Edge Functions open pooled connections. | A saturated pool makes functions time out waiting for a connection, inflating the error rate without any code bug. |
| Auth Sign-In Error Rate % | Auth-gated functions fail when token verification fails. | Both red together points at an Auth/JWT misconfiguration rather than function logic. |
| Supabase Health Score | The composite that takes error rates as inputs. | A red Edge Function rate drags the composite; use the score for the executive headline. |
| Memory Usage % | Memory pressure on the instance can starve functions calling the DB. | High memory plus rising function errors equals a capacity problem, not a code problem. |
Reconciling against the source
Where to look in Supabase’s own tooling:Project Dashboard → Edge Functions → Logs for the per-invocation log stream with status, execution time, and the Deno console output. Filter by function slug and by status to isolate failures. Project Dashboard → Edge Functions → (function) → Metrics/Invocations for the invocation count and error count charts the card aggregates. Logs Explorer with theWhy our number may legitimately differ from the Supabase UI:function_edge_logssource and a SQL filter (for examplewhere metadata.response.status_code >= 400) for an exact count over an arbitrary window.
| Reason | Direction | Why |
|---|---|---|
| Window boundary | Variable | Vortex IQ uses a rolling 1-hour window; the Supabase chart you are looking at may be set to 24h or a fixed range. Match the range before comparing. |
| What counts as a failure | Vortex IQ may read higher | We count handler-returned 4xx as failures by default; the Supabase invocation chart may class only 5xx and runtime errors as errors. Adjust the failure definition in Sensitivity if you only care about 5xx. |
| Minimum-invocation floor | Vortex IQ may read lower | If the floor is set, a quiet window with too few invocations is suppressed to avoid a one-off failure tripping a false alert. |
| Log ingestion latency | Brief lag | Edge logs land in the Logs pipeline within seconds, but a heavy burst can delay aggregation by a minute, so a freshly-started incident may read slightly low for the first poll. |
| Function scope | Variable | The project-level card sums all functions; a Supabase chart filtered to one slug will differ from the aggregate. |
stripe-webhook should correspond to climbing webhook retry counts on the Stripe side; if Stripe shows retries but Supabase shows no invocations, the events are not reaching your function at all (a routing or URL problem, not a code problem).