Flow · 14 steps

Share a quote your customer can accept

Give your customer a page for their quote, in your brand, that they open from a link and accept or decline with no account.

Set your brand once — your business name, colours, contact and terms — and every page, PDF and email wears it. Issue a quote, ask for its link, and send it however you like (Send quote in the admin puts it in the email for you). The link opens that quote and nothing else. When your customer accepts, the quote is placed as an order with the customer as the one who placed it; declining records why. Orders, invoices and parcels have links of their own, and any link can be revoked.

Services involved

A filled dot is a read; a ring is a call that changes something.

  • Notifications: https://notifications.getmanifold.io
  • Inventory Manager: https://inventory.getmanifold.io
  • Fulfillment Manager: https://fulfillment.getmanifold.io

Every call carries Authorization: Bearer $MANIFOLD_TOKEN unless its step says otherwise (getting a token). Run a flow in your sandbox, not your live organization: see Before you start.

1 Set your brand

Your name, colours and contact, as your customers see them. The accent colour must read at 4.5:1 on white; the brand colour's text colour is chosen for you.

PUT /settings/brand Notifications

Request · application/json
{
  "businessName": "Ridgeline Outdoor",
  "brandColour": "#1f4d3a",
  "accentColour": "#1f6f50",
  "contact": {
    "email": "accounts@ridgeline-outdoor.example",
    "website": "https://ridgeline-outdoor.example"
  },
  "terms": "Quotes hold their prices until the date shown."
}

What the answer holds: the operation's example.

Records notifications.brand-saved.

2 Read it back

The brand as saved, with the text colour it takes and the logo once you upload one.

GET /settings/brand Notifications

What the answer holds: the operation's example.

3 See it as your customers' pages do

What the hosted pages read: public, since every message and page already shows it.

GET /brands/org_01a15a10-2b3c-7d4e-8f50-61728394a5b6 Notifications

What the answer holds: the operation's example.

4 Have something to quote

A SKU with units on hand, so the accepted quote can hold them.

POST /items Inventory Manager

Request · application/json
{
  "sku": "SHARE-QUOTE",
  "name": "Trail pack, 30L",
  "quantity": 20
}

Answers 201. What the answer holds: the operation's example.

Records inventory.item-created.

5 Draft the quote

Priced here, since no catalog lists the SKU yet.

POST /orders Fulfillment Manager

Request · application/json
{
  "reference": "QUOTE-TRAIL-PACKS",
  "stage": "draft-quote",
  "lines": [
    {
      "sku": "SHARE-QUOTE",
      "quantity": 4,
      "unitPriceCents": 8900
    }
  ]
}

Answers 201. What the answer holds: the operation's example.

From your answer, later steps send id as {orderId}.

Records fulfillment.quote-created.

6 Keep the call it was quoted over

When a rep talks the quote through with the customer, the voice service hands the conversation's transcript to the quote as the call ends: plain text, keyed by the session, kept once — and erased with the customer if they ask to be forgotten.

POST /orders/{orderId}/transcripts?reference=vcs_01a15a10-5e6f-7a71-8c83-94a516b7c8d9&utterances=2&audioSeconds=95&startedAt=2026-10-20T01%3A00%3A00.000Z Fulfillment Manager

Request · text/plain
Voice session
[00:00] Speaker 1: Four of the 30 litre trail packs, please.
[00:04] Speaker 2: At $89 each, I can do that.

Answers 201. What the answer holds: the operation's example.

Records fulfillment.transcript-attached.

7 Read the transcript

A five-minute signed link to the text; the quote's page opens it from its Activity stream.

POST /orders/{orderId}/transcripts/vcs_01a15a10-5e6f-7a71-8c83-94a516b7c8d9/link Fulfillment Manager

What the answer holds: the operation's example.

8 Issue it

Its prices lock: what the customer is shown is what they accept.

POST /orders/{orderId}/quote Fulfillment Manager

Request · application/json
{}

What the answer holds: the operation's example.

Records fulfillment.quote-issued.

9 Ask for its link

The page's url and its signed token. Asking again answers the same link: send it as often as you like.

POST /orders/{orderId}/links Fulfillment Manager

Request · application/json
{
  "document": {
    "kind": "quote"
  }
}

What the answer holds: the operation's example.

From your answer, later steps send token as {token} and link.id as {linkId}.

Records fulfillment.customer-link-issued.

10 Your customer opens it

What the page shows: the quote as issued, and that they may accept or decline it. No account, no bearer.

GET /customer/org_01a15a10-2b3c-7d4e-8f50-61728394a5b6/{token} Fulfillment Manager

What the answer holds: the operation's example.

11 The page records it opened

Once per link — and once more for each message whose copy was opened, which marks that message opened.

POST /customer/org_01a15a10-2b3c-7d4e-8f50-61728394a5b6/{token}/viewed Fulfillment Manager

Answers 204. What the answer holds: the operation's example.

Records fulfillment.customer-link-viewed.

12 They accept

The quote is placed as an order under its number, the customer's link as the one who placed it.

POST /customer/org_01a15a10-2b3c-7d4e-8f50-61728394a5b6/{token}/accept Fulfillment Manager

What the answer holds: the operation's example.

Records fulfillment.order-created, fulfillment.stock-allocated, fulfillment.shipment-created.

13 Declining now is refused

A placed quote is no longer theirs to decline.

POST /customer/org_01a15a10-2b3c-7d4e-8f50-61728394a5b6/{token}/decline Fulfillment Manager

Request · application/json
{
  "reason": "Changed our minds"
}
Refused · 409
{
  "_tag": "QuoteNotAnswerable",
  "reason": "placed"
}

Records nothing.

14 Revoke the quote's link

Its token opens nothing from now; the order's own status link is a new one.

POST /orders/{orderId}/links/{linkId}/revoke Fulfillment Manager

What the answer holds: the operation's example.

Records fulfillment.customer-link-revoked.

What a recorded fact is: Facts and the journal. Why a repeated step changes nothing: Idempotency and retries.