Skip to content

Agent-ready offer

Make your plan one that ChatGPT, Claude, Gemini and Perplexity can find, price and buy, and prove it with 10 test purchases.

Kind
Workflow
Price
$2.91 per 10 tasks
Your time
15 minutes
Approval
Goes out on its own
Deepens
Launches
Default limits
What waits for you
More factsFewer facts
Offer.syndicate
You, to your agent

Make Leaseline’s monthly plan buyable by AI assistants, prove it with a finished purchase on each, spend up to $3, and show me the plan first.

curl -X POST "https://api.sb/leaseline.app/offers/syndicate?mode=try" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"goal":"Make Leaseline’s monthly plan buyable by AI assistants, prove it with a finished purchase on each, spend up to $3, and show me the plan first.","budget":{"amount":3,"currency":"USD"}}'
npx startup-builder do Offer.syndicate --try --data '{"goal":"Make Leaseline’s monthly plan buyable by AI assistants, prove it with a finished purchase on each, spend up to $3, and show me the plan first.","budget":{"amount":3,"currency":"USD"}}'
{
  "name": "do",
  "arguments": {
    "mode": "try",
    "code": "return await $.Offer.syndicate({ goal: 'Make Leaseline’s monthly plan buyable by AI assistants, prove it with a finished purchase on each, spend up to $3, and show me the plan first.', budget: { amount: 3, currency: 'USD' } })"
  }
}
import { $ } from 'startup-builder'

