# Health and monitoring

How formbase monitors integrations, refreshes tokens, and surfaces errors.

## Health and monitoring

formbase keeps your integrations running behind the scenes — refreshing tokens before they expire, pausing when something breaks, and showing you exactly what happened so you can fix it fast.

<h2 id="proactive-token-refresh">Proactive token refresh</h2>

<p>
  A daily background job checks the OAuth connections in your workspace, including Cal.com. If a token expires within the next 24 hours,
  formbase refreshes it automatically — no action needed from you.
</p>

<p>
  This applies to Google, Slack, Linear, Airtable, and Cal.com. Notion and GitHub issue tokens that don't expire, so they're skipped.
  Discord tokens expire after about 7 days and are refreshed on demand right before each delivery rather than by the daily job.
</p>

<p>
  If a refresh fails — for example because the connection was revoked on the provider side — formbase marks the connection as expired and
  moves every integration that shares it into an error state. You'll see a warning on each affected integration and receive a notification
  email.
</p>

<h2 id="health-states">Health states</h2>

<p>
  Each integration card carries a status badge, and opening the integration shows a banner explaining what to do. The badge says{' '}
  <strong>Active</strong>, <strong>Paused</strong>, or <strong>Delivery error</strong>; the banner is more specific.
</p>

<p>
  Connection problems always take priority. If a token expired, reconnecting fixes every integration that shares that account at once — no
  need to address each one separately.
</p>

<h2 id="error-indicators">Error indicators</h2>

<p>When something goes wrong, formbase shows it in two places:</p>

<ul>
  <li>
    <strong>Integration card</strong> — the card shows a status badge and a colored border: orange for a connection problem, red for a
    delivery error. When the connection expired, a <strong>Reconnect</strong> button appears on the card itself.
  </li>
  <li>
    <strong>Detail panel</strong> — open the integration to see a banner naming what happened and how to fix it.
  </li>
</ul>

<h2 id="auto-pause">Auto-pause after repeated failures</h2>

<p>
  If an integration fails 5 times in a row, formbase pauses it so a broken destination cannot keep burning deliveries. An authentication,
  permission, or not-found error skips the counter and stops the integration immediately, because retrying cannot fix it.
</p>

<p>
  Either way, an email goes to the person who set the integration up — or to the workspace owner when that address is unavailable. It is
  sent at most once per integration per 24 hours, so one broken destination cannot flood your inbox.
</p>

<p>Fix the underlying issue, then press Resume. Delivery picks up from the next new submission.</p>

<h2 id="event-log">Event log</h2>

<p>
  Each integration lists its last 20 events under <strong>Recent events</strong> — deliveries, connection tests, and backfill exports, each
  marked as passed or failed. A failed entry shows the destination's own error message, so a Notion validation error reads exactly as Notion
  worded it. A failed backfill also gets a <strong>Retry</strong> button that restarts the export.
</p>

<h2 id="failed-deliveries">Failed deliveries and retries</h2>

<p>
  Every delivery gets up to 5 attempts, waiting at least 1, 2, 4, and 8 minutes between them, or longer when the destination asks for more
  time through a <code>Retry-After</code> header. formbase looks for due retries every 30 minutes, so each retry can come up to half an hour
  later, and the last attempt about two hours after the first.
</p>

<p>
  Submissions that use up all 5 attempts are counted in a banner at the top of the integration: "3 submissions failed to deliver".{' '}
  <strong>Retry all</strong> re-queues every one of them and reactivates the integration if it was paused or errored. The banner is hidden
  when nothing has failed.
</p>

> ℹ️ **Analytics destinations are separate**
> <p>
>     Everything on this page covers submission integrations. Analytics event forwarding is best-effort and never retried, and Axiom answer
>     streaming stops on its own after 20 consecutive failures. See <a href="/integrations/analytics-streaming">Analytics streaming</a>.
>   </p>

<h2 id="reconnecting">Reconnecting an expired credential</h2>

<p>
  When a connection expires, click <strong>Reconnect</strong> on the integration card or in the detail panel. This re-runs the OAuth flow
  with the same provider. Once authorized, the credential is restored and all integrations using that account resume automatically.
</p>

<p>You can also switch to a different connected account from the detail panel if the original account is no longer available.</p>

<h2 id="faq">FAQ</h2>

  <p>
    Once a day. Tokens expiring within 24 hours are refreshed automatically. If you suspect an issue sooner, open the integration detail
    panel — the health state updates in real time based on delivery results.
  </p>

  <p>
    No. Submissions are always saved in formbase regardless of integration status. Failed deliveries are queued and can be retried from the
    detail panel once the issue is resolved.
  </p>

  <p>
    formbase refreshes tokens proactively, so in most cases you won't notice. If the refresh fails, you receive an email notification
    immediately — typically before the token actually expires.
  </p>

  <p>
    The integration switches to the new account. Make sure the new account has access to the same destination (spreadsheet, database,
    channel). If the destination doesn't exist in the new account, you'll need to update the integration settings.
  </p>

<h2 id="next-steps">Next steps</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Google Sheets](/integrations/google-sheets) — Auto-sync submissions to a spreadsheet
  - [Slack](/integrations/slack) — Send submissions to a Slack channel
  - [Webhooks](/integrations/webhooks) — POST signed JSON to any URL
  - [Notion](/integrations/notion) — Push submissions into a Notion database
</div>
