Skip to main content
Firebase Crashlytics has no generic outbound webhook for third parties: crash alerts are delivered only through Firebase Alerts, as an Eventarc event to a Cloud Function (2nd gen). This integration provides a Cloud Function that subscribes to Crashlytics alert events and forwards them to Flashduty, covering: Firebase also sends a stability digest (onStabilityDigestPublished), a daily rollup of several trending issues. It is a periodic report, not one actionable issue, so this integration does not turn it into an alert.

In Flashduty On-call


You can obtain an integration push URL in either of the following ways.

Use a dedicated integration

  1. In the Flashduty console, select Channel and open a channel
  2. Select Configuration → Integrations → Private integration, then click Add an integration
  3. Select Firebase Crashlytics, then click Save
  4. Open the generated integration card and copy the Push URL

Use a shared integration

  1. In the Flashduty console, select Integration Center → Alert Events
  2. Select Firebase Crashlytics and enter an integration name
  3. Configure the default route and select a channel; after creation, add more rules under Route if needed
  4. Click Save and copy the generated Push URL

Configure Firebase


Crashlytics alert functions run on Cloud Functions (2nd gen). The Firebase project must be on the Blaze (pay as you go) plan to deploy them, even if actual usage stays inside the free tier — a billing account still has to be attached.
1

Set up the Cloud Functions project

If the project has no Cloud Functions yet, run this in the project root:
Choose JavaScript or TypeScript, and keep the default firebase-functions and firebase-admin dependencies.
2

Add the forwarding function

Replace or append functions/index.js (or your entry file) with the following, and replace FLASHDUTY_URL with the push URL you copied above (keep the ?integration_key=... part):
The field names and value paths all come from firebase-functions’s official type definitions — do not rename them. event.alertType, event.appId, event.data.createTime, and event.data.payload.issue are common to every event type; resolveTime exists only on a regression event; crashCount, crashPercentage, and firstVersion exist only on a velocity alert. The function relies on the fetch built into Node.js 18 and later, so no extra HTTP client library is needed.To wire up only some of these events, remove the require entries and exports lines you don’t need, and leave the field names of the ones you keep unchanged.
3

Scope to one app if needed

If the Firebase project has several apps (one App ID each for iOS, Android, and Web) and you only want events from one of them, change onXxxPublished(handler) to onXxxPublished(appId, handler). Find appId under Project settings → General → your app’s App ID. Without an appId, events from every app in the project are forwarded.
4

Deploy

The first deploy of a Firebase Alerts-triggered function can take a few minutes while the underlying Eventarc services are enabled; that is expected.
5

Verify

Crashlytics alerts have no test button. Verify in two separate steps:
  • Verify the Flashduty side: send a curl request to the push URL using the same field shape as the template, and confirm it opens an alert:
    Close this test alert in Flashduty by hand afterward.
  • Verify the full pipeline: trigger a real crash in a debug build (for example, force an exception after Crashlytics.crash() or FirebaseCrashlytics.getInstance().log(...)), wait for the issue to appear in the Crashlytics console (this can take a few minutes), and confirm Flashduty receives the matching alert.
6

Turn on the auto-resolve timeout

Crashlytics sends no “resolved” notification for any of these events, so alerts in Flashduty do not recover on their own. In the channel that receives this integration’s alerts, turn on the auto-resolve timeout, set the window timing start to Incident trigger, and set the timeout to 72 hours — crash issues usually take longer to triage and ship a fix for than a typical infrastructure incident. See Create and edit channels for the steps. Close the alert by hand in Flashduty once the fix has shipped.

Alert Key


Flashduty computes the Alert Key from the event type alert_type, the app ID app_id, and Crashlytics’ issue ID issue_id (the official Issue.id). One Cloud Function deployment (one push URL) can forward events for every app in the project (see “Scope to one app” above), and Firebase does not document issue_id as unique across apps, so app_id is folded in too — this keeps two apps from merging into one alert if they happen to get the same issue ID. As a result:
  • Two deliveries of the same event type for the same issue on the same app (for example, two newFatalIssue deliveries — Eventarc may retry) merge into the same alert
  • A new fatal issue and a later velocity alert on the same issue and app are two separate alerts
  • An issue that was previously marked resolved and reoccurs (regression) opens a new alert — it does not reuse the earlier newFatalIssue alert
  • Changes to the issue title, subtitle, app version, or any timestamp do not change the Alert Key
If a request is missing issue_id, Flashduty rejects it.

Severity


Crashlytics alert events carry no severity. Flashduty sets it by event type: To override this with a fixed severity, append &severity=Critical (or Warning, Info) to the push URL.

Alert content


The alert title is Firebase Crashlytics <event type>: <issue_title>, for example Firebase Crashlytics new fatal issue: java.lang.NullPointerException. The description includes the issue subtitle (the class and method where the crash happened) and the app version; a regression alert also includes the time the issue was previously marked resolved, and a velocity alert also includes the crash session count, crash percentage, and the version where the issue first appeared.

Troubleshooting


  • Function deployment fails or reports a permission error: Make sure the Firebase project is on the Blaze plan and the account deploying it has permission to deploy Cloud Functions on that project
  • A crash happened but no alert arrives: Crashlytics can take a few minutes to process a crash log and trigger the alert function; check firebase functions:log to see whether the function ran and whether fetch threw an error
  • Flashduty returns an invalid parameter error: This is usually a renamed field in the template, or an integration_key in the push URL that does not belong to this integration — compare your function against the template above field by field
  • Alerts never recover: None of these events carries a recovery signal. Turn on the channel’s auto-resolve timeout, or close the alert by hand once it is fixed
For field details, see Firebase’s official Trigger a function on Crashlytics events and the firebase-functions source for alerts/crashlytics.