> ## 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.

# Credits and wallet

> What each message costs in credits, how to top up, purchased versus bonus credits, how campaign holds work, and when credits expire.

export const DemoVideo = ({id, title, embedUrl, src, poster, duration}) => {
  if (embedUrl) {
    return <figure className="brd-media" data-media-id={id}>
        <iframe className="brd-media-frame w-full aspect-video" src={embedUrl} title={title} allow="accelerometer; autoplay; clipboard-write; encrypted-media; picture-in-picture" allowFullScreen />
      </figure>;
  }
  if (src) {
    return <figure className="brd-media" data-media-id={id}>
        <video className="brd-media-frame w-full aspect-video" src={src} poster={poster} controls playsInline preload="metadata" />
      </figure>;
  }
  const label = duration ? `Video walkthrough coming soon · ${duration}` : "Video walkthrough coming soon";
  return <Placeholder id={id} kind="video" label={label} description={title} ratio="16 / 9" icon={<PlayIcon />} />;
};

export const Loop = ({id, src, alt, caption}) => {
  if (!src) {
    return <Placeholder id={id} kind="loop" label="Animation coming soon" description={alt} icon={<PlayIcon />} />;
  }
  return <figure className="brd-media" data-media-id={id}>
      <video className="brd-media-frame" src={src} autoPlay muted loop playsInline aria-label={alt} />
      {caption && <figcaption className="brd-media-caption">{caption}</figcaption>}
    </figure>;
};

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>;
};

Credits are prepaid units held in your organization's wallet. They pay for every SMS and WhatsApp
message, and for email and push sends beyond your plan's allowance. One wallet serves the whole
organization.

<Note>
  **Any member can top up.** Buying credits isn't limited to owners and admins, so anyone on the team
  can charge the organization's default card. Editing the billing details and payment currency *is*
  limited to owners and admins. See [Members and roles](/organization/members-and-roles).
</Note>

<Screenshot id="ss-billing-credits-and-wallet-hero" alt="The Credits tab showing Total credits, Purchased, Bonus and On hold tiles, and the Top up button" />

<Accordion title="Watch the walkthrough" icon="circle-play">
  <DemoVideo id="V06" title="Fund your wallet and set up auto top-up" duration="2 min" />
</Accordion>

## What a message costs

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

* **SMS** is priced per segment at the destination country's rate. A long message or one with an
  emoji uses more segments. See [SMS overview](/channels/sms/overview).
* **WhatsApp** is in [early access](/channels/whatsapp/overview). Meta bills its own fees to your
  WhatsApp Business Account directly.

Before a campaign sends, the [send checklist](/campaigns/send-checklist) shows the estimate and
whether your balance covers it.

## What a credit costs

A credit bought on its own costs NGN 1. If your organization pays in another currency, the price is
converted at the current exchange rate. The **Top up** dialog shows the amount in your currency
before you pay. Credit packs add bonus credits on top.

## Your balance

Go to **Billing & Plans > Credits**. The **Credit balance** section has four tiles:

| Tile              | What it counts                                                      |
| ----------------- | ------------------------------------------------------------------- |
| **Total credits** | Purchased and bonus credits, available plus on hold                 |
| **Purchased**     | Credits you paid for. They can pay for every channel                |
| **Bonus**         | Credits added free with a credit pack. They can't pay for WhatsApp  |
| **On hold**       | Credits reserved for campaigns that are sending. Returned if unused |

