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

# Per-Payment Funding (push)

> Fund one liability through destination-specific Payment Instrument instructions.

export const FlowOfFundsStyles = () => {
  const flowOfFundsStyles = `
/* Flow of funds diagram. */
.fof-diagram.fof-diagram {
    --fof-ink: #000827;
    --fof-muted: rgba(0, 8, 39, 0.64);
    --fof-subtle: rgba(0, 8, 39, 0.5);
    --fof-line: rgba(0, 8, 39, 0.12);
    --fof-line-strong: rgba(0, 8, 39, 0.34);
    --fof-surface: #F2F8F9;
    --fof-node: #FFFFFF;
    --fof-opal: #00FFD1;
    --fof-mono: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
    box-sizing: border-box;
    width: 100%;
    margin: 1rem 0 1.5rem;
    color: var(--fof-ink);
    container: flow-of-funds / inline-size;
}

.fof-diagram.fof-diagram,
.fof-diagram.fof-diagram section,
.fof-diagram.fof-diagram header,
.fof-diagram.fof-diagram div,
.fof-diagram.fof-diagram span,
.fof-diagram.fof-diagram strong,
.fof-diagram.fof-diagram small,
.fof-diagram.fof-diagram h3,
.fof-diagram.fof-diagram p,
.fof-diagram.fof-diagram b,
.fof-diagram.fof-diagram em {
    box-sizing: border-box;
}

.fof-diagram-caption {
    display: flex;
    padding: 0 0 0.875rem;
}

.fof-diagram-caption > span:first-child {
    display: flex;
    min-width: 0;
    flex-direction: column;
    gap: 0.25rem;
}

.fof-diagram.fof-diagram .fof-diagram-caption strong {
    color: var(--fof-ink) !important;
    font-size: 1.25rem;
    font-weight: 600;
    line-height: 1.3;
}

.fof-diagram.fof-diagram .fof-diagram-caption small {
    color: var(--fof-muted) !important;
    font-size: 0.8125rem;
    line-height: 1.4;
}

.fof-diagram-columns {
    padding: 0 0.875rem 0.625rem;
}

.fof-diagram.fof-diagram .fof-diagram-columns div span {
    color: var(--fof-subtle) !important;
    font: 500 0.6rem/1.2 var(--fof-mono);
    letter-spacing: 0.04em;
    text-transform: uppercase;
}

.fof-diagram-columns > div {
    display: grid;
    text-align: center;
    grid-template-columns: minmax(7rem, 1fr) minmax(4.25rem, 0.68fr) minmax(7rem, 1fr) minmax(4.25rem, 0.68fr) minmax(7rem, 1fr);
}

.fof-diagram-columns > div span:nth-child(1) {
    grid-column: 1;
}

.fof-diagram-columns > div span:nth-child(2) {
    grid-column: 3;
}

.fof-diagram-columns > div span:nth-child(3) {
    grid-column: 5;
}

.fof-diagram-rows {
    overflow: hidden;
    border: 1px solid var(--fof-line);
    border-radius: 0.75rem;
    background: var(--fof-surface);
}

.fof-diagram-row {
    min-height: 12.9375rem;
    padding: 1.125rem 0.875rem;
    border-top: 1px solid var(--fof-line);
}

.fof-diagram-row:first-child {
    border-top: 0;
}

.fof-model-label {
    display: flex;
    min-width: 0;
    align-items: baseline;
    justify-content: space-between;
    gap: 1rem;
}

.fof-diagram.fof-diagram .fof-model-label h3 {
    margin: 0;
    color: var(--fof-ink) !important;
    font-size: 0.875rem;
    font-weight: 600;
    letter-spacing: -0.01em;
    line-height: 1.2;
}

.fof-diagram.fof-diagram .fof-model-label p {
    margin: 0;
    color: var(--fof-muted) !important;
    font-size: 0.6875rem;
    line-height: 1.35;
    text-align: right;
}

.fof-money-path {
    display: grid;
    min-width: 0;
    align-items: center;
    margin-top: 1rem;
    grid-template-columns: minmax(7rem, 1fr) minmax(4.25rem, 0.68fr) minmax(7rem, 1fr) minmax(4.25rem, 0.68fr) minmax(7rem, 1fr);
}

.fof-money-path-item {
    display: contents;
}

.fof-money-node {
    display: flex;
    min-width: 0;
    min-height: 8rem;
    align-items: flex-start;
    flex-direction: column;
    padding: 0.75rem;
    border: 1px solid var(--fof-line-strong);
    border-radius: 0.55rem;
    background: var(--fof-node);
    box-shadow: 0 0.125rem 0.5rem rgba(0, 8, 39, 0.05);
}

.fof-money-node.is-accent {
    border-color: var(--fof-ink);
    box-shadow: inset 0 0.2rem 0 var(--fof-opal), 0 0.125rem 0.5rem rgba(0, 8, 39, 0.07);
}

.fof-money-icon {
    display: inline-flex;
    width: 2rem;
    height: 2rem;
    align-items: center;
    justify-content: center;
    margin-bottom: 0.75rem;
    border: 1px solid var(--fof-line);
    border-radius: 50%;
    background: var(--fof-surface);
}

.fof-money-node.is-accent .fof-money-icon {
    border-color: var(--fof-ink);
    background: var(--fof-opal);
    color: #000827 !important;
}

.fof-money-icon svg {
    width: 1rem;
    height: 1rem;
    fill: none;
    stroke: currentColor;
    stroke-linecap: round;
    stroke-linejoin: round;
    stroke-width: 1.5;
}

.fof-money-node > span:last-child {
    display: flex;
    min-width: 0;
    flex-direction: column;
    gap: 0.15rem;
    margin-top: 0;
}

.fof-diagram.fof-diagram .fof-money-node small {
    color: var(--fof-subtle) !important;
    font: 500 0.525rem/1 var(--fof-mono);
    letter-spacing: 0.04em;
    text-transform: uppercase;
}

.fof-diagram.fof-diagram .fof-money-node strong {
    color: var(--fof-ink) !important;
    font-size: 0.75rem;
    font-weight: 600;
    line-height: 1.2;
}

.fof-diagram.fof-diagram .fof-money-node em {
    color: var(--fof-muted) !important;
    font-size: 0.625rem;
    font-style: normal;
    line-height: 1.3;
}

.fof-diagram.fof-diagram .fof-money-requirement {
    display: inline-flex;
    width: fit-content;
    margin-top: auto;
    padding: 0.3rem 0.4rem;
    border: 1px solid var(--fof-line);
    border-radius: 0.3rem;
    background: var(--fof-surface);
    color: var(--fof-ink) !important;
    font: 600 0.525rem/1.2 var(--fof-mono);
}

.fof-money-connector {
    display: flex;
    min-width: 0;
    align-items: center;
    flex-direction: column;
    justify-content: center;
    padding: 0.5rem 0.35rem;
    text-align: center;
}

.fof-diagram.fof-diagram .fof-money-connector small {
    color: var(--fof-subtle) !important;
    font: 500 0.5rem/1 var(--fof-mono);
    letter-spacing: 0.06em;
    text-transform: uppercase;
}

.fof-diagram.fof-diagram .fof-money-connector strong {
    margin-top: 0.3rem;
    color: var(--fof-ink) !important;
    font: 600 0.5625rem/1.3 var(--fof-mono);
}

.fof-money-connector i {
    position: relative;
    display: block;
    width: calc(100% + 0.5rem);
    height: 0.65rem;
    margin: 0.4rem 0;
}

.fof-money-connector i::before {
    position: absolute;
    top: 0.25rem;
    right: 0.1rem;
    left: 0;
    height: 0.125rem;
    border-radius: 0.1rem;
    background: var(--fof-opal);
    content: "";
}

.fof-money-connector i::after {
    position: absolute;
    top: 0.05rem;
    right: 0;
    width: 0.45rem;
    height: 0.45rem;
    border-top: 0.125rem solid var(--fof-opal);
    border-right: 0.125rem solid var(--fof-opal);
    content: "";
    transform: rotate(45deg);
}

.fof-diagram.fof-diagram .fof-money-connector > span {
    color: var(--fof-muted) !important;
    font-size: 0.55rem;
    line-height: 1.2;
}

.fof-support-account {
    display: flex;
    width: fit-content;
    max-width: 100%;
    align-items: center;
    gap: 0.5rem;
    margin: 0.875rem auto 0;
    padding: 0.5rem 0.625rem;
    border: 1px dashed var(--fof-line-strong);
    border-radius: 0.4rem;
    background: var(--fof-node);
}

.fof-diagram.fof-diagram .fof-support-account small {
    color: var(--fof-subtle) !important;
    font: 500 0.525rem/1 var(--fof-mono);
    letter-spacing: 0.04em;
    text-transform: uppercase;
}

.fof-diagram.fof-diagram .fof-support-account strong {
    color: var(--fof-ink) !important;
    font-size: 0.625rem;
    font-weight: 600;
    line-height: 1.2;
}

.fof-diagram.fof-diagram .fof-support-account span {
    color: var(--fof-muted) !important;
    font-size: 0.575rem;
    line-height: 1.2;
}

html:is(.dark) .fof-diagram.fof-diagram {
    --fof-ink: #FFFFFF;
    --fof-muted: rgba(255, 255, 255, 0.68);
    --fof-subtle: rgba(255, 255, 255, 0.5);
    --fof-line: rgba(255, 255, 255, 0.1);
    --fof-line-strong: rgba(255, 255, 255, 0.28);
    --fof-surface: #07142F;
    --fof-node: #000827;
}

@container flow-of-funds (max-width: 32rem) {
    .fof-diagram-columns {
        display: none;
    }

    .fof-diagram-row {
        min-height: 0;
        padding: 1.25rem;
    }

    .fof-model-label {
        align-items: flex-start;
        flex-direction: column;
        gap: 0.25rem;
    }

    .fof-diagram.fof-diagram .fof-model-label h3 {
        margin-top: 0;
    }

    .fof-diagram.fof-diagram .fof-model-label p {
        text-align: left;
    }

    .fof-money-path {
        grid-template-columns: 1fr;
    }

    .fof-money-node {
        min-height: 4.5rem;
        align-items: center;
        flex-direction: row;
        gap: 0.75rem;
    }

    .fof-money-icon {
        flex: 0 0 auto;
        margin: 0;
    }

    .fof-money-node > span:last-child {
        margin-top: 0;
    }

    .fof-money-connector {
        min-height: 4.25rem;
        padding: 0.35rem;
    }

    .fof-diagram.fof-diagram .fof-money-connector strong {
        min-height: 0;
    }

    .fof-money-connector i {
        width: 0.75rem;
        height: 1.45rem;
        margin: 0.25rem 0;
    }

    .fof-money-connector i::before {
        top: 0;
        right: auto;
        bottom: 0.15rem;
        left: 0.3rem;
        width: 0.125rem;
        height: auto;
    }

    .fof-money-connector i::after {
        top: auto;
        right: 0.1rem;
        bottom: 0.1rem;
        transform: rotate(135deg);
    }

    .fof-support-account {
        width: 100%;
        align-items: flex-start;
        flex-direction: column;
        gap: 0.2rem;
    }

}

@container flow-of-funds (max-width: 28rem) {
    .fof-diagram-row {
        padding: 1rem;
    }
}

@media (prefers-reduced-motion: reduce) {
    .fof-diagram *,
    .fof-diagram *::before,
    .fof-diagram *::after {
        scroll-behavior: auto !important;
        transition-duration: 0.001ms !important;
    }
}
`;
  return <style>{flowOfFundsStyles}</style>;
};

