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

# SaaS & digital goods

> Accept crypto payments for SaaS subscriptions and digital products. Auto-settle to your bank account with the Breet API.

Accept crypto and stablecoin payments for subscriptions, licenses, and digital products. Breet generates a deposit address per invoice or subscription, tracks incoming transactions, and notifies your app via webhooks so you can activate access instantly. This opens your product to global customers who may not have access to traditional payment methods.

## How it works

<Steps>
  <Step title="Generate a deposit address per invoice">
    Call the [generate-address](/api-reference/crypto-wallet/generate-wallet-address) endpoint when a customer initiates a purchase or subscription. Use the invoice or subscription ID as the `label` to link the payment to the order.
  </Step>

  <Step title="Display payment instructions">
    Show the deposit address and expected amount on your checkout or billing page. The customer sends crypto from any external wallet.
  </Step>

  <Step title="Receive a webhook on payment">
    When the customer sends crypto, Breet detects the on-chain transaction and sends a [webhook](/webhooks) to your server with the amount, asset, and status.
  </Step>

  <Step title="Activate the product or subscription">
    Parse the webhook payload, match it to the invoice using the `label` or `destinationAddress`, verify the amount, and grant access.
  </Step>

  <Step title="Settle funds (optional)">
    How funds are handled after a payment depends on your setup:

    * **Without auto-settlement**: payments are converted and held in your wallet in your chosen currency (USD, NGN, or GHS). You can view the balance on your dashboard and withdraw manually whenever you're ready.
    * **With per-address auto-settlement**: each payment is automatically converted and paid out to the bank account linked to that address. Enable it via the API. See the [auto-settlement guide](/auto-settlement).
    * **With business-wide auto-settlement**: all payments across all addresses are automatically withdrawn to a single destination (bank account). Enable it from your dashboard under **Settings > Automatic Settlement**.

    You can set your preferred holding currency from the dashboard under **Settings > Crypto Settings**.
  </Step>
</Steps>

## Generate a payment address

```bash theme={null}
curl -X POST "https://api.breet.io/v1/trades/sell/assets/ASSET_ID/generate-address" \
  -H "x-app-id: YOUR_APP_ID" \
  -H "x-app-secret: YOUR_APP_SECRET" \
  -H "X-Breet-Env: production" \
  -H "Content-Type: application/json" \
  -d '{"label": "inv-20260301-0042"}'
```

Replace `ASSET_ID` with the identifier for the crypto asset you want to accept (e.g., USDT, USDC). See the [supported assets](/supported-assets) page for the full list. Use the `label` field to tag the address with your invoice or subscription ID for easy reconciliation.

<Tip>
  List available assets by calling [`GET /trades/assets`](/api-reference/assets/fetch-deposit-assets) to get valid asset IDs for your account.
</Tip>

## What Breet handles

* Generating deposit addresses tied to invoices or subscriptions
* Monitoring blockchains for incoming payments
* Sending webhook notifications with transaction details
* Converting crypto to local fiat via auto-settlement
* Payouts to linked bank accounts

## What you handle

* Creating invoices and mapping them to deposit addresses
* Displaying payment instructions and the deposit address at checkout
* Listening for and processing webhook events
* Verifying payment amounts against invoice totals
* Activating subscriptions or delivering digital goods after confirmation
* Handling underpayments, overpayments, or expired invoices

## Example user journey

1. Chinwe selects a yearly plan for your SaaS product and chooses **Pay with crypto** at checkout.
2. Your app creates an invoice and calls Breet's [generate-address](/api-reference/crypto-wallet/generate-wallet-address) endpoint with the invoice ID as the label.
3. The checkout page displays a USDT deposit address, the expected amount, and a QR code.
4. Chinwe sends the exact amount from her personal wallet.
5. Breet detects the transaction and sends a `trade.completed` webhook to your server.
6. Your app verifies the payment amount, marks the invoice as paid, and activates Chinwe's subscription.
7. Chinwe receives a confirmation email and gets immediate access to the product.

## FAQ

<AccordionGroup>
  <Accordion title="Can I link payments to specific invoices?">
    Yes. Use the `label` field when generating a deposit address to tag it with your invoice or subscription ID. When a webhook fires, match the `destinationAddress` or `label` back to the invoice in your system.
  </Accordion>

  <Accordion title="How do I handle recurring payments?">
    For each billing cycle, generate a new deposit address with the new invoice ID as the label. Alternatively, reuse an existing address if you track payments by amount and timing. Send your customer the address and expected amount ahead of each renewal.
  </Accordion>

  <Accordion title="Can I accept payments from any country?">
    Yes. Crypto payments are borderless. Any customer with a crypto wallet can pay, regardless of their location. This makes Breet a strong option for reaching global customers who may not have access to cards or local payment methods.
  </Accordion>

  <Accordion title="What happens if a customer underpays?">
    Breet reports the exact amount received in the webhook payload. Your app is responsible for comparing the received amount to the invoice total and deciding how to proceed. You can prompt the customer to send the remaining balance, issue a partial credit, or reject the payment.
  </Accordion>
</AccordionGroup>
