Skip to content

Supply, booking and fulfilment

Supply, booking and fulfilment is the market side of Work: who does the job, when, and how it reaches the buyer. Every visit, fill and shipment writes the track record that ranks the next match.

Supply, booking and fulfilment: one loop

Filled: what the buyer or the supplier sees. Hollow: a step inside the platform.

Capability families

The same family serves your own people, such as a Service API's paralegals, and a Marketplace's suppliers. It also serves a Customer's own staff, when a Headless SaaS lets each Customer book its own clients. A supplier is an account kind, so every move below is a Verb a supplier's agent can call under a mandate.

FamilyWhat it gives every product
Join and verifyA supplier applies and passes the checks your verify names (identity, tax, a credential and its expiry) before it lists an item or claims a job
CapacityWhat each supplier can take on: work in hand at once, working hours, a calendar of its own, skills and credentials. A supplier at capacity leaves matching until work closes
MatchingA job goes to the supplier it names, else to the best by the keys you rank (capacity, rating, price, credential). Unclaimed in its window, it is rematched, and every match records why
Track recordOn-time rate, first-time acceptance, no-shows, contests and ratings per supplier, computed from the record and never typed. Every item shows it, and matching reads it
Supplier orgsA supplier with members, Roles and agents of its own under one payout account; a job is matched to the org and claimed by a member
Staged disclosureWhat a supplier sees of the buyer before a claim, after it and after acceptance. Contact details and records open only as the work needs them
Calendars and availabilityFree times computed from hours, bookings, buffers and each party's timezone; a business calendar closes holidays
Holds and bookingsA slot held for minutes while the buyer confirms, then confirmed; a waitlist fills a cancelled slot in order
The no-show ruleFree cancellation up to a cut-off, then a fee, and a fee for a no-show; both print on the offer card and charge only under the published rule
Service-level clocksClaim within, start within, deliver within. A lapsed clock rematches, escalates or applies the remedy the Offer names
Orders and fulfilmentOne order lifecycle for delivered work and for goods: placed, claimed, filled, then accepted, contested or returned
Inventory and shipmentStock per item and place, held at placement, committed at fulfilment, released on cancel; shipments tracked as observed Events; returns under the refund rule

Lifecycles and states

ThingStatesWhat moves it
A supplierapplied, verifying, verified, paused, removedVerification passes or fails, or a credential expires; you or the supplier pause; a removal keeps the record
A supplier's capacityopen, full, awayClaims and closes; the supplier's hours and calendar
A matchoffered, then claimed, declined or lapsedThe supplier's claim, or the claim clock; a decline or lapse rematches
A bookingheld, confirmed, then attended, missed or cancelled; or releasedThe buyer's Verbs, the hold clock, the supplier's mark at the slot's end, and the no-show rule
A waitlist placewaiting, offered, then taken or lapsedA cancelled slot, and the hold clock on the offer
An orderplaced, claimed, filled, then accepted, contested or returnedThe supplier's claim and fill, the rematch clock, and the buyer's acceptance
A stock holdheld, then committed or releasedPlacement, fulfilment, a cancel or a lapsed hold
A shipmentpacked, shipped, delivered; or lostThe supplier, then the carrier's tracking, arriving as observed Events
A returnrequested, approved, received, refunded; or declinedThe buyer, the refund rule in the Offer, and the supplier's receipt of the goods

Matching is a step and its result is a state. The buyer sees held and claimed; who else was offered the job, and why they were passed over, stays in the evidence.

What you declare, what the platform does

You declareThe platform does
A Noun marked supplier, with verify and payoutRuns sign-up, verification, payout onboarding on Stripe, tax forms and the supplier's side of the portal
capacity on the supplier: work in hand, hours, a calendarComputes free times and open capacity, and takes a full supplier out of matching
match keys and claimWithin on the creating moveRoutes each job, rematches on a lapse, and records why each match was made
A slot on a booking: with whom, how long, the holdOffers free times, holds and confirms, fills from the waitlist, and sends the reminders in the booking's conversation
noShow and cancelBefore in the OfferPrints both on the offer card and the terms, charges the fee under the rule, and refuses a deploy whose fee exceeds the price
stock on an item and ship on an orderHolds and commits stock, refuses an oversold item with a cure, takes tracking as Events, and runs returns
Nothing elseThe track record, supplier orgs, staged disclosure, service-level clocks, and the evidence behind every match and every fee

Example

research adds a booked call. After an order is filled, the buyer books 30 minutes with the researcher who filled it: $60, and a $15 fee for a no-show.

definition.ts
33 lines
import { define } from 'apis.dev'

