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

# Transaction Lifecycle

> Learn how transactions move through different states in Blnk.

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

Every transaction goes through multiple states in Blnk, and each state change is stored as a separate record in the database. This gives you complete traceability, allowing you to see the lifecycle of a transaction from initiation to completion.

Each state is connected to the previous state through a `parent_transaction` attribute. Here's how it works:

<Frame caption="Transaction lifecycle flow showing how transactions progress from QUEUED to final states">
  <img src="https://mintcdn.com/blnk/dat3WexQx5twNo5Q/images/blnk-transaction-lifecycle.png?fit=max&auto=format&n=dat3WexQx5twNo5Q&q=85&s=f298c8cad6b2c0669956851336d540f5" alt="Transaction lifecycle diagram showing how transactions move through different states in Blnks" width="1193" height="1263" data-path="images/blnk-transaction-lifecycle.png" />
</Frame>

***

## Statuses

Blnk transactions can have one of five possible statuses throughout their lifecycle. Each status represents a specific state in the transaction processing flow:

| Status     | Description                                                            | When it occurs                                                                       |
| :--------- | :--------------------------------------------------------------------- | :----------------------------------------------------------------------------------- |
| `QUEUED`   | Transaction is received and waiting to be processed                    | Initial state when a transaction is first created                                    |
| `APPLIED`  | Transaction has been successfully processed and applied to balances    | When transaction completes successfully or when an inflight transaction is committed |
| `INFLIGHT` | Transaction is on hold, waiting for further action                     | When a transaction is created with `"inflight": true`                                |
| `VOID`     | Inflight transaction was cancelled and balances reset                  | When an inflight transaction is voided                                               |
| `REJECTED` | Transaction was not processed due to errors (e.g., insufficient funds) | When transaction fails validation or processing                                      |

<Warning>
  All transactions in Blnk are immutable. Once a transaction has been applied, committed, or voided, you cannot roll back the status to its previous state.
</Warning>

***

## Transaction lifecycle

By default, every transaction begins in a `QUEUED` state.

<Tip>You can track balances with transactions still in queue using [Queued Balances](/balances/introduction#queued-balances).</Tip>

Blnk then processes it and moves it to one of three possible states:

* `INFLIGHT`: If the transaction request includes `"inflight": "true"`. It continues to:
  * `APPLIED`: If the inflight transaction is committed or;
  * `VOID`: If the inflight transaction is voided.
* `APPLIED`: When the transaction is completed and applied to the balances.
* `REJECTED`: When the transaction is not processed due to reasons like insufficient funds, etc.

Here's an example response when you record a new transaction on Blnk:

```json Example response {13} expandable theme={"system"}
{
  "precise_amount": 10000000,
  "amount": 100000,
  "rate": 0,
  "precision": 100,
  "transaction_id": "txn_d4951810-706c-44d1-be45-6f254be0e167",
  "parent_transaction": "",
  "source": "bln_7769aedf-bc88-49f7-bbb2-118f121daee6",
  "destination": "bln_c42e4bbd-4ea9-494a-89be-7634b0c1e41a",
  "reference": "ref_e55c4f33-bff7-4c30-9b9f-5d2d10a29b7a",
  "currency": "USD",
  "description": "Sample transaction",
  "status": "QUEUED",
  "hash": "3ef19e9cd9aba07d33068d096da1e1596f1270a70c9aa2d160206b4d6da553dc",
  "allow_overdraft": true,
  "inflight": false,
  "created_at": "2025-02-02T02:35:16.606614793Z",
  "scheduled_for": "0001-01-01T00:00:00Z",
  "inflight_expiry_date": "0001-01-01T00:00:00Z",
  "inflight_commit_date": "0001-01-01T00:00:00Z"
}
```

***

## Parent transactions

Because transactions in Blnk are immutable, each new state or related record is linked back to the one that created it through the `parent_transaction` field.

<Tip> For example, if you have a \$100 inflight transaction that is later committed, the commit record points to the inflight record as its parent. </Tip>

This structure ensures that every transaction has a clear lineage. By following the `parent_transaction` chain, you can always trace a transaction back to its origin, see how it evolved, and connect it to any related siblings.

* Queued transactions act as the parent of the next state (e.g. `APPLIED`, `INFLIGHT`, `REJECTED`).
* Inflight transactions are the parent of their final outcome (e.g. `APPLIED`, `VOID`).
* Split transactions are the parent of the resulting individual transactions.
* Bulk transactions are the parent of the included individual transactions.
* Scheduled transactions are the parent of the executed state (e.g. `APPLIED`, `REJECTED`).
* Refunds use the original transaction as their parent.

<Card title="Parent transactions" icon="list-minus" href="/transactions/parent-transactions">
  Linked states and traceability across updates.
</Card>

***

## Skip transaction queue

<Info>Available in version 0.8.2 and later.</Info>

The `skip_queue` feature allows you to bypass the default transaction queuing system and immediately process transactions directly. This is useful for scenarios where you need real-time transaction processing while still maintaining data consistency.

To enable this feature, include "skip\_queue": true in the request body when calling the [Create Transaction](/reference/create-transaction.mdx) endpoint:

```json {6} theme={"system"}
{
  "amount": 102.12,
  "precision": 100,
  ...
  "allow_overdraft": true,
  "skip_queue": true
}
```

### How it works

When you enable `skip_queue`, the transaction:

* Bypasses the normal queuing process
* Executes immediately on the balance
* Uses distributed locks via Redis to maintain consistency
* Applies optimistic locking at the database level

### Example applications

Use `skip_queue` when:

* Processing low-volume transactions with minimal balance contention;
* You need synchronous confirmation of transaction completion;
* Time-sensitive financial operations.

<Tip>For high traffic, use the default queue (`skip_queue: false`). Learn more: [Handling Hot Balances](/guides/hot-balances#using-the-queue).</Tip>

<CardGroup>
  <Card title="Transaction statuses" icon="tag" href="/transactions/transaction-lifecycle#statuses">
    QUEUED, APPLIED, INFLIGHT, and more.
  </Card>

  <Card title="Inflight transactions" icon="plane" href="/transactions/inflight/creating-inflight">
    Hold funds until conditions are met.
  </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>