const result = await $.try.Offer.syndicate({ goal: 'Make Leaseline’s monthly plan buyable by AI assistants, prove it with a finished purchase on each, spend up to $3, and show me the plan first.', budget: { amount: 3, currency: 'USD' } })
Response
{
  "mode": "try",
  "stored": false,
  "estimate": "About $2.91 per 10 buyer tasks",
  "sample": {
    "assistant": "Perplexity",
    "task": "Find rent tracking for my 60 units under $200 a month, and set it up",
    "finished": "no",
    "stopped at": "pay: asked for a billing phone",
    "fix": "phone made optional, same day"
  }
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

What you get

  • 10 buyer tasks, as Offer records
  • feed · One catalog row per offer variant, as Stripe’s catalog feed holds it: name, price, limits and the checkout tool.
  • listings[] · The Stripe Directory and the MCP registry, each submitted or live, read back daily.
  • runs[] · Each buyer task: the assistant, the task, finished or not, and the step it stopped at.
  • runs[].fix · What changed so the next run finishes, and when.
  • priceMatches · Whether every price an assistant stated equals your price file and the Stripe Price.

Connect once: Stripe agentic commerce. How long: About 25 minutes for the 10 buyer tasks, two assistants at a time; the Stripe Directory lists you in days.

Trigger

It runs once when you publish an offer; then the feed syncs every day and the buyer tasks run every week.

TypeScript
every.week(($) => $.Offer.syndicate({ offer: 'offers/pro', tasks: 10 }))

Steps

Your agent does these steps, one row per step; each step’s check is part of its row and its price.

StepVerbReturnsPriceApproval
1. Build the price file from your Stripe PricesCollection.queryEvery offer variant with its Price, limits and checkout, equal to the Stripe PricesFreeRuns on its own
2. Write one catalog feed row per offer variant for Stripe’s catalog feedOffer.publishOne row per variant: what it is for, the price, the limits and the checkout toolAbout 1.2¢Goes out on its own
3. Check the checkout tool with a test payment token in try modeOrder.payPer assistant: the tool answers, takes the token, and returns the account and its key in one replyAbout 32¢Runs within your limits
4. Submit to the Stripe Directory and the MCP registryPost.publishBoth listings submitted from your own accounts, then read back daily until liveFreeGoes out on its own
5. Run 10 buyer tasks across ChatGPT 3 · Claude 3 · Gemini 2 · Perplexity 2, each paid with a 100% eval couponOrder.placeEach task finished, or stopped at a named step: find, pick, price, pay or keyAbout $2.56Runs within your limits
6. Write the readoutCollection.queryPer assistant: finished or the step it stopped at, the fix, and each stated price against your price fileAbout 2¢Runs on its own

Calls: Collection.query, then Offer.publish, then Order.pay, then Post.publish, then Order.place, then Collection.query.

About $2.91 per 10 buyer tasks, each time it runs, capped at $3.00.

Example: give it a goal

Make Leaseline’s monthly plan buyable by AI assistants, prove it with a finished purchase on each, spend up to $3, and show me the plan first.

The plan it shows runs 6 steps, priced before it spends anything; Run it above shows the result it returns.

When something fails

Each failure, and what happens next
WhenThen
An assistant stops before it paysThe run records the step and what the assistant asked for, and an Issue names the field or call to change; the next run reads it again.
An assistant states a price your price file does not holdpriceMatches reads false, the feed rows stop, and your agent re-syncs from the Stripe Prices before anything else runs.
The Stripe Directory has not listed you yetThe listing stays submitted, read back daily; the buyer tasks still run on the four assistants.
You call it again the same dayIt returns the stored run at $0, keyed on offer, assistants and day.

Each step retries three times, then falls through to the next route; one item's failure lands in skipped with its reason, never failing the call. Before a step would cross maxCost it stops and returns what it has, with a resume link. Each step's idempotency key is the call's key plus the step and the item: leaseline-offer-syndicate-1-<step>-<item>.

Change it

AskCompiles to
Add Google’s AI Mode to the assistants.Offer.syndicate
List my pilot too, with its own checkout.Offer.publish
Run the buyer tasks every week and tell me what changed.Offer.syndicate
TypeScript
import { $, workflow } from 'startup-builder'

export default workflow({
  name: 'offer-syndicate',
  verb: 'Offer.syndicate',
  input: { offer: 'string', assistants: 'string[]', tasks: 'integer' },
  maxCost: 3,
  execute: async (
    ctx,
    {
      offer,
      assistants = ['chatgpt', 'claude', 'gemini', 'perplexity'],
      tasks = 10
    }
  ) => {
    const prices = await ctx.step(
      'price-file',
      () => $.Collection.query({ from: 'price', where: `offer = '${offer}'` })
    )
    const feed = await ctx.step(
      'feed',
      () => $.Offer.publish({ offer, to: 'stripe-catalog', rows: prices })
    )
    const check = await ctx.step(
      'checkout',
      () => $.Order.pay({ offer, token: 'test', assistants, mode: 'try' })
    )
    const listed = await ctx.step(
      'listings',
      () => $.Post.publish({
        venues: ['stripe-directory', 'mcp-registry'],
        offer
      })
    )
    const runs = await ctx.step(
      'buyer-tasks',
      () => $.Order.place({ offer, tasks, assistants, coupon: 'eval-100' })
    )
    return readoutOf(feed, check, listed, runs)
  },
})

Extend it with extends: 'Offer.syndicate' and base(), or compose your own from these steps.

Works with

Plays that order it: Get bought by agents, Keyless signup.

It serves Check AI answers, and runs in Launch and search. It deepens Launches.

For agents

For agents: the guide, its approvals, retries and lookups
FactValue
GuideOffer.syndicate
Guide approvallimits
GoalMake Leaseline’s monthly plan buyable by AI assistants, prove it with a finished purchase on each, spend up to $3, and show me the plan first. It may change counts, the order of steps, soft filters and the route a read takes, and it stops early when the goal is met. It never relaxes your words, raises its own budget, answers its own approval, calls a Play or acts outside your standing approval.
Triggerevery.week(($) => $.Offer.syndicate({ offer: 'offers/pro', tasks: 10 }))
RetryThree times with backoff, then the next route; the same idempotency key never charges, sends or posts twice
Idempotency keyleaseline-offer-syndicate-1
LookupsA find: input asks unless exactly one record fits
StepAction class
1. Build the price file from your Stripe PricesNone.
2. Write one catalog feed row per offer variant for Stripe’s catalog feedpublish
3. Check the checkout tool with a test payment token in try modespend
4. Submit to the Stripe Directory and the MCP registrypublish
5. Run 10 buyer tasks across ChatGPT 3 · Claude 3 · Gemini 2 · Perplexity 2, each paid with a 100% eval couponspend
6. Write the readoutNone.

Steps 2 and 4 reach people outside your records and go out on their own within your limits.

Who does each step, and how it is checked
StepFunctionDoerCheckerAssuranceInputs
1. Build the price file from your Stripe PricescodeCodeCode checks each result against its declared typemeasured$0.offer
2. Write one catalog feed row per offer variant for Stripe’s catalog feedagenticThe Integration Engineer agentA second model grades the outputgraded$1.variants
3. Check the checkout tool with a test payment token in try modeagenticThe Tester agentCode reads the result back from where it landedmeasured$2.feed, $0.assistants
4. Submit to the Stripe Directory and the MCP registrycodeCodeCode reads the result back from where it landedmeasured$2.feed
5. Run 10 buyer tasks across ChatGPT 3 · Claude 3 · Gemini 2 · Perplexity 2, each paid with a 100% eval couponagenticThe Tester agentCode reads the result back from where it landedmeasured$0.tasks, $0.assistants
6. Write the readoutagenticThe Analyst agentA second model grades the outputgraded$3, $5

Code does steps 1 and 4; The Integration Engineer agent does step 2; The Tester agent does steps 3 and 5; and the Analyst agent does step 6. A second model checks the 2 graded steps, never the one that wrote it, so the whole call is graded.

Under the hood

Under the hood: the Systems, Nouns and Events it touches
KindWhat it touches
SystemsSocial
NounsCollection, Offer, Order, Post
EventsCollection.queried, Offer.published, Order.paid, Post.published, Order.placed

Reference

Inputs, outputs, its Event and its errors
NameTypeDefaultMeaning
offerOfferRequiredThe offer to make buyable. Its Prices, variants and limits come from your Stripe Prices.
assistantsVenueId[]['chatgpt', 'claude', 'gemini', 'perplexity']The AI assistants the buyer tasks run on.
tasksinteger10Buyer tasks, each written in a buyer’s words, split across the assistants: 3, 3, 2 and 2 at the default.
maxCostnumber3.00The most this call spends each time it runs, in USD. It stops before a step would cross it and returns what it has, with a resume link.

Emits Offer.syndicated. Refuses with max-cost before it spends, and with the Data calls and Accounts groups (refusals).

Contents