Your wallet is in your organization's payment currency. See
[Billing overview](/billing/overview#payment-currency-and-regional-pricing).

## Top up now

<Steps>
  <Step title="Open the top-up dialog">
    Go to **Billing & Plans > Credits** and select **Top up**.
  </Step>

  <Step title="Choose how many credits">
    Select a bundle under **Choose a bundle**, or type a number under **Or enter an amount**. A
    typed amount shows its price in your currency as you type.

    <Screenshot id="ss-billing-credits-and-wallet-01-top-up" alt="The Top up credits dialog with bundles showing their bonus credits, a custom amount field and a Charge this card dropdown" />
  </Step>

  <Step title="Choose the card">
    If you have saved cards, pick one under **Charge this card**. A saved card is charged straight
    away. To pay with a different card, choose **Use a new card** and enter its details at the next
    step.
  </Step>

  <Step title="Pay">
    Select **Pay** followed by the amount. With a new card, Paystack's checkout opens to take the
    payment.
  </Step>
</Steps>

The credits appear in your balance as soon as the payment is confirmed, and you see **Credits added
to your wallet**. If confirmation takes a moment, you see **Payment received. Your credits will
appear shortly.** instead; the balance updates on its own. Any credit purchase also gives your
organization email support.

## Credit packs

A credit pack is a ready-made bundle. Packs discount by adding credits, not by lowering the price:
the credits you pay for cost the same per credit as buying them on their own, and bonus credits
arrive free on top, shown on the pack card as **+ N bonus**. A typed amount carries no bonus, and
neither does an auto top-up. Pack prices are converted into your payment currency at the current
rate, so the card shows what you'll actually pay.

The paid credits go into your **Purchased** balance and the bonus into **Bonus**, each as its own
batch on the **Credit expiry** list.

If no packs are on sale you see **No bundles are on sale right now. Enter a custom amount below.**,
and if one is withdrawn while the dialog is open, **This credit pack is no longer available**. Close
the dialog, reopen **Top up** and choose again.

## Purchased and bonus credits

Credits sit in two buckets, and each purchase is tracked as its own batch (a lot) with an expiry
date.

|                                        | Purchased credits                          | Bonus credits                 |
| -------------------------------------- | ------------------------------------------ | ----------------------------- |
| Come from                              | Top-ups and the paid part of a credit pack | Free with a credit pack       |
| Pay for                                | Every channel                              | Every channel except WhatsApp |
| Expire                                 | 12 months after purchase                   | 6 months after they're added  |
| Count toward the auto top-up threshold | Yes                                        | No                            |

Bonus credits can't pay for WhatsApp, because the WhatsApp fee is priced low and has no room for a
discount. When a campaign includes WhatsApp, that part must be covered by purchased credits. If it
can't be, the send is blocked with **Not enough purchased credits**, even when your total balance
looks large enough.

## Auto top-up

Auto top-up buys a fixed number of credits whenever your **purchased** credits fall below a
threshold you choose.

<Steps>
  <Step title="Save a card">
    Auto top-up charges a saved card. If you don't have one, select **Add a payment method** in the
    **Auto top-up** section, or add one under **Billing & Plans > Billing**. See
    [Payment methods](/billing/invoices-and-payments#payment-methods).
  </Step>

  <Step title="Open the settings">
    In the **Auto top-up** section of the **Credits** tab, select **Set up** (or **Edit**).
  </Step>

  <Step title="Set the threshold and amount">
    Fill in **When my purchased credits drop below** and **Top up by**, and pick the card under
    **Charge this card**. The dialog suggests 1,000 and 5,000 credits; set numbers that match how
    much you send in a day.
  </Step>

  <Step title="Save and switch it on">
    Select **Save settings**. The section reads **Auto top-up is on**. Use the switch to turn it off
    and on later; your settings are kept.

    <Loop id="lp-billing-credits-and-wallet-auto-top-up" alt="Switching auto top-up off and on, with the status line changing between on and off" />
  </Step>
</Steps>

| Rule                | Detail                                                                                 |
| ------------------- | -------------------------------------------------------------------------------------- |
| What's measured     | Purchased credits only. Bonus credits don't count, because they can't pay for WhatsApp |
| How often it checks | Every few minutes                                                                      |
| Daily cap           | Up to 3 top-ups a day                                                                  |
| Spacing             | At least 60 minutes between top-ups                                                    |
| Price               | The current credit price, with no bonus credits                                        |

The daily cap and the spacing exist so that a large send that keeps the balance under the threshold
can't charge your card again and again.

If the card is declined you get an **Auto top-up failed** notification, and Brudcast tries again
after the 60-minute spacing. After 3 failures in a row, auto top-up turns itself off and you get an
**Auto top-up disabled** notification. Update the card, then switch it back on.

## Holds: how a campaign pays

A campaign doesn't spend credits message by message. When it starts sending, Brudcast reserves the
estimated cost for every channel at once and puts it **On hold**.

```mermaid theme={"system"}
flowchart LR
    start["Campaign starts sending"] --> hold["Estimate reserved: On hold"]
    hold --> done["Channel finishes"]
    done --> settle["Actual use is charged"]
    done --> release["Unused credits return to the balance"]
```

* If the wallet can't cover the whole estimate, the campaign doesn't start. Reserving up front is
  what stops a funded campaign from running dry halfway through.
* When each channel finishes, the hold is settled against what was actually sent. Anything unused
  is released back to your balance.
* A hold with no final result after 48 hours is released automatically.
* Cancelling a campaign releases any credits still held for it. See
  [Campaigns overview](/campaigns/overview).

## Expiry

| Credits   | Expire                       |
| --------- | ---------------------------- |
| Purchased | 12 months after purchase     |
| Bonus     | 6 months after they're added |

Credits are always spent oldest expiry first, so the batches closest to expiring go first. Because
bonus credits expire sooner, they're usually spent before the credits you paid for, on any channel
they can pay for. The **Credit expiry** section on the **Credits** tab lists every batch with its
**Granted** date, **Type**, **Remaining** and **Expires** date. Batches within 30 days of expiry show
how many days are left.

You get a **Credits expiring soon** notification 30 days and again 7 days before a batch expires.
Expired credits are removed from your available balance. Credits on hold for a running campaign are
never taken back mid-send; they're removed once the hold ends.

## Ledger entries

Every change to the wallet is recorded as a ledger entry with one of these types:

| Type         | Recorded when                                           |
| ------------ | ------------------------------------------------------- |
| `topup`      | Credits are added by a purchase or an auto top-up       |
| `reserve`    | A campaign puts credits on hold                         |
| `settle`     | A hold is charged for what was actually sent            |
| `release`    | Unused held credits return to the balance               |
| `debit`      | Credits are charged directly rather than through a hold |
| `refund`     | Credits are returned after a refund                     |
| `adjustment` | Brudcast corrects the balance                           |
| `expiry`     | Credits are removed because their batch expired         |

## Low balance

When purchased credits fall below a threshold, you get a **Low credit balance** notification. The
threshold is your auto top-up threshold if you've set one, and 100 credits otherwise. With auto
top-up on, Brudcast refills the wallet instead of warning you.

## Troubleshooting

<AccordionGroup>
  <Accordion title="The auto top-up switch is greyed out" icon="circle-alert">
    **Why:** there's no saved card that can be charged again.

    **Fix:** add a card under **Billing & Plans > Billing**. See
    [Payment methods](/billing/invoices-and-payments#payment-methods).
  </Accordion>

  <Accordion title="“A reusable card belonging to this organization is required to enable auto top-up”" icon="circle-alert">
    **Why:** the chosen card was removed, or it can't be charged without you present.

    **Fix:** add the card again, or pick another under **Charge this card**.
  </Accordion>

  <Accordion title="“Payment failed: …”" icon="circle-alert">
    **Why:** the card issuer declined a charge to a saved card. The text after "Payment failed:" is
    the reason the payment gateway returned.

    **Fix:** try **Use a new card**, or contact your bank.
  </Accordion>

  <Accordion title="“Not enough purchased credits”" icon="circle-alert">
    **Why:** the campaign includes WhatsApp, and bonus credits can't pay for it.

    **Fix:** top up with purchased credits, or take WhatsApp out of the campaign.
  </Accordion>
</AccordionGroup>

## Related

<Columns cols={2}>
  <Card title="Billing overview" icon="wallet" href="/billing/overview">
    Cards, currencies, usage and invoices.
  </Card>

  <Card title="Send checklist" icon="list-checks" href="/campaigns/send-checklist">
    See what a campaign will cost before it sends.
  </Card>
</Columns>
