Skip to main content

Firebase Push Connector

Push notifications via Firebase Cloud Messaging (FCM) HTTP v1 API.

Package

dotnet add package Ratatosk.Firebase

Required settings

ParameterTypeDescription
ProjectIdstringFirebase project ID (from Firebase Console)
ServiceAccountKeystringFull JSON content of the Firebase service account private key

Optional settings

ParameterTypeDefaultDescription
DryRunboolfalseWhen true, validates the message without sending

The ServiceAccountKey must be the complete JSON content of a Firebase service account key file, not a file path.

Schema

PropertyValue
ProviderFirebase
TypePush
Version1.0.0
CapabilitiesSendMessages, BulkMessaging
Content typesPlainText, Json
EndpointsDevice (FCM token), Id (topic)
AuthenticationFirebase service account JWT

Send examples

Notification to a device token

var settings = new ConnectionSettings()
.SetParameter("ProjectId", "my-project")
.SetParameter("ServiceAccountKey", serviceAccountJson);

var connector = new FirebasePushConnector(FirebaseChannelSchemas.FirebasePush, settings);
await connector.InitializeAsync(ct);

var message = new MessageBuilder()
.WithId("push-1")
.To(Endpoint.Device("fcm-device-token-here"))
.WithText("You have a new notification")
.WithTitle("New message")
.Build();

var result = await connector.SendMessageAsync(message, ct);

Notification to a topic

new MessageBuilder()
.WithId("push-topic-1")
.To(Endpoint.Id("/topics/news"))
.WithText("Breaking news: ...")
.WithTitle("News alert")
.Build();

Push with custom data payload

new MessageBuilder()
.To(Endpoint.Device("fcm-token"))
.WithContent(new JsonContent("{\"order_id\": \"ORD-123\", \"status\": \"shipped\"}"))
.WithTitle("Order shipped")
.WithSound("default")
.WithBadge(1)
.Build();

Batch push to multiple devices

var batch = new MessageBatch();
foreach (var token in deviceTokens)
{
batch.Messages.Add(new MessageBuilder()
.WithId(Guid.NewGuid().ToString("n"))
.To(Endpoint.Device(token))
.WithText("You have a new message")
.WithTitle("New message")
.Build());
}

var result = await connector.SendBatchAsync(batch, ct);

Dry run (validation without sending)

settings.SetParameter("DryRun", true);
// All sends will be validated by Firebase but not delivered

Message properties

PropertyTypeDescription
TitlestringNotification title
soundstringSound file to play (e.g., "default")
badgeintBadge count for the app icon
imagestringImage URL for rich notifications
click_actionstringAction to perform on notification tap
prioritystring"normal" or "high"
ttlintTime-to-live in seconds

Authentication

Firebase uses OAuth 2.0 with a JWT signed by the service account's private key. The FirebaseServiceAccountAuthenticationProvider handles this automatically:

  1. Reads ProjectId and ServiceAccountKey from settings
  2. Creates a signed JWT with the service account's private key
  3. Exchanges the JWT for a Firebase OAuth 2.0 access token
  4. Caches the token and refreshes it before expiry

Error codes

Firebase-specific error codes are defined in FirebaseErrorCodes with domain "Firebase".

CodeDescription
MISSING_SERVICE_ACCOUNT_KEYService account key is missing or invalid
MISSING_PROJECT_IDFirebase project ID is missing
INITIALIZATION_FAILEDFirebase app initialization failed
UNREGISTERED_TOKENDevice registration token is no longer valid
INVALID_ARGUMENTRequest contains an invalid argument
SENDER_ID_MISMATCHSender ID does not match the registered token
THIRD_PARTY_AUTH_ERRORThird-party authentication error occurred
SERVICE_UNAVAILABLEFCM service is temporarily unavailable
INTERNAL_ERRORInternal error in the Firebase service

Standard MessagingErrorCodes are also used — see the error codes reference.

Original provider codes

Firebase Admin SDK errors (FirebaseMessagingException) are mapped to framework error codes in FirebaseService.MapFirebaseErrorCode():

FCM MessagingErrorCodeMapped framework code
InvalidArgumentINVALID_ARGUMENT
UnregisteredUNREGISTERED_TOKEN
SenderIdMismatchSENDER_ID_MISMATCH
QuotaExceededRATE_LIMIT_EXCEEDED
ThirdPartyAuthErrorTHIRD_PARTY_AUTH_ERROR
UnavailableSERVICE_UNAVAILABLE
InternalINTERNAL_ERROR
OtherSEND_MESSAGE_FAILED

Troubleshooting

SymptomLikely causeFix
INVALID_CREDENTIALSWrong ProjectId or ServiceAccountKeyVerify in Firebase Console → Project Settings → Service Accounts
INVALID_RECIPIENTInvalid FCM tokenToken may be stale; request a new token from the client
PROVIDER_VALIDATION_FAILEDPayload too largeFCM limit is 4096 bytes for most payloads
Device not receivingToken was unregisteredRemove token from your store; Firebase returns UNREGISTERED
Topic send failingTopic doesn't existTopics are auto-created; verify the format starts with /topics/
Token expiredToken refreshedListen for token refresh on the client and update your store

FirebaseChannelSchemas

// Push notification schema
FirebaseChannelSchemas.FirebasePush