export const FlowOfFunds = ({model = "fbo-push"}) => {
  const models = [{
    key: "fbo-push",
    title: "FBO funding (push)",
    starts: "Payment creation cutoff: ACH 1:30 PM CT; wire 3:30 PM CT",
    nodes: [{
      icon: "bank",
      role: "Funding source",
      label: "Disbursement Account",
      detail: "You send funds"
    }, {
      icon: "vault",
      role: "Method-managed",
      label: "Shared FBO Account",
      detail: "Funds a group of Payments",
      requirement: "Prefunding may apply",
      accent: true
    }, {
      icon: "liability",
      role: "Destination",
      label: "Liability",
      detail: "Eligible destination Account"
    }],
    connectors: [{
      phase: "Fund",
      label: "ACH or wire",
      detail: "You initiate"
    }, {
      phase: "Disburse",
      label: "Payment",
      detail: "Method sends"
    }]
  }, {
    key: "fbo-pull",
    title: "FBO funding (pull)",
    starts: "Payment creation cutoff: 1:30 PM CT",
    nodes: [{
      icon: "bank",
      role: "Funding source",
      label: "Disbursement Account",
      detail: "Method pulls funds"
    }, {
      icon: "vault",
      role: "Method-managed",
      label: "Shared FBO Account",
      detail: "Funds a group of Payments",
      accent: true
    }, {
      icon: "liability",
      role: "Destination",
      label: "Liability",
      detail: "Eligible destination Account"
    }],
    connectors: [{
      phase: "Fund",
      label: "ACH debit",
      detail: "Method initiates"
    }, {
      phase: "Disburse",
      label: "Payment",
      detail: "Method sends"
    }],
    support: {
      label: "Separate reserve Account",
      detail: "May be required outside the payment path"
    }
  }, {
    key: "per-payment-funding",
    title: "Per-Payment funding (push)",
    starts: "Inbound funds cutoff: ACH 1:30 PM CT; wire 3:30 PM CT",
    nodes: [{
      icon: "bank",
      role: "Funding source",
      label: "Disbursement Account",
      detail: "You send the exact amount"
    }, {
      icon: "routing",
      role: "Method-managed FBO",
      label: "Payment Instrument",
      detail: "Instructions for one liability",
      requirement: "No reserve needed",
      accent: true
    }, {
      icon: "liability",
      role: "Destination",
      label: "Liability",
      detail: "Mapped destination Account"
    }],
    connectors: [{
      phase: "Fund",
      label: "Exact amount",
      detail: "ACH or wire"
    }, {
      phase: "Create and route",
      label: "Payment",
      detail: "Method handles routing"
    }]
  }];
  const renderIcon = name => {
    if (name === "bank") {
      return <svg viewBox="0 0 24 24" aria-hidden="true">
          <path d="M3 9h18M5 9v10M9 9v10m6-10v10m4-10v10M3 19h18M12 3l9 4H3l9-4Z" />
        </svg>;
    }
    if (name === "liability") {
      return <svg viewBox="0 0 24 24" aria-hidden="true">
          <rect x="3" y="5" width="18" height="14" rx="2" />
          <path d="M3 10h18M7 15h4" />
        </svg>;
    }
    if (name === "vault") {
      return <svg viewBox="0 0 24 24" aria-hidden="true">
          <rect x="3" y="4" width="18" height="16" rx="2" />
          <circle cx="12" cy="12" r="3" />
          <path d="M12 9V7m3 5h2m-5 3v2m-3-5H7" />
        </svg>;
    }
    if (name === "routing") {
      return <svg viewBox="0 0 24 24" aria-hidden="true">
          <rect x="3" y="4" width="18" height="16" rx="2" />
          <path d="M7 9h10M7 13h4M7 17h7" />
        </svg>;
    }
    return null;
  };
  const selected = models.find(item => item.key === model) || models[0];
  const titleId = `fof-diagram-title-${selected.key}`;
  const descriptionId = `fof-diagram-description-${selected.key}`;
  return <>
      <figure className="fof-diagram not-prose" aria-labelledby={titleId} aria-describedby={descriptionId}>
      <figcaption className="fof-diagram-caption">
        <span>
          <strong id={titleId}>How money moves</strong>
          <small id={descriptionId}>See how funds enter Method and reach the liability.</small>
        </span>
      </figcaption>

      <div className="fof-diagram-columns" aria-hidden="true">
        <div>
          <span>Disbursement account</span>
          <span>Method-managed</span>
          <span>Destination</span>
        </div>
      </div>

      <div className="fof-diagram-rows">
        <section className="fof-diagram-row">
          <header className="fof-model-label">
            <h3>{selected.title}</h3>
            <p>{selected.starts}</p>
          </header>

          <div className="fof-money-path">
            {selected.nodes.map((node, index) => <div className="fof-money-path-item" key={node.label}>
                <div className={"fof-money-node" + (node.accent ? " is-accent" : "")}>
                  <span className="fof-money-icon">{renderIcon(node.icon)}</span>
                  <span>
                    <small>{node.role}</small>
                    <strong>{node.label}</strong>
                    <em>{node.detail}</em>
                    {node.requirement ? <b className="fof-money-requirement">{node.requirement}</b> : null}
                  </span>
                </div>

                {index < selected.connectors.length ? <div className="fof-money-connector">
                    <small>{selected.connectors[index].phase}</small>
                    <strong>{selected.connectors[index].label}</strong>
                    <i aria-hidden="true" />
                    <span>{selected.connectors[index].detail}</span>
                  </div> : null}
              </div>)}
          </div>

          {selected.support ? <div className="fof-support-account">
              <small>Supporting account</small>
              <strong>{selected.support.label}</strong>
              <span>{selected.support.detail}</span>
            </div> : null}

        </section>
      </div>
      </figure>
    </>;
};

