> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brudcast.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Push notifications overview

> Send push notifications through your own Firebase project: what you need, how apps and devices fit together, and what it costs.

export const Screenshot = ({id, src, srcDark, alt, caption}) => {
  if (!src) {
    return <Placeholder id={id} kind="screenshot" label="Screenshot coming soon" description={alt} icon={<ImageIcon />} />;
  }
  return <figure className="brd-media" data-media-id={id}>
      <img className="brd-media-frame block dark:hidden" src={src} alt={alt} />
      <img className="brd-media-frame hidden dark:block" src={srcDark || src} alt={alt} />
      {caption && <figcaption className="brd-media-caption">{caption}</figcaption>}
    </figure>;
};

Push notifications reach people who installed your app or allowed notifications on your website.
Brudcast sends them through Firebase Cloud Messaging (FCM), using a Firebase project that you own, so
they arrive from your app exactly as if your own servers had sent them.

**Your app has to use the Firebase SDK already.** Firebase Cloud Messaging is the only provider
Brudcast connects to. There's no direct connection to Apple Push Notification service and none to a
web push service, so an iOS app or a website is reachable only when it goes through Firebase. Android,
iOS and web apps registered in your Firebase project are all reachable that way. See
[Which devices Firebase reaches](/channels/push/connect-firebase#which-devices-firebase-reaches).

Push has no sender identity and no review. Brudcast checks your key with Firebase instead. A key
that Firebase accepts proves you control the project, the same way a verified domain does for email.

<Screenshot id="ss-push-overview-hero-channel-page" alt="The Push channel page with its Setup and Apps tabs and the Active, Pending Validation and Credential Invalid counters" />

## Setup path

<Steps>
  <Step title="Before you start" icon="wallet">
    Push is its own product, and an email plan doesn't include it. Choose a push plan in
    **Billing & Plans**. See [Plans and subscriptions](/billing/plans-and-subscriptions). You also
    need a Firebase project that contains your app, and permission to create service accounts for it.
  </Step>

  <Step title="Set up your identity" icon="key-round">
    Push has no sender identity. Instead you connect your Firebase project as an app, using a service
    account key. See [Connect Firebase](/channels/push/connect-firebase).
  </Step>

  <Step title="Verify or get approved" icon="circle-check">
    Nobody reviews a push app. Brudcast validates the key with Firebase, which takes a few seconds,
    and the app becomes **Active** or **Credential invalid**. See
    [App statuses](#app-statuses).
  </Step>

  <Step title="Check before you send" icon="smartphone">
    Register the device tokens your app collects, from your backend, then send a test notification to
    one device. See [Register device tokens](/channels/push/register-device-tokens) and
    [Send a test first](/channels/push/send-your-first-push#send-a-test-first).
  </Step>

  <Step title="Go live" icon="send">
    [Send your first push notification](/channels/push/send-your-first-push) from a campaign.
  </Step>
</Steps>

## How push differs from email and SMS

|              | Email                             | SMS                            | Push                                  |
| ------------ | --------------------------------- | ------------------------------ | ------------------------------------- |
| Identity     | From address on a verified domain | Sender ID, reviewed before use | A Firebase app, checked automatically |
| Recipient    | Email address                     | Phone number                   | Device token your backend registers   |
| Credits      | Only beyond the plan allowance    | Always, wallet gated           | Only beyond the plan allowance        |
| Confirmation | Delivered to the receiving server | Delivery reports               | Accepted by Firebase                  |

## How the pieces fit together

```mermaid theme={"system"}
flowchart LR
  F[Your Firebase project] -- service account key --> A[App in Brudcast]
  D[Your app on a device] -- device token --> C[Contact in Brudcast]
  K[Campaign] --> A
  A -- through FCM --> D
  C -. token registered against the app .-> A
```

Each **app** in Brudcast is one Firebase project. Devices register against an app, and campaigns
send through every active app unless you pick some.

## App statuses

| Status in the dashboard | Value                | What it means                                                                                            |
| ----------------------- | -------------------- | -------------------------------------------------------------------------------------------------------- |
| **Validating**          | `pending_validation` | Brudcast is checking the key with Firebase. This usually takes a few seconds, and the app can't send yet |
| **Active**              | `active`             | Firebase accepted the key. Campaigns and test sends go through this app                                  |
| **Credential invalid**  | `credential_invalid` | Firebase rejected the key, either during validation or during a send. Replace it to send again           |
| **Disabled**            | `disabled`           | You disabled the app. Its key is deleted and its devices can't be reached                                |

When Firebase rejects the key during a campaign, Brudcast stops sending through that app straight
away rather than failing every device one by one. You get a notification in the dashboard and an
email.

## The Push page

Go to **Channels > Push**. It has two tabs:

* **Setup**: the checklist for this channel ("Connect your app for push", then "Get your app's
  credential validated"), and your plan's notification allowance.
* **Apps**: every Firebase app you've connected, with its project ID, platforms, status and number
  of active devices.

The counters at the top show how many apps are **Active**, **Pending Validation** and
**Credential Invalid**.

## What it costs

<Snippet file="credit-costs.mdx" />

Push is billed like email, not like SMS. Your push plan includes a number of notifications each
billing period (the free plan includes 10,000), and the **Plan allowance** panel on the **Setup**
tab shows how much you've used.
Beyond the allowance, each notification costs 1 credit from your wallet. Push isn't wallet gated, so
a campaign that crosses the allowance partway through finishes instead of stopping.

Plans also cap how many subscribers you can have: contacts with at least one active device. See
[The subscribers quota](/channels/push/register-device-tokens#the-subscribers-quota) and
[Plans and subscriptions](/billing/plans-and-subscriptions).

## Accepted, not delivered

Firebase confirms that it accepted a notification. It doesn't confirm that the notification reached
the device, because push has no delivery receipt. Campaign results and reports therefore label push
**Accepted** where email says **Delivered**. Read accepted as "handed to Firebase", not as "seen".

Tokens that Firebase rejects as no longer valid count as bounces, and Brudcast expires those devices
so later campaigns skip them. Push doesn't report opens or clicks.

## Related

<Columns cols={2}>
  <Card title="Connect Firebase" icon="flame" href="/channels/push/connect-firebase">
    Create a service account key and add your first app.
  </Card>

  <Card title="Register device tokens" icon="smartphone" href="/channels/push/register-device-tokens">
    Store each device's token on its contact.
  </Card>

  <Card title="Send your first push" icon="send" href="/channels/push/send-your-first-push">
    Test on one device, then send a campaign.
  </Card>

  <Card title="Push troubleshooting" icon="wrench" href="/channels/push/send-your-first-push#troubleshooting">
    Every push symptom and its fix, at the end of Send your first push.
  </Card>
</Columns>
