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
- In the Flashduty console, select Channel and open a channel
- Select Configuration → Integrations → Private integration, then click Add an integration
- Select Firebase Crashlytics, then click Save
- Open the generated integration card and copy the Push URL
Use a shared integration
- In the Flashduty console, select Integration Center → Alert Events
- Select Firebase Crashlytics and enter an integration name
- Configure the default route and select a channel; after creation, add more rules under Route if needed
- 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 The field names and value paths all come from
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):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
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()orFirebaseCrashlytics.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
newFatalIssuedeliveries — 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 earliernewFatalIssuealert - Changes to the issue title, subtitle, app version, or any timestamp do not change the Alert Key
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:logto see whether the function ran and whetherfetchthrew an error - Flashduty returns an invalid parameter error: This is usually a renamed field in the template, or an
integration_keyin 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
firebase-functions source for alerts/crashlytics.