Skip to content

From agreement to payout, one state machine

The same four states, with the same guarantees, every time.

The escrow lifecycle

Each transition is atomic and emits a signed webhook.

  1. 01

    Create the escrow

    Terms are fixed at creation.

    POST /v1/escrows → awaiting_funding

  2. 02

    The buyer funds it

    The seller sees cleared funds.

    status: funded

  3. 03

    The seller delivers

    Delivery starts the clock.

    status: in_delivery

  4. 04

    Funds release

    The buyer confirms, or time lapses.

    status: released → payout

Disputes freeze the money, not your business

A disputed escrow stops the clock.

  1. 01

    Release is frozen

    The window stops and any payout is cancelled.

  2. 02

    Both sides submit

    Timestamped and immutable, from both sides.

  3. 03

    An outcome is recorded

    Release, refund or split, written and executed.

  4. 04

    Appeal window

    Either party can contest once, within seven days.

Three calls and a webhook

Create, fund and release are the whole surface.

webhooks.ts
// Every state change arrives as a signed webhook.
app.post('/escrowlift', (req, res) => {
  const event = escrowlift.webhooks.verify(
    req.body,
    req.headers['escrowlift-signature'],
  )

  switch (event.type) {
    case 'escrow.funded':
      return ship(event.data)
    case 'escrow.delivery_confirmed':
      return payout(event.data)
    case 'escrow.disputed':
      return freeze(event.data)
  }

  res.sendStatus(200)
})

Details worth knowing

Start holding funds this week

Open a sandbox escrow and go live when you're ready.