---
title: "Receive deposits"
description: "Know when money lands on a v2 account: the deposit webhooks for fiat-only and wallet-backed accounts, and how to credit once."
---
**API version:** v2.

When a payer sends money to an active account's bank details, Gravv books the deposit and sends webhooks of category `transfer`. Which webhooks you get depends on whether the account is fiat-only or wallet-backed.

**A money example.** Ada's client pays 1,200.00 USD by ACH into her wallet-backed account.

1. The bank turns it into USDC and sends it to the account's wallet on polygon. Gravv sends `inflow.onchain.completed` for the wallet.
2. Gravv books the full deposit and sends `transfer.inflow.deposit_settled`. Gravv bills any deposit fee on your plan for that rail to your business separately.
3. Both events describe one deposit. You credit Ada once, and `GET /v2/accounts/{id}` shows the new balance.

## Webhooks by account

| Account | Events |
| :-- | :-- |
| Fiat-only (USD at a US bank, EUR or GBP with one IBAN, NGN, Kenya-held) | `transfer.inflow.completed` |
| Wallet-backed | `transfer.inflow.deposit_settled` (`status` `settled`, `tokenized` `true`), and `inflow.onchain.completed` from the wallet side |
| Held for a decision on the Dashboard | `transfer.inflow.awaiting_approval` first |
| The credit failed or was reversed | `transfer.inflow.payout_failed` or `transfer.inflow.compensated` |

`event_group_id` is the deposit's `transaction_id`. A wallet-backed deposit's `settlement_event_group_id` is the `event_group_id` of its on-chain event. Use it to link the two events and credit the customer once.

```json title="transfer.inflow.completed"
{
  "event_id": "7d1e3f5a-9b2c-4d6e-8f0a-1b3c5d7e9f20",
  "event_type": "transfer.inflow.completed",
  "event_category": "transfer",
  "event_group_id": "4a6c8e0b-2d4f-4b6a-8c0e-3f5b7d9a1c2e",
  "tenant_id": "5d0c9b8a-7f6e-4d5c-8b4a-3f2e1d0c9b8a",
  "timestamp": "2026-10-14T10:00:00Z",
  "event_data": {
    "transaction_id": "4a6c8e0b-2d4f-4b6a-8c0e-3f5b7d9a1c2e",
    "status": "completed",
    "amount": "3200.00",
    "currency": "USD",
    "account_id": "9c1e3a5b-7d9f-4b2e-8a4c-6e8a0c2e4b6d",
    "sender_name": "Front Range Catering",
    "sender_account_number": "000123456789",
    "sender_bank": "Example Community Bank",
    "narration": "Invoice 2041"
  }
}
```

`amount` is a decimal string in the account's currency. Gravv does not take its deposit fee out of it.

## Rules

- Deduplicate on the body's `event_id`. Two services send events for a wallet-backed deposit, and retries repeat events.
- A wallet-backed account books only USDC on its `blockchain_network`. Gravv does not credit another token, or a token on another network, sent to `wallet_address`. If this happens, contact support.
- For a wallet-backed account, the bank deposit finishes only when the matching USDC reaches the wallet. If nothing arrives after the rail's normal time, give support the account id, amount and date.
- Gravv never takes its deposit fee for a rail out of the deposit. Gravv takes the fee from your business's main account or puts it on your monthly invoice. The fee has its own `fee_charge` row. See [See a deposit arrive](/recipes/transactions/see-a-deposit-arrive#4-find-the-fee). If the amount is lower than what the payer sent, the difference comes from the sending side, such as a bank's charges on the way.
- Read balances as described on [List and read accounts](/platform/accounts/list-and-read-accounts#balances).

To produce these webhooks without a real transfer, see [Test accounts in sandbox](/platform/accounts/test-accounts-in-sandbox).
