Carillon docs
Dashboard

Provider credentials

Upload and validate APNs keys and Firebase service accounts.

No notification can be sent until an APNs key or a Firebase service account has been uploaded. An app can have several credentials per provider. The newest non-revoked credential is selected for sending.

Apple

You need the .p8 key file, its 10-character Key ID, your Team ID, and the app's Bundle ID.

A .p8 can be downloaded exactly once

Apple shows the file at creation and never again. If you no longer have it, generate a new key in your developer account rather than looking for the old one.

The Bundle ID is what APNs routes by: its topic. A credential that does not name an app cannot send to one, and getting it wrong produces DeviceTokenNotForTopic on every delivery.

Google

Use your existing Firebase project and create a dedicated service account for Carillon within it. No separate Google Cloud project is needed. On that project, grant the service account Firebase Cloud Messaging API Admin (roles/firebasecloudmessaging.admin). It includes the cloudmessaging.messages.create permission required to send through FCM v1. Owner, Editor and Firebase Admin are not required.

Enable the Firebase Cloud Messaging API for the project, create a JSON key for that service account, then upload the whole JSON unchanged. The project ID is read from the file. Assign the role on the project's IAM page, to the service account principal; granting access to administer the service account itself does not grant permission to send messages in the project.

The JSON format alone does not determine privileges: IAM roles on its service account do. Prefer a dedicated account with the single messaging role over a broad Firebase Admin account. See Google's FCM authorization instructions and the role's permissions.

After upload

A credential is sealed on arrival and never readable again. What the page shows afterwards is the key id, the team id, a truncated fingerprint, the date, and a status. For FCM it also shows the service account's client_email and private_key_id in the dashboard, API and credential_list MCP tool. These identify the Google Cloud account and key; the private signing material remains unreadable. If these identifiers are missing, upload the original JSON to display them.

StatusMeaning
Never verifiedUploaded, not yet checked
ValidThe provider accepted it
RejectedThe provider refused it, and last_error carries their own word for why

Validation is attempted at upload and daily afterwards. If the provider cannot be reached, there is no new validation result. A credential can stop working between checks; inspect delivery errors as well as its last validation time.

Rotating

Upload the new credential first, verify its status and send to a test device, then delete the old one. Uploading with the same provider and Key ID replaces that credential in place. Deleting the selected credential makes the next newest non-revoked credential eligible; deleting the last one leaves that provider without a credential.

Going live · Troubleshooting · Upload a credential

On this page