/** Company research from verified researchers, ordered in one call, with a call booked when you want to talk it through. */
export default define({
  name: 'research', domain: 'research.apis.dev',
  Researcher: {
    supplier: { verify: ['identity', 'tax'], payout: 'stripe' },
    capacity: { orders: 5, hours: 'Mon-Fri 09:00-17:00', calendar: 'own' },  // what they can take on
    name: 'string', lookups: '<-Lookup.researcher',
  },
  Lookup: { … },
  Order: {
    lookup: '->Lookup.orders', company: 'url', answer: 'string?', briefings: '<-Briefing.order',
    status: {
      place: { match: ['capacity', 'rating', 'price'], claimWithin: '4h' },
      claim: { in: 'placed', role: 'researcher' }, fill: { in: 'claimed', role: 'researcher' },
      accept: 'filled', contest: 'filled',
    },
  },
  Briefing: {                                            // a booking: time with a supplier
    order: '->Order.briefings', at: 'date',
    status: {
      hold: { slot: { with: 'order.researcher', minutes: 30, hold: '15m' } },
      confirm: 'held', attend: 'confirmed', miss: 'confirmed', cancel: ['held', 'confirmed'],
    },
  },
  offer: {
    'Order.place': { price: 'lookup.price', bounds: [10, 500], when: 'accepted',
                     accept: 'customer', acceptWithin: '5d', remedy: 'refund' },
    'Briefing.confirm': { price: 60, when: 'attended', noShow: 15, cancelBefore: '24h' },
    take: 0.15,                                          // your share, split on Stripe
  },
})

A buyer's agent holds the first free slot. The reply carries the rule it is held under.

Response
HTTP/1.1 201 Created
Location: /briefings/brf_1
X-Cost: price=0, currency="USD"
X-Request-Id: req_3e8a1c0f72b94d65a1e7

{
  "id": "brf_1",
  "order": "order_1",
  "with": "researcher_3",
  "at": "2026-10-30T15:00:00Z",
  "minutes": 30,
  "status": "held",
  "heldUntil": "2026-10-27T09:15:00Z",
  "rule": { "price": 60, "noShow": 15, "cancelBefore": "2026-10-29T15:00:00Z" },
  "createdAt": "2026-10-27T09:00:00Z",
  "updatedAt": "2026-10-27T09:00:00Z"
}

Confirming holds $60 on the buyer's card and charges nothing. Attendance charges it and splits it: $51 to the researcher, $9 to you.

A missed call charges $15 under the same split, and a cancel before 15:00 the day before costs nothing. An unconfirmed hold releases at 09:15 and offers the slot to the waitlist.

Contracts with the other subsystems

SubsystemWhat this family takes from itWhat it gives back
Definition and compilesupplier, capacity, slot, match and the no-show rule, checked at deploy: a fee above the price, or a slot no supplier can staff, is refusedThe roster and its capacity, which the staffing check reads
Identity, access and policyTwo account kinds, supplier orgs with members and Roles, mandates for suppliers' agentsGrants for staged disclosure, opened step by step
Model and recordsItems, bookings, orders, stock and ratings as recordsThe track record, as a projection rebuilt from them
Data and SourcesEach supplier's catalog and calendar, connected as an Integration; a carrier's trackingSupplier changes written back to their own systems
RuntimeHold, claim and service-level clocks on business calendars; reminders as effectsBriefing.missed, Order.claimed, Shipment.delivered and every other move as an Event
CommerceHeld funds, charge on attendance or acceptance, no-show fees, splits, payouts, refunds and clawbacksThe move that charges, and each supplier's share
Interfaces and distributionFree times on the site and the portal; reminders in the booking's conversationThe supplier contracts a delivery screen renders
Trust and operationsSupplier verification and risk, fraud on both sidesThe evidence behind every match, fee and contest

What Customers and their agents meet

  • The rule before the slot. The offer card prints the price, the no-show fee and the cut-off, so a buyer knows the cost of a miss before it books.
  • Free times as data. GET /briefings/slots?order=order_1 lists open times in the buyer's timezone; holding one is one call, confirming is a second.
  • An agent books under its mandate. It holds, confirms within its budget, and cancels before the cut-off when its task changes. A fee past the mandate's limit waits for its person.
  • A supplier's day. A researcher, or its agent, claims orders up to capacity, fills them, marks each call attended or missed, and reads each payout.
  • A fee can be disputed. A buyer disputes a no-show fee with the receipt. The join record and the supplier's mark are the evidence, and the answer is an Event.
  • One record, either side. The buyer sees the booking and the order; the supplier sees its jobs, its track record and its payouts. Neither sees the other's books.

Every supplier, slot and order is a record with a clock, so the promise holds whoever fills it.