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

# Refunding Transactions

> Learn how to manage refunds in your Blnk Ledger

export const CtaCallout = props => {
  const {title, buttonLabel, href, trackingEvent, buttonTarget, rel = "noopener noreferrer", children} = props;
  const handleCtaClick = () => {
    if (typeof window === "undefined" || !trackingEvent) {
      return;
    }
    try {
      window.dispatchEvent(new CustomEvent("blnk:docs-cta", {
        detail: {
          name: trackingEvent,
          href
        }
      }));
    } catch {}
    try {
      window.posthog?.capture?.(trackingEvent, {
        href
      });
    } catch {}
    const gaPayload = {
      cta_href: href
    };
    try {
      window.gtag?.("event", trackingEvent, gaPayload);
    } catch {}
    try {
      window.dataLayer = window.dataLayer || [];
      window.dataLayer.push({
        event: trackingEvent,
        ...gaPayload
      });
    } catch {}
  };
  const isExternal = typeof href === "string" && (/^https?:\/\//i).test(href);
  const target = buttonTarget ?? (isExternal ? "_blank" : undefined);
  const linkRel = isExternal ? rel : undefined;
  return <section className="cta-callout not-prose relative my-8 w-full min-w-0 overflow-hidden rounded-xl border border-zinc-200 p-5 dark:border-white/10">
      <div className="cta-callout-noise" aria-hidden="true" />
      <div className="cta-callout-layout">
        {title ? <div className="cta-callout-title-row">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28" width="14" height="14" className="cta-callout-icon shrink-0 text-zinc-800 dark:text-zinc-200" aria-hidden="true">
              <g fill="none" fillRule="nonzero">
                <path d="M28 0v28H0V0h28ZM14.691833333333335 27.134333333333334l-0.012833333333333334 0.0023333333333333335 -0.08283333333333333 0.04083333333333334 -0.023333333333333334 0.004666666666666667 -0.016333333333333335 -0.004666666666666667 -0.08283333333333333 -0.04083333333333334c-0.011666666666666667 -0.004666666666666667 -0.022166666666666668 -0.0011666666666666668 -0.028000000000000004 0.005833333333333334l-0.004666666666666667 0.011666666666666667 -0.019833333333333335 0.49933333333333335 0.005833333333333334 0.023333333333333334 0.011666666666666667 0.015166666666666667 0.12133333333333333 0.08633333333333333 0.0175 0.004666666666666667 0.014000000000000002 -0.004666666666666667 0.12133333333333333 -0.08633333333333333 0.014000000000000002 -0.018666666666666668 0.004666666666666667 -0.019833333333333335 -0.019833333333333335 -0.4981666666666667c-0.0023333333333333335 -0.011666666666666667 -0.0105 -0.019833333333333335 -0.019833333333333335 -0.021Zm0.3091666666666667 -0.13183333333333336 -0.015166666666666667 0.0023333333333333335 -0.21583333333333335 0.1085 -0.011666666666666667 0.011666666666666667 -0.0035000000000000005 0.012833333333333334 0.021 0.5016666666666667 0.005833333333333334 0.014000000000000002 0.009333333333333334 0.008166666666666668 0.23450000000000004 0.1085c0.014000000000000002 0.004666666666666667 0.026833333333333334 0 0.03383333333333334 -0.009333333333333334l0.004666666666666667 -0.016333333333333335 -0.03966666666666667 -0.7163333333333334c-0.0035000000000000005 -0.014000000000000002 -0.011666666666666667 -0.023333333333333334 -0.023333333333333334 -0.025666666666666667Zm-0.8341666666666667 0.0023333333333333335a0.026833333333333334 0.026833333333334334 0 0 0 -0.0315 0.007000000000000001l-0.007000000000000001 0.016333333333333335 -0.03966666666666667 0.7163333333333334c0 0.014000000000000002 0.008166666666666668 0.023333333333333334 0.019833333333333335 0.028000000000000004l0.0175 -0.0023333333333333335 0.23450000000000004 -0.1085 0.011666666666666667 -0.009333333333333334 0.004666666666666667 -0.012833333333333334 0.019833333333333335 -0.5016666666666667 -0.0035000000000000005 -0.014000000000000002 -0.011666666666666667 -0.011666666666666667 -0.21466666666666667 -0.10733333333333334Z" strokeWidth="1.1667" />
                <path fill="currentColor" d="M14 2.916666666666667A1.75 1.75 0 0 1 15.750000000000002 4.666666666666667v6.302333333333334L21.207666666666668 7.816666666666667a1.75 1.75 0 0 1 1.75 3.031L17.5 14l5.457666666666667 3.151166666666667a1.75 1.75 0 0 1 -1.75 3.031l-5.457666666666667 -3.1500000000000004V23.333333333333336a1.75 1.75 0 0 1 -3.5 0v-6.302333333333334L6.792333333333334 20.183333333333337a1.75 1.75 0 1 1 -1.75 -3.031L10.5 14 5.042333333333334 10.848833333333333a1.75 1.75 0 0 1 1.75 -3.031l5.457666666666667 3.1500000000000004V4.666666666666667A1.75 1.75 0 0 1 14 2.916666666666667Z" strokeWidth="1.1667" />
              </g>
            </svg>
            <p className="cta-callout-title min-w-0 font-semibold text-zinc-800 dark:text-zinc-200">
              {title}
            </p>
          </div> : null}
        <div className={`cta-callout-body text-sm leading-normal text-zinc-800 dark:text-zinc-200${title ? " cta-callout-body--indented" : ""}`}>
          {children}
        </div>
        <a href={href} target={target} rel={linkRel} onClick={handleCtaClick} data-docs-cta={trackingEvent || undefined} className="cta-callout-button inline-flex items-center justify-center gap-1 rounded-full bg-white px-3 py-1.5 text-sm font-semibold transition hover:bg-zinc-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/50 dark:bg-white dark:hover:bg-zinc-200">
          {buttonLabel}
          <span className="cta-callout-button-arrow" aria-hidden="true">
            →
          </span>
        </a>
      </div>
    </section>;
};

In general, when you refund a transaction, Blnk reverses the money movement from the original - funds return from the destination balance to the source balance.

Blnk records the reversal as a new transaction; the original record is not modified. You can refund each original transaction only once. A second attempt is rejected.

***

## Which transactions can be refunded

Not every transaction can be refunded. Refund eligibility depends on the transaction’s status and the type of transaction you want to refund.

For inflight or split transactions, the ID you pass matters. Use the table below to understand which transaction ID to send and what Blnk does with it.

| Transaction ID          | Refundable? | Notes                                                                                                                          |
| :---------------------- | :---------- | :----------------------------------------------------------------------------------------------------------------------------- |
| `APPLIED`               | Yes         | The source and destination balances are reversed.                                                                              |
| `INFLIGHT`              | Yes         | Only if the inflight transaction has been committed or voided.                                                                 |
| `QUEUED`                | Yes         | Refunds all child `APPLIED` transactions linked to the queued parent. Use the `meta_data.QUEUED_PARENT_TRANSACTION` to refund. |
| `VOID`                  | No          | To refund a voided transaction, use its parent inflight transaction ID instead.                                                |
| `SCHEDULED`, `REJECTED` | No          | Not refundable.                                                                                                                |

***

## Applying refunds

<Steps>
  <Step title="Request a refund">
    Use the [Refund transaction API](/reference/refund-transaction) and pass the `transaction_id` of the transaction you want to refund.

    <Tabs>
      <Tab title="Using the queue">
        By default, refunds are queued with `skip_queue: false`.

        The initial response returns `status: "QUEUED"` and sets the refund `reference` to `{original_txn_id}_refund`.

        When the queue processes the refund, Blnk creates the final applied transaction with the reference `{original_txn_id}_refund_q`, following the same `_q` convention used for other queued transactions.

        <CodeGroup>
          ```bash cURL wrap theme={"system"}
          curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{transaction_id}" \
            -H "X-blnk-key: <api-key>"
          ```

          ```typescript TypeScript wrap theme={"system"}
          const response = await blnk.Transactions.refund(
            '{transaction_id}',
          );
          ```

          ```go Go wrap theme={"system"}
          txn, resp, err := client.Transaction.Refund("{transaction_id}")
          ```
        </CodeGroup>

        ```json 201 Created (queued) {13} wrap expandable theme={"system"}
        {
          "amount": 50,
          "amount_string": "50",
          "precision": 100,
          "precise_amount": 5000,
          "transaction_id": "txn_af70986c-fbdc-450a-bf81-c1af034ce840",
          "parent_transaction": "txn_b0468e80-5941-4ca8-b5d2-e44f4572926e",
          "source": "bln_f76360da-68db-410d-8a8b-1d960e2a766f",
          "destination": "bln_b1bd741e-eeb6-4dd4-a562-df35374bbaf9",
          "reference": "txn_b0468e80-5941-4ca8-b5d2-e44f4572926e_refund",
          "currency": "USD",
          "description": "Card payment on Stripe",
          "status": "QUEUED",
          "allow_overdraft": false,
          "inflight": false,
          "created_at": "2024-11-26T09:33:35.265582042Z"
        }
        ```
      </Tab>

      <Tab title="Skipped queue">
        To apply the refund immediately, set `skip_queue: true` in the request body.

        <CodeGroup>
          ```bash cURL wrap theme={"system"}
          curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{transaction_id}" \
            -H "X-blnk-key: <api-key>" \
            -H "Content-Type: application/json" \
            -d '{
              "skip_queue": true
            }'
          ```

          ```typescript TypeScript wrap theme={"system"}
          const response = await blnk.Transactions.refund(
            '{transaction_id}',
            { skip_queue: true },
          );
          ```
        </CodeGroup>

        ```json 201 Created (synchronous) {13} wrap expandable theme={"system"}
        {
          "amount": 50,
          "amount_string": "50",
          "precision": 100,
          "precise_amount": 5000,
          "transaction_id": "txn_4c8be5c7-7c40-493f-b4a1-c09fcf8e7e7b",
          "parent_transaction": "txn_b0468e80-5941-4ca8-b5d2-e44f4572926e",
          "source": "bln_f76360da-68db-410d-8a8b-1d960e2a766f",
          "destination": "bln_b1bd741e-eeb6-4dd4-a562-df35374bbaf9",
          "reference": "txn_b0468e80-5941-4ca8-b5d2-e44f4572926e_refund",
          "currency": "USD",
          "description": "Card payment on Stripe",
          "status": "APPLIED",
          "allow_overdraft": false,
          "inflight": false,
          "created_at": "2024-11-26T09:33:35.265582042Z"
        }
        ```
      </Tab>
    </Tabs>
  </Step>
</Steps>

***

## Refunding inflight transactions

Only [inflight](/transactions/inflight/creating-inflight) transactions that have been committed or voided can be refunded. Active inflight holds cannot be refunded.

Always pass the original `INFLIGHT` transaction ID to the API, not the ID of its `APPLIED` or `VOID` child.

<Tabs>
  <Tab title="Committed inflight">
    Pass the inflight transaction ID.

    Blnk reverses the committed amount the same way it refunds a standard `APPLIED` transaction.

    <CodeGroup>
      ```bash cURL wrap theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{inflight_transaction_id}" \
        -H "X-blnk-key: <api-key>"
      ```

      ```typescript TypeScript wrap theme={"system"}
      const response = await blnk.Transactions.refund(
        '{inflight_transaction_id}',
      );
      ```

      ```go Go wrap theme={"system"}
      txn, resp, err := client.Transaction.Refund("{inflight_transaction_id}")
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Voided inflight">
    Pass the inflight transaction ID. Do not pass the `VOID` child transaction ID.

    Blnk restores the voided amount as a reverse-direction `INFLIGHT` hold instead of applying it immediately.

    <Warning>
      Using the `VOID` child ID to refund will result in a `404 TXN_NOT_FOUND` error. This is because the `VOID` child is not considered a valid transaction to refund.
    </Warning>

    <CodeGroup>
      ```bash cURL wrap theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{inflight_transaction_id}" \
        -H "X-blnk-key: <api-key>"
      ```

      ```typescript TypeScript wrap theme={"system"}
      const response = await blnk.Transactions.refund(
        '{inflight_transaction_id}',
      );
      ```

      ```go Go wrap theme={"system"}
      txn, resp, err := client.Transaction.Refund("{inflight_transaction_id}")
      ```
    </CodeGroup>
  </Tab>
</Tabs>

***

## Refunding split transactions

Use this flow when the original payment was a [multiple sources](/transactions/multiple-sources) or [multiple destinations](/transactions/multiple-destinations) split.

<Steps>
  <Step title="Confirm the original used the queue">
    Refunding the entire split in one call only works when the original transaction request uses the queue (`skip_queue: false`).

    When you submit the split, Blnk returns a queued parent response. Each child leg is recorded separately and linked through `meta_data.QUEUED_PARENT_TRANSACTION`:

    ```json Split response {33} wrap expandable theme={"system"}
    {
      "precise_amount": 3000000,
      "amount": 30000,
      "amount_string": "30000",
      "precision": 100,
      "transaction_id": "txn_0b59f6e-6c4a-4efa-915c-526f77ef61ab",
      "parent_transaction": "",
      "source": "bln_92e4b9b6-0b85-4ef4-87a2-682c31500d38",
      "reference": "ref_001adcfgf",
      "currency": "USD",
      "description": "Payment from Sarah",
      "status": "QUEUED",
      "skip_queue": false,
      "destinations": [
        {
          "identifier": "bln_f2073f6b-905a-4e3e-b5a2-8d1b3dc2fb7f",
          "distribution": "20%",
          "transaction_id": "txn_59347177-aa7e-d8ad-9f4f-d09628b32ec3"
        },
        {
          "identifier": "bln_64c50fb5-32d5-4f78-9f4a-e8b01aaf025d",
          "distribution": "10000",
          "transaction_id": "txn_7ddc8d4f-3b77-4b7d-a37f-240216ab074c"
        },
        {
          "identifier": "bln_7d98dfe9-5c3e-4c9b-b96a-65f6d9f7b89b",
          "distribution": "left",
          "transaction_id": "txn_5aad04dd-ed53-4f77-9f01-4916d31fac5f"
        }
      ],
      "created_at": "2025-09-18T01:26:30.648049042Z",
      "meta_data": {
        "QUEUED_PARENT_TRANSACTION": "txn_0b59f6e-6c4a-4efa-915c-526f77ef61ab"
      }
    }
    ```
  </Step>

  <Step title="Refund using the queued parent ID">
    Use the value in `meta_data.QUEUED_PARENT_TRANSACTION` as the ID to refund.

    Keep `skip_queue: false` so all legs refund together.

    <CodeGroup>
      ```bash cURL wrap theme={"system"}
      curl -X POST "http://YOUR_BLNK_INSTANCE_URL/refund-transaction/{queued_parent_transaction_id}" \
        -H "X-blnk-key: <api-key>" \
        -H "Content-Type: application/json" \
        -d '{"skip_queue": false}'
      ```

      ```typescript TypeScript wrap theme={"system"}
      const response = await blnk.Transactions.refund(
        '{queued_parent_transaction_id}',
        { skip_queue: false },
      );
      ```

      ```go Go wrap theme={"system"}
      txn, resp, err := client.Transaction.Refund("{queued_parent_transaction_id}")
      ```
    </CodeGroup>

    Blnk refunds every `APPLIED` child from its destination back to its source. The response matches the shape in [Applying refunds](#applying-refunds).
  </Step>
</Steps>

***

## Related docs

<CardGroup cols={2}>
  <Card title="Parent transactions" icon="git-fork" href="/transactions/parent-transactions">
    Lineage and parent-child links.
  </Card>

  <Card title="Create inflight" icon="plane" href="/transactions/inflight/creating-inflight">
    Hold, commit, and void flows.
  </Card>

  <Card title="Refund transaction API" icon="code" href="/reference/refund-transaction">
    Endpoint parameters and responses.
  </Card>
</CardGroup>

***

## Need help?

We are very happy to help you make the most of Blnk, regardless of whether it is your first time or you are switching from another tool.

To ask questions or discuss issues, please [contact us](mailto:support@blnkfinance.com) or [join our Discord community](https://discord.gg/7WNv94zPpx).

<CtaCallout title="Connect your ledger to Blnk Cloud" href="https://cloud.blnkfinance.com/auth/sign-up?utm_source=blnk_docs&utm_medium=documentation&utm_campaign=need-help" buttonLabel="Open Blnk Cloud" trackingEvent="clicked_cloud_signup">
  Sign up and manage your ledger with our back-office dashboard. You can invite teammates to collaborate and manage your ledger operations directly from the dashboard.
</CtaCallout>