With Per-Payment funding, you create a [Payment Instrument](/guides/payments/instruments#inbound-ach-and-wire-instructions) for one liability, then send (push) the exact Payment amount to its ACH or wire instructions. When Method receives the funds, it creates the Payment and handles the routing to the liability.

## Flow and schedule

<FlowOfFundsStyles />

<FlowOfFunds model="per-payment-funding" />

### Daily schedule

Send the exact Payment amount early enough for the funds to reach Method by the standard cutoff:

| Rail | Inbound funds cutoff |
| ---- | -------------------- |
| ACH  | 1:30 PM CT           |
| Wire | 3:30 PM CT           |

<Note>
  Per-Payment funding has one cutoff because receipt creates the Payment. Funds must reach Method by the listed time. Do not use the FBO batch-funding deadlines of 1:45 PM CT or 4:15 PM CT for this flow.

  Each inbound transfer funds one Payment, so this flow does not require a reserve or prefunded FBO balance. These times apply on banking days and exclude banking holidays. Method confirms the timing for your program during implementation.
</Note>

## Set up Per-Payment funding

<Steps>
  <Step title="Confirm the reversal setup">
    Method must configure a default reversal Account for your team before `payment_instrument.inbound_achwire_payment` becomes available. You can pass `reversal_account` when you create the Payment Instrument to override that default for the instrument.
  </Step>

  <Step title="Check the destination">
    Confirm that `payment_instrument.inbound_achwire_payment` is in the liability Account's `products`.
  </Step>

  <Step title="Create the Payment Instrument">
    Create an `inbound_achwire_payment` instrument and store its `pmt_inst_*` ID with the liability. See [Inbound ACH and wire instructions](/guides/payments/instruments#inbound-ach-and-wire-instructions).
  </Step>

  <Step title="Send the funds">
    Send the exact amount by ACH or wire to the returned account and routing numbers. Do not also call `POST /payments` for this transfer.
  </Step>

  <Step title="Inspect the Payment">
    Handle the `payment.create` [webhook](/reference/webhooks/overview), retrieve the Payment, and confirm its `payment_instrument`, amount, `status`, and `error`.
  </Step>
</Steps>

<Warning>
  Seeing `payment_instrument.inbound_achwire_payment` in the Account's `products` list means that the Account is eligible for inbound funding instructions. Method checks eligibility and your team's setup again when you create the Payment Instrument. Do not send funds until the create request returns completed instructions.
</Warning>

## Reconcile and handle failures

1. Store the Payment Instrument ID and your transfer ID before you send funds.
2. Match the created Payment to the stored `payment_instrument` ID.
3. Compare the Payment amount and status with your transfer record.
4. Continue to process `payment.update` events through `sent`, `posted`, `failed`, or `reversed`.

Rejected inbound transfers can also create a Payment and emit `payment.create` while Method returns the funds. Inspect `status` and `error` before you treat the transfer as accepted.

<Note>
  `source_trace_id` is `null` because the Payment source leg is an internal transfer. Use `sent` as the terminal status for a successful Payment. When available, `posted` confirms that the destination applied the Payment. Posted coverage depends on the destination institution and Account type, so not every Payment reaches `posted`.
</Note>
