APIANT vs
Sources: Tray.ai docs, reviewed 
Why this compare page exists

APIANT vs Tray.ai

Two integration platforms. One has a catalogue of prebuilt apps; the other builds what you need from an API’s own documentation. This page compares what each actually requires of your team, across fifty-four jobs.

The verdict, if you read nothing else

Tray's AI builds, validates and debugs a failed run, on every plan. What it does not reach is a run already in flight, or one fix shipped to an installed base.

  1. 1Turning the whole estate off is one call, and one call turns exactly that set back on.On Tray the stop is a button per workflow, and neither published OpenAPI spec carries an endpoint that stops an execution.Capability 37
  2. 2One corrected integration reaches every linked customer account in a single deploy, verified at 232 locations.Tray upgrades a breaking change one solution instance per call, and their own sequence ends "Notify the end users of these instances to run the config wizard."Capability 31
  3. 3A vendor's breaking API change is fixed in one connector, and the platform names which automations reference it.Tray: "you will need to manually update it yourself", with no way to "subscribe to updates for a particular connector".Capability 34
  4. 4Quarter end's 80 MB file takes the same path as a normal night's 12 MB.Tray publishes 6 MB between any two steps, 1 MB into a webhook trigger, and 400 KB per parallel thread.Capability 02
  5. 5The configuration host, the authentication callback and the webhook receiver are hostnames you own.Tray's de-branding substitutes their own wildcard domains, and the OAuth callback stays on auth.tray.io where a vendor accepts a single redirect URL.Capability 50
  6. 6One build serves hundreds of customers, and the screen they configure on is built with the platform's own form tools.Tray Embedded "is available to Enterprise customers as an optional add-on", and the application behind the wizard is yours to write.Capability 28

Each line opens the row it came from, with the scenario and the documentation behind it. Read them sceptically: that is what the rest of this page is for.

Why the promises tell you nothing, in one analogy:

Two cars, both advertised as self-driving. One parks itself in your driveway. The other drives Philadelphia to Denver while you sleep. Same words on the brochure. Not the same product.

The analogy, animated · we make integration software, not cars
Swipe to see both cars BROCHURE: "SELF-DRIVING" BROCHURE: "SELF-DRIVING" CAR ONE 40 FT PARKED ✓ TRIP: 0.008 MI Car one parks itself in your driveway. That is the whole product. CAR TWO DEPART 18:40 DUSK 02:40 · YOU ARE ASLEEP ARRIVE 06:12 DAWN 7,000 FT CLIMB PITTSBURGH ST. LOUIS SALINA I-76 I-70 TOLLS ×3 PAID I-70 CLOSED · RE-ROUTED STORM · LANE HELD CHARGE ×2 · UNATTENDED PHILADELPHIA DENVER ARRIVED ✓ 06:12 MT N 0 500 MI 9 STATES CROSSED 2 RE-ROUTES 14 LANE CHANGES 1 MOUNTAIN PASS HANDOFFS TO YOU: 0 1,743 MILES 26 HOURS UNATTENDED ONE PROMPT: "TAKE ME TO DENVER" Car two drives Philadelphia to Denver while you sleep.

Same two words on both brochures. Two completely different products.

Integration platforms are harder: there is no test drive. Every vendor writes the same words: deep, autonomous, AI-powered, enterprise-grade. Words are free. You find out what you bought in month nine, when a customer reports a failed sync and you need to know exactly what happened. Or in year two, when the engineer who built it is gone.

So this is not a page of claims. It is a page of jobs. A real thing that has to happen. What happens on APIANT, step by step. What the same job requires on Tray.ai, in its own documentation's words.

Apply the same scepticism to us. Read the architecture, not the adjectives. And take three questions with you into every vendor conversation you have after this one:

These three tests run on every one of the fifty-four capabilities on this page. By the third section you will be asking them yourself.

APIANT vs Tray.ai · for the executive who owns the integration decision

Both platforms let an AI build your integrations. The difference is what the AI hands you afterwards.

Integration work is where your roadmap goes to wait. Deals stall on a connector that does not exist yet, engineers get pulled off product to fix a sync, and a single "it didn't work for one customer last Tuesday" can absorb a week of senior time. Whichever platform you choose, you will live inside its architecture for years. This page shows you what each one actually requires of your team, job by job.

A note on method. Every vendor in this category claims depth, autonomy, and reliability, and you have no way to adjudicate competing claims. So this page does something else: it takes concrete jobs and shows what each platform's architecture requires to get them done. APIANT's side is a walkthrough of shipping capabilities. Tray.ai's side is derived from Tray.ai's own documentation, help centre and pricing page, quoted where a quote beats a paraphrase. Where their design handles a job well, we say so.

How to read this page. Every row is one capability. Bright text is what you get on APIANT; muted text after the dot is what the same job costs on Tray.ai. Skim the fifty-four takeaways and open any row that matters. Inside each: the problem that forced the capability to exist, a concrete scenario, how it goes on APIANT, and what the same outcome requires on Tray.ai. Skim the bold lines first. The argument is the pile, not any single row.

54 capabilities
Act 1 of 8

The foundation. Why any of the rest is possible.

Every saved version stays readable and diffable here, listed, opened and compared step by step, with no published cliff on the record; Tray runs two clocks, "Edit history: Viewable up to 12 months. Rollback feature: Can rollback to a previous workflow version up to 30 days prior to your current changes", so a March change read in September is inside the readable window and outside the reversible one, and 6 MB is the ceiling between any two steps.

Everything on this page traces back to one design decision made years before AI could build integrations: what is an integration made of? On APIANT the answer is structured data, all the way down. That choice looked like an implementation detail for a decade. It is now the whole ballgame.

01Integrations your team can open and read later

A new hire asks the AI to rework invoice mapping, or does it herself in twenty minutes. Either way, no engineer. On Tray.ai, twelve months of change record, thirty days of rollback.

Open the scenario
1
Capability 01 · Everything else on this page depends on this one

Code cannot be safely edited by a machine, inspected by a non-developer, or replayed with its state intact.

The AI builds your integration as a visual flow your team can open, read, and change. Not as code only its author understood.

And that holds at every layer: the flow, the connectors inside it, each API operation, every mapping, every setting. All of it is structured data. That one choice is why a machine can edit it safely, a person can always inspect it, and a saved run can be replayed with its state intact.

The scenario Meridian's new integrations lead must change invoice mapping after the engineer left.

Meridian's new integrations lead must change invoice mapping after the engineer left.

Meridian, a field-services SaaS with 4,100 customers. In March, an AI built their QuickBooks invoice sync in a working session. In September, the engineer who supervised that session has left, and Dana, the new integrations lead (sharp, technical, not a developer), needs to change how invoice line items map for a segment of customers. The question that decides Dana's week: what did the AI actually hand Meridian in March?

Swipe to see the whole diagram ON APIANT Trigger Map QuickBooks The AI built this. Dana opens the same artifact, reads it, edits one mapping node. Dana ON TRAY.AI (AI-BUILT) Edit history She can open it. Readable for 12 months, reversible for 30 days. No rollback to March.
On APIANT
  1. Dana asks the AI to remap invoice line items for the affected segment. It opens the same artifact she would open, edits that one mapping node, retests against a saved real run, and commits a new version.
  2. Or she does it herself: the integration renders as the visual flow the AI built, because the AI and the editor operate one artifact, a structured document rather than code. She reads the steps in order and clicks the mapping to see which fields feed which, and the blocks inside open the same way.
  3. Either way the edit targets one node, so its blast radius is that node, and she can compare the new version against March's line by line. Every earlier version is kept, ready to redeploy if the change was wrong. About twenty minutes, no engineer.
  4. The March artifact and the September artifact are the same living thing.

Elapsed: about twenty minutes. No engineer involved. The March artifact and the September artifact are the same living thing.

On Tray.ai

Dana can open it, and that has to be said plainly before anything else. Tray's build artifact is a visual workflow rather than a file of code, their AI writes into the same artifact a person opens ("anything built headless opens in Tray's visual builder with no migration"), and their project-versioning page says each version carries "a list of changes made since the previous version, including details of who made the changes and what those changes were". Separately, in the builder, their undo-redo page gives the edit history search filters for Actions, Dates and Users. On reading a stranger's work, Tray is good.

Edit history: Viewable up to 12 months. Rollback feature: Can rollback to a previous workflow version up to 30 days prior to your current changes.Tray docs, building-workflows/shortcuts/undo-redo, Version history storage section, seen 2026-08-20

What Tray publishes is a gap between what she can read and what she can put back. Under the Version history storage heading of that same undo-redo page: "Edit history: Viewable up to 12 months. Rollback feature: Can rollback to a previous workflow version up to 30 days prior to your current changes." Their worked consequence is on the page: "While you would be able see the record of the changes within the edit history, you would not be able to rollback your workflow to reflect those changes." A March build read in September sits inside the readable window and outside the reversible one, and the same page caps in-session undo at "the last three seconds worth of recorded editing activity".

Two further things sit outside the artifact she can read. The runs that would show what the sync actually did expire on a package clock: "Pro = 7 days from the last workflow run; Team = 7 days (30 days as optional add-on); Enterprise = 30 days." And the parts of an integration that are not workflow steps are code somebody owns: a custom connector is a TypeScript project since "February, 2026: Creating new connectors in Connector Builder is no longer available", end-user field mapping in Embedded is "a Script connector-based workflow", and Custom JS in the config wizard is switched on by a support request.

Test 01 this is the row where it bites hardest

Both let an AI build the integration. The difference is what the AI hands you afterwards.

02Any data format, any file size

Quarter-end's 80MB file clears by 4am on the same path as a normal night. On Tray.ai, 6 MB between any two steps and 1 MB into a webhook.

Open the scenario
2
Capability 02

Integrations died on large payloads, and on formats the platform had not anticipated.

One unified data processing engine: format-agnostic, large payloads on the ordinary path, one open query standard

Every record, file, and API response flows through a single engine with a small memory footprint. The platform does not care what shape your data arrives in or how much of it there is.

The scenario Caldera Health's 38 clinics need overnight claims reconciled before 7am doors open.

Caldera Health's 38 clinics need overnight claims reconciled before 7am doors open.

Caldera Health, a 38-clinic group. Every night at 1am, their practice-management system exports the day's claims and inventory as one file. On a normal Tuesday it is 12MB. At end of quarter it is 80MB. The integration has to parse it, reconcile it against the billing platform, and post corrections before clinics open at 7am. Nobody is awake to babysit it, which is the point.

Swipe to see the whole diagram ON APIANT Nightly file 80MB at quarter end Unified engine any format, any size Billing, 7am ON TRAY.AI Same file inbound 1 MB webhook cap 6 MB between any two steps, chunking to 400 KB threads
On APIANT
  1. The AI wrote the reconciliation logic once. The engine normalizes any format into one internal model, so the same transformation runs whether the source sends structured records, spreadsheets, or something custom, and queries use one open standard everywhere.
  2. No per-format branch for the AI to author or a person to maintain. Its memory footprint stays small, so the 80MB quarter-end file takes Tuesday's path: no storage hop, no chunking. Corrections post by 4am.
  3. If a record fails, the AI reads the payload at that step and says what arrived, and Caldera's operator can open the same run herself.

Corrections post by 4am. Quarter end is not an incident category.

On Tray.ai

The 80MB quarter-end file can land on Tray. It cannot move through the workflow as one payload, and Tray publishes the number: "Data that can pass between any 2 steps in the workflow builder | 6 MB | any more will cause issues." The entry points are tighter than the middle. The webhook trigger takes "1 MB", with "file content can be sent as multi-part http requests, with an overall limit of 10MB"; the form trigger takes "1 MB (10 MB for attached files)"; an inbound email attachment is "10 MB"; and on the CSV path, which is what a nightly claims export usually is, the "Max payload between steps for CSV Reader" is "1 MB" with a "Maximum row size | 8 KB".

Data that can pass between any 2 steps in the workflow builder | 6 MB | any more will cause issuesTray docs, Technical limits, seen 2026-08-20

Native file storage is real and included, and it should be credited: "Each file stored has a maximum file size limitation of 100 MB" with a "Storage repository per project has a maximum size limitation of 1 GB", on all plans. So the file arrives. The parsing, reconciling and splitting is then chunk-by-chunk logic the builder assembles under the 6 MB and 1 MB ceilings, and the intermediate products are short-lived: "How long do files generated in a workflow persist? | 6 hours." Their own fan-out tutorial carries the same ceiling in its worked example: "The overall processing limit for this example is 6MB of data (each thread has a limit of 400KB)."

Two carve-outs worth knowing before a nightly job is designed around it. File storage does not reach the end-customer case: "The current version of File Storage Service cannot be accessed from within an end-user solution instance", with the documented workaround being to wrap it as an API Management operation and call it over HTTP Client. And the heavier data tooling is a sales conversation rather than a plan feature: the SQL Transformer is gated with "If you're interested in using this feature, please reach out to your Customer Success Manager or Account Executive", and "Data engineering" appears on the pricing page as an Enterprise line and an add-on.

Built for this, in the live inventory:the unified data engine, under every one of the 138 tools
Test 02 depth claims dissolve on contact with one big file
03Your own dev and production servers

Your syncs queue behind your own traffic, at your own domain, on a dedicated server pair from the entry paid plan. On Tray.ai, a data region and separate orgs, not a dev and prod server pair of your own.

Open the scenario

Shared infrastructure means shared rate limits, shared incidents, and commingled customer data.

03 · A dedicated dev and production server pair, on your own domain, single tenant, from the first paid tier

The scenarioThird Coast Credit Union: 190,000 members, one circled questionnaire line, nine days

Third Coast Credit Union: 190,000 members, one circled questionnaire line, nine days

Third Coast Credit Union runs 41 branches and holds accounts for 190,000 members. Its vendor risk committee has sent back a 112-question security review with one line circled: confirm that member data and integration traffic are not commingled with other tenants, and name the domain the traffic terminates on. The board votes on the core-banking integration in nine days. Priya Raman, the IT director, has to answer that line in writing, and she cannot answer it with a shrug about the vendor's region.

Priya asks the AI what runs on her servers: a dedicated dev and production pair, her domain, no other tenant in the queue. She can check it herself, or shut them down.

The circled line on the questionnaire asks about commingling, and what Tray publishes in answer is a location rather than a tenancy: "A Tray instance can be hosted in one of the following Data Regions: US, EU, APAC", priced as "Team (optional add-on per region), Enterprise - all regions available as standard". Across the regional-hosting, on-premise and environment-setup pages we read, dedicated resources appear in one place, and the scope is the connector layer of the on-premise path: "A key benefit of the on-prem agent is that the connector nodes inside the Tray On-Prem Network are dedicated resources and not shared with other users." Reaching that path is an engineering project rather than a setting. Tray documents an agent install on Linux or Windows 64-bit, or AWS Transit Gateway, PrivateLink or VPC peering, or a site-to-site VPN which their own page describes as requiring "opening your firewall to inbound traffic from Tray" with "considerable technical overhead" that "will require the involvement of an engineering team". Their default subnet is fixed and has to be planned around: "Tray uses 10.200.0.0/25 by default. This cannot overlap with your VPC CIDR range." Dev and production separation is an account structure, not a server pair. Workspaces do it for ordinary automation, and for anything customer-facing Tray states: "it is not currently possible to create Solutions in shared workspaces. In order to manage multiple integrations you will need to set up multiple Tray orgs to act as e.g. dev, staging and prod." Each of those orgs is a separate identity boundary for staff, since "A Tray User can access one Organization in a given region per unique email address", with a plus-address modifier as the documented workaround. For the hostname question underneath the commingling question, the browser-facing and webhook addresses stay on domains Tray holds: embedded.tray.io, auth.tray.io and the trayapp.io webhook host, or, de-branded, Tray's wildcarded apexes "prefixed with your company name e.g. acme.integration-configuration.com".

04Broken builds refused before they ship

Structurally invalid work is refused at build time, instead of surfacing later in production logs. On Tray.ai, malformed is refused server-side; wrong is found by firing at the real thing.

Open the scenario

A generated integration that is syntactically fine and semantically wrong reaches production, and nobody knows until customer data is wrong.

04 · A deterministic compiler that refuses structurally invalid work before it exists

The scenarioHalvorsen Mutual: 6,200 hail claims ride on a generated payments integration

Halvorsen Mutual: 6,200 hail claims ride on a generated payments integration

Halvorsen Mutual writes crop insurance for 8,900 farms across Nebraska and Kansas. After a hail week in June, 6,200 claims queue up, average payout $18,400, and the integration that pushes approved amounts into the payments system was generated last month. It compiled cleanly and it deployed cleanly. Dee Ostergaard, the claims supervisor, is the person who learns whether it wrote the approved amount or the estimate into the payment field, and she learns it from farmers on the phone.

The AI's intent passes through a constrained schema; the compiler refuses invalid structures at the door. It then tests the build on a real saved claim and reads what reached the payment field. Dee can open that run too.

Tray does refuse a broken build, and the mechanism is good enough to state in their words rather than ours: "Validation runs in two layers, both server-side: every workflow-mutating call validates the affected steps before anything is written, and a whole-workflow audit checks that jsonpath references resolve, output shapes are correct, and structural conventions hold. The model can't write a malformed workflow." The per-call layer checks just the steps the change touched, which is the right design, and it arrives with Headless, which their pricing page lists under "Included in all plans". The published scope of that guard is structural: "jsonpath resolution, output-shape rules, structural conventions". A payout mapping that resolves cleanly and lands on the wrong field is well formed, so it passes. The check that separates wrong from malformed is a run, and Tray is candid about what a run is on their platform. Their own build-workflow skill states it: "trigger_workflow fires a workflow against the live Tray workspace, not a dry-run, not a sandbox. Each fire executes every step, creates an execution log entry, consumes API quota." Their plugin documentation says the same thing in longer form: "a Slack step posts a real message, a Salesforce step writes a real record, a webhook calls the real endpoint." So after a hail week, the evidence that 6,200 approved amounts are right is obtained by sending some of them and reading the log. On the promotion path there is a preview, "Call POST /core/v1/projects/{projectId}/imports/previews to analyze potential changes before deployment", which compares what a deploy will change rather than what a branch will do. And the log that holds the proof is on a package clock, 7 days on Pro, 7 with a 30-day add-on on Team, 30 on Enterprise, with their limits table listing "How long can logs be re-run for? | 7 days".

05Build a piece once, reuse it everywhere

Ask the AI which integrations use a broken lookup, fix it once, and every one of them inherits the fix, including the ones your team forgot about. On Tray.ai, shared workflows by reference, shared steps by clipboard.

Open the scenario

The same connector logic was being rebuilt per customer, and the copies diverged.

05 · Reusable building blocks: assemblies, modules, subassemblies

The scenarioCardwell Staffing: 60 trusts, 60 drifting copies of one shift lookup

Cardwell Staffing: 60 trusts, 60 drifting copies of one shift lookup

Cardwell Staffing places 2,300 agency nurses a week across 60 NHS trusts, each running its own rostering system. The logic that finds available shifts by ward was built once, then copied into all 60 integrations, and a timezone correction made in February reached 41 of the copies. On a Tuesday morning audit call, a trust liaison asks Marcus Ibe, the RevOps lead, to state which version of that lookup each trust is running today.

Marcus asks the AI which integrations run the shift lookup; it names the referencing assemblies and the automations using them. Built once, fixed once: all 60 trusts inherit it. He can walk the list himself.

Tray has genuine reuse by reference, and it is the mechanism they recommend for exactly the maintenance reason this row is about. Callable workflows are selected by name, and their guidance is direct: "it is highly recommended to use a callable workflow for each processing action. This will enable you to work with a set of simpler parent and child workflows which are easier to understand and maintain than one large sprawling workflow." Fix the callable and every caller gets the fix. Concede that cleanly. The question a sixty-trust rollout runs into is scope rather than mechanism. Tray's own environment guidance keeps the shared unit inside the project: "It is generally advised to make your projects 'self-contained' in that callable workflows and alerting workflows should be part of the project." Serving many customers from one build is the Embedded Solution model instead, and that is a purchase: "The Tray Embedded bundle is available to Enterprise customers as an optional add-on. Please contact your sales representative if you wish to activate the bundle." The other reuse unit Tray ships is a copy, and it is the one people reach for when the shared thing is a configured step rather than a whole workflow. "Snippets are pre-configured single or multiple workflow steps that can be re-used when needed", and the mechanism is the clipboard: "This will copy the snippet to your clipboard and you can then right-click and paste it anywhere in your workflow." Nothing published describes a pasted copy tracking where it came from, copies are independent objects by their own account ("Copying or duplicating a masked step - The copy is a new step and is not masked"), and the instruction before altering shared logic is bookkeeping: "We highly recommend you make a list of all the step dependencies associated before beginning any alterations." Proving the shared piece alone is also asymmetric: "For a fire and wait for response callable workflow, you can only replay from within the calling workflow."

At scale, this means

The asset your company accumulates is a library of inspectable building blocks that any successor can open, not a portfolio of codebases that each had exactly one fluent reader, who has since changed jobs.

Act 2 of 8

Reaching any system, not just catalogued ones.

A connector for an API no catalog lists becomes a library entry here; on Tray one or two endpoints go through the HTTP Client, and their own guide sends "a full set of pre-configured operations" to the CDK as a TypeScript project, since "Creating new connectors in Connector Builder is no longer available" from February 2026.

Connector catalogs are where integration platforms compete in public, and it is the wrong contest. The integration a deal depends on is reliably the one no catalog lists. The real questions are time-to-new-connector, and how deep the connector goes once it exists.

06Connectors built straight from an API's documentation

A niche partner API becomes a working connector in one session, and the renewal survives. Elsewhere it arrives as a Node project, times forty clients. On Tray.ai, past one or two endpoints an uncatalogued API becomes a TypeScript project your team owns.

Open the scenario
2
Capability 06

The integration the deal depended on was never in anyone's catalog, and the catalog vendor had no incentive to add it.

Connectors built from an API's own documentation, exposing every trigger and action the API offers, including private and partner endpoints no catalog lists

The scenario Northgate's largest client renews if a niche partner API integration ships this month.

Northgate's largest client renews if a niche partner API integration ships this month.

Northgate, a systems integrator with forty managed clients. Their largest client runs bookings on a regional platform nobody has heard of outside its niche. The endpoints that matter, membership holds and multi-site transfers, live in the partner API, behind an NDA, in no catalog anywhere. The client's renewal is conditioned on this integration existing within the month.

Swipe to see the whole diagram ON APIANT Partner API docs, NDA'd AI reads docs, builds + live-tests Connector every endpoint, stored as data ON TRAY.AI Same docs connector project (TS) build, publish, maintain
On APIANT
  1. Northgate points the AI at the partner API's documentation and asks for the connector. It reads the docs, works out the authentication scheme, and builds the connection itself.
  2. It scans the API's capability surface and creates the operations that matter, including the NDA'd endpoints no public catalog will ever carry. It tests each one against the live API with data it creates itself, reads the real responses, and corrects itself until they pass.
  3. Or a Northgate engineer builds the same operations by hand in the editor. Either way the connector is the same structured data: inspectable, reusable across all forty clients, serviceable by whoever is on staff in three years. The connector exists in a working session. The renewal conversation changes subject.

The connector exists in a working session. The renewal conversation changes subject.

On Tray.ai

Concede the lighter path before anything else, because Tray publishes it and it is the answer a Tray builder gives: one or two endpoints can go through the HTTP Client with nothing built at all, and their own environment guide draws the boundary, "Custom connectors are generally built when there is no pre-built Tray connector for a third-party service and you wish to build a full set of pre-configured operations in a single connector (i.e. using the HTTP client to access one or two endpoints is not sufficient)."

Custom connectors are generally built when there is no pre-built Tray connector for a third-party service and you wish to build a full set of pre-configured operations in a single connector (i.e. using the HTTP client to access one or two endpoints is not sufficient).Tray docs, Setting up your environment, seen 2026-08-19

Past that boundary the connector is a TypeScript project somebody on your side owns. Tray closed the no-code route: "February, 2026: Creating new connectors in Connector Builder is no longer available." The supported path is their Connector Development Kit, which requires "Node (v18 or higher)" and "Typescript", allows one namespace per organisation, and ends with a grant per email address: "The connector must be shared with your user account before you can use it."

The spec importer is the shortcut, and its own supported and unsupported table says where it stops. On the layer a private or partner API needs: "Unsupported: generation of Auth type; handlers utilising the auth token in handlers." On shape: "Unsupported: enum types; array types; non 2XX response schemas." On format, JSON in and JSON out, with "xml request/response, text request/response, file request/response, form request/response" all unsupported, and "Swagger API version 2 / YAML spec files" refused outright. What the importer hands back is a project you then edit by hand: auth.ts, GlobalConfig.ts, and a handler and a test file per operation, before a CLI deployment and the per-email share.

Speed is not the argument on this row, because Tray uses the same framing we do: their CDK launch post says the path to a connector in production "is measured in hours, not quarters." The argument is the artifact and who carries it afterwards. A connector's later versions do not follow the workflows using it: "When a new connector version is available and you are using it in a workflow, you will need to manually update it yourself. We do not allow automatic version updates because there is a risk that it may break your workflow." And their agent does not widen coverage: Tray Headless publishes connector tools to "search connectors, read an operation's input and output schemas, and call a connector for dynamic field-value lookups and schema discovery", with no connector creation among them.

Built for this, in the live inventory:/build-assemblyassembly toolset · 35 tools
Test 02 name the endpoint, then ask who builds and owns the artifact
07Vendor account signup and secure credential storage

Five integrations clear their vendor portal paperwork in one afternoon, with the credentials landing straight in the vault instead of a spreadsheet. On Tray.ai, registering the app on each vendor's portal stays a manual errand.

Open the scenario
2
Capability 07

Onboarding stalled for days on OAuth paperwork before a single record moved.

The authentication layer, including automated registration of OAuth applications on a vendor's developer portal, and credential vaulting

The scenario Brightline launches five integrations this quarter, each blocked by vendor portal paperwork.

Brightline launches five integrations this quarter, each blocked by vendor portal paperwork.

Brightline, a B2B SaaS company, is launching integrations with five systems this quarter. Each of the five requires Brightline to register an application on that vendor's developer portal first: create the account, fill the forms, describe the use case, set callback URLs, wait, copy the credentials somewhere safe. It is nobody's job, so it becomes the bottleneck for everybody's job.

On APIANT
  1. Brightline asks the AI for the paperwork. It drives a browser on each vendor's developer portal, registers the application, sets the callback, and captures the issued credentials straight into the platform's encrypted vault.
  2. Or Brightline's own admin fills the forms and saves the credentials to that same vault. Either way nothing sits in a spreadsheet, and either of them can list what the vault holds.
  3. The connection layer then picks the right authentication method per API, builds the connection, and verifies it with a live call, tokens refresh themselves, and every end customer authorizes with a click. Five portals, one afternoon.

Five portals, one afternoon, zero credentials in a spreadsheet.

On Tray.ai

The paperwork stays with your team, and Tray does not put a clock on it: "Obtaining OAuth app approval for a third-party service can vary in time and effort. Partner with your Account Team to assess your individual situation." Everything upstream of that approval is yours as well: "In order to create a Custom OAuth app you will have to: 1. Create it in the 3rd-party UI (Salesforce, Mailchimp, Zendesk etc.)", then set the callback to their default and retrieve the client id and secret by hand, per vendor, five times for five launches.

Obtaining OAuth app approval for a third-party service can vary in time and effort. Partner with your Account Team to assess your individual situation.Tray docs, Embedded, preparing your environment, seen 2026-08-20

Storage itself is well developed and should be granted: authentications, service environments, auth slots, an Authentication Collector, and no Tray login for the end customer. The part that resists automation is the creation step, by their own statement: "the only way to create a Custom OAuth app is via the workflow editor", with the consequence they document for a second environment, "So in the destination environment you may need to create a test workflow specifically for this purpose." There is no API alternative published for that step.

Two constraints land in the same week as the forms. Scope research is not answered for you: asked whether the scopes needed per operation are visible, their FAQ says "No, Tray does not provide that information. You will need to investigate with 3rd parties", and what you pick at setup is the ceiling for everyone downstream, since "The scopes that you select when creating this auth will be the scopes that are available for your End Users to choose from." The lighter route has a stated boundary: "You cannot use Generic Service Authentication with complex token-based and Oauth-based authentications."

Built for this, in the live inventory:/register-oauth-appkeyvault tools
Test 02 depth includes the steps before the first API call
08Field mapping reads the customer's live system

An onboarding call maps forty-one custom fields and a dropdown their admin invented, because the connector reads the customer's live tenant. On Tray.ai, the documented default for a real mapping is a hardcoded list from a test run.

Open the scenario
1
Capability 08

Field mappings built against documentation break on contact with a customer who renamed things and added forty custom fields.

Live field discovery against the customer's own tenant: exact field names, types, custom fields, renamed objects, dropdowns populated from their real data

The scenario A 60-store retailer onboards a CRM customized for nine years, forty-one custom fields deep.

A 60-store retailer onboards a CRM customized for nine years, forty-one custom fields deep.

A 60-store outdoor retailer is onboarding onto a loyalty integration. Their CRM has been customized for nine years: forty-one custom fields, two renamed objects, and a "member tier" dropdown whose values exist nowhere in any documentation, because their admin invented them. The mapping screen has to show their CRM, not the CRM in the manual.

On APIANT
  1. the onboarding lead asks the AI to build discovery into the connector, and it does: field discovery that interrogates the customer's own tenant live, dropdowns populated from the customer's real data.
  2. Exact field names and types as they exist today, custom fields included, renamed objects under their real names, so "member tier" offers the five values their admin invented instead of a guess.
  3. Or she maps the forty-one fields herself on that screen.
  4. Either way the values she is choosing from came from the customer's live account, not a static list written months earlier, and the call ends without a single "we'll get back to you."

The onboarding call maps forty-one custom fields without a single "we'll get back to you."

On Tray.ai

Concede the live read before anything else, because it is real. Tray's dynamic dropdowns are calls made with the customer's own credential, and custom fields on a renamed object are reachable where the connector carries the lookup: on Salesforce, "we can choose the 'private_list_object_fields' lookup, which will pull the available fields for the record type chosen." Their agent can drive that surface too. This row does not turn on whether Tray can see a customer's custom fields.

This will require using test runs of the operation you wish to use in order to find out what the exact format of the fields are.Tray docs, Embedded data mapping, seen 2026-08-20

It turns on the other connectors, and Tray sets the bound on the same page: "Note that only certain connectors will have operations like this available." Where the lookup was never authored, their documented default for a real mapping is a list somebody types in after running the operation and reading the log: "This will require using test runs of the operation you wish to use in order to find out what the exact format of the fields are." Automatic schema pickup misses nesting, in their words "this might not get all the fields you need (if the fields are nested) so you may have to hardcode", and the route past that is JavaScript behind a ticket: "If you wish to use Custom JS please contact support to arrange turning on the feature flag."

In front of the retailer's own staff, the edges show. Where discovery falls short the wizard offers free text, "This allows the End User to then manually enter the values they wish", which is the point at which a nine-year-old member-tier value gets typed rather than chosen. The page has a size ceiling as well: "Your solution requires the end user to map 100 fields in the configuration step, 100 fields can't fit in one page of the config wizard", with building your own form the documented answer. And the whole end-user mapping surface sits inside a purchase: "The Tray Embedded bundle is available to Enterprise customers as an optional add-on."

Built for this, in the live inventory:field discovery tools, assembly toolset
Test 01 the customer sees their own system, or they see the manual's
09Every way an API announces a change

Every API gets a vetted way of announcing changes, so records stop going missing or arriving twice. On Tray.ai, overlapping scheduled runs are missed rather than queued.

Open the scenario

Every vendor's API announces change differently, and picking the wrong mechanism means missed or duplicated records.

09 · Six ways a run can start

The scenarioRedwing Freight: nine carrier feeds, 1,400 tenders nightly, trucks double-dispatched

Redwing Freight: nine carrier feeds, 1,400 tenders nightly, trucks double-dispatched

Redwing Freight, a Memphis brokerage, moves 1,400 load tenders a night across nine carrier systems. Each carrier announces change its own way: one fires a webhook on every touch, one exposes a polling endpoint with no updated-at field, one expects a long-lived listener that reconnects on its own. Night dispatcher Dana Whitfield has twice sent two trucks to the same dock because a carrier feed replayed a status it had already sent. She now starts her 10pm shift reconciling the tender log by hand before she dispatches anything.

The AI picks the right pattern per API and builds the trigger, or Dana's team picks it: polling for new records, polling for new-or-updated, manual webhooks, self-registering webhooks, service webhooks with event filtering, long-lived protocol listeners. Six vetted patterns either way, and which one a feed is using is visible on the trigger itself.

Mechanism coverage is not where this row turns, and it is worth saying so plainly. Tray documents service triggers, webhook triggers, scheduled polling with its own "Basic polling" and "Polling with last runtime" pages, and an event subscription model with delivery retries: "Tray will retry the delivery of those events with exponential backoff. Thus, you will not be losing any events even if your endpoint is rate-limited." A carrier that fires a webhook on every touch and a carrier with no updated-at field both have a documented pattern. The cost sits in the published ceilings around those patterns. Their limits table gives "Data that can be consumed by our Webhook Trigger | 1 MB", with file content going as multipart against "an overall limit of 10MB". A burst is rejected rather than absorbed: "If too many requests (i.e. several hundred per second) come in to your webhook trigger at once, Tray.io will respond with an HTTP 429 (too many requests) error." And a polling run that overruns its own interval loses the work behind it: "In a case where 3 attempts at starting a run are made while one is still completing, these runs are missed. They are not added to a queue." Two smaller taxes are worth knowing before a nine-system build. Filtering at the trigger does not save you the run: on events discarded by a connector-level filter, "Since all of the above events were processed by Tray, these will be billed." And proving a dedicated trigger means substituting it: "If you are using a dedicated Tray Service trigger then you will need to temporarily swap it out for a Webhook trigger."

6 trigger skills

10Any modern API call, still readable

Ask the AI for an inference or a price calculation and it arrives as a step your team can open and check. On Tray.ai, the call outside the operation list is hand-assembled and untyped until you fire it.

Open the scenario

Create-read-update-delete alone cannot express what modern APIs do.

10 · Seven action primitives, including calls that return computed or generated data

The scenarioHalvard Mutual: two claim-intake steps the company cannot itself explain

Halvard Mutual: two claim-intake steps the company cannot itself explain

Halvard Mutual, a regional auto insurer in Ohio, takes 3,000 first-notice-of-loss claims a month. Two steps in intake are neither reads nor writes: a photo-damage model that returns a repair figure, and a third-party fraud score. Both sit inside a code block written by a contractor who left in March, so claims supervisor Renata Ozols cannot see what either step does without raising a ticket with an outside firm. Her adjusters are quoting repair numbers the company cannot itself account for.

Ask the AI for the fraud score and it builds the call as an invoke action, the primitive for operations that compute, transform, or generate. Or Renata's team builds it. Add, delete, find, get, list, update, and invoke: seven primitives, and either way the step opens as data rather than as a contractor's code block.

Tray reaches an RPC-style endpoint, and their generic step is unconditional about it: "The HTTP client connector allows you to make calls to any third-party API endpoints." Recent connectors ship a "Raw HTTP Request" operation for the same purpose. A damage-model call and a fraud-score call are both reachable. What that step gives up is published on the same page. The request is assembled by hand from the vendor's documentation: "In this case we have had to use the Airtable API documentation to find the URL of the endpoint we wish to access. We have also had to set an Authorization Header using the $.auth.api_key jsonpath." The response arrives untyped: "Parse response - Automatically generated as a string, this can be changed to make the response JSON or XML etc." The output schema does not exist until a real call has fired, since "The Output tab should update with new schema" is step five of their quickstart, after "Test the workflow". Paging is yours to build against a ceiling: "Tray has a page limit of 1 MB." Retry semantics are the part that bites on a scoring or inference call that rate-limits, because the failure does not present as a failure: "the 429 response will be contained within a Tray 200 response." Connector retry policy fires on an error, so a wrapped 429 gets none of it, and their guidance is to write the backoff yourself: "watch for 429 status codes within the response body and build in a retry mechanism." The waiting room is generous by comparison, "How long does the HTTP Client (Universal Connector) wait for a response? | 15 mins" against 45 seconds for a standard connector step, so a long inference call fits; it simply arrives as a string somebody has to type by hand.

7 action skills

11Vendor rate limits enforced across every account

Ask the AI to set the vendor's limit, or type it once yourself, and every account sharing that API queues against one 185-calls-per-10-seconds budget. On Tray.ai, throttling is a delay step you place in every workflow that shares the budget.

Open the scenario

A vendor's rate limit is the real constraint on a multi-location sync, and hitting it corrupts a run.

11 · Throttling at three levels: connector, action, and connection

The scenarioAlder Pharmacy: 310 branches, one shared rate limit, 2:40am pages

Alder Pharmacy: 310 branches, one shared rate limit, 2:40am pages

Alder Pharmacy Group dispenses across 310 branches in the north of England, every one of them syncing to a single supplier API that allows 120 calls per 10 seconds. Fourteen other automations draw on that same budget, and the arithmetic that keeps them inside it lives in one engineer's head. IT director Sunil Bhatt has been paged three times this month at 2:40am because a rate-limit rejection killed the nightly refill batch partway through, leaving branch queues short of data by the 8am opening.

Tell the AI the vendor's published limit and it sets the throttle, at connector, action, or connection level, or Sunil types it once himself. Either way the platform enforces it across every automation and every account touching that API, with queueing and backoff, and either of them can read the current setting back. One deployment runs 232 locations against a single 185-calls-per-10-seconds budget.

Fourteen automations drawing on one vendor's budget of 120 calls per ten seconds is arithmetic Tray leaves with you, in every workflow that touches that API. Their third-party rate-limiting page is direct about it: "If you are exceeding the rate limits of a 3rd Party you will either need to implement one of the above solutions, or you will need to arrange for your rate limits to be increased with the 3rd party." The solutions above that line are steps a builder places by hand: "adding a 1 minute delay between calls", "If implementing pagination you may need to set up an exponential backoff", and "A basic technique for integrations to gracefully handle limiting is to watch for 429 status codes within the response body and build in a retry mechanism." Their batching guidance repeats it: "you might need to make use of the delay connector to set e.g. a 10 second delay between batches." Why you watch for the 429 yourself is also published. A third-party rate-limit response does not reach Tray as a failure: "the 429 response will be contained within a Tray 200 response", so the connector retry policy, documented as "Retry 3 times every 40 seconds", does not fire on it, and the backoff is yours to write and to keep consistent across every workflow sharing that vendor. What Tray publishes as a throttle control governs the APIs they expose rather than a vendor's budget: "when creating an accept policy, you can set rate limits in the 'Throttle request' section at the bottom of the page." Their own platform ceilings are published at 30 requests per second and 1800 per minute, and workflow concurrency is set centrally: "Please contact support if you wish to increase concurrency." Across the pages we read, their Tray and third-party rate-limiting troubleshooting pages, the batching and queueing pages, technical limits, and usage and billing, nothing describes a shared budget per vendor connection enforced across several automations or child accounts.

At scale, this means

Time-to-new-connector is measured in working sessions, not sprints, and every connector you add, however obscure the API, joins the same inspectable library instead of adding one more codebase to the pile someone must maintain.

Act 3 of 8

Expressing business logic that survives the real world.

Fan-in completion and loop suppression are platform behaviour here; Tray's workflow-threads page has you count threads with atomic increment inside a 400 KB limit per thread, and their data synchronisation page has you build the echo guard from a field list you keep current in both directions.

Field-to-field mapping is the demo. The business is nested rules, parallel work, digests, approvals, waits, and the awkward requirement that makes your operation yours. The question for any platform: does that logic fit inside the model, where it stays visible and testable, or does it spill into code and patterns your team hand-builds?

12Run hundreds in parallel, know when all finished

214 stores get overnight prices in minutes, and the 6am report fires once. On Tray.ai, fan-in is a counter you build and a timeout you remember to add.

Open the scenario
3
Capability 12

Processing two hundred locations in series took hours. In parallel, nothing knew when all of them had finished.

Latches: parallel fan-out with a real fan-in

Launch N child runs in parallel, and the platform itself knows when the last one completes, so the "everything is done, now reconcile" step is a primitive, not a science project.

The scenario A 214-store chain updates overnight prices; the 6am report must cover every store.

A 214-store chain updates overnight prices; the 6am report must cover every store.

A 214-location convenience chain pushes overnight price updates. Every store must be updated in parallel (serially it takes past opening), and when the last store finishes, one reconciliation report must go to the merchandising director, listing any store that failed. The hard part was never the fan-out. It is knowing, reliably, that all 214 are done.

Swipe to see the whole diagram ON APIANT Parent run Store 001 Store 002 … Store 214 Latch 214 / 214 Reconcile ON TRAY.AI Fire threads async Poll the counter Persist results a polling loop your team designs and owns atomic increment counter, 400 KB per thread
On APIANT
  1. She asks for the overnight push with one report at the end, and the AI builds it: a parent that fans out 214 child runs, one per store with that store's settings, and a wait step held by a latch. Or she assembles the same pattern herself and reads it back in the flow.
  2. Either way the latch is a platform primitive: each child checks in and out of a shared counter, the wait step watches that counter until it empties, and the interval and the race conditions are the platform's to get right rather than coordination logic your team writes, tests and maintains per integration. When the last of the 214 checks out, the latch releases and the reconciliation step runs exactly once, with every store's result in hand.
  3. Prices land in minutes, the report is on the director's desk at 6am, and your team wrote no coordination logic.

Prices land in minutes, the report is on the director's desk at 6am, and nobody wrote coordination logic.

On Tray.ai

Pushing 214 stores in parallel is straightforward on Tray. Knowing that the last one finished is a counter you assemble and then look after. Their threading page frames the whole thing as a pattern the builder puts together: "Threading basically involves dividing your data into batches to send them to a callable workflow for processing, and setting up a system to wait until the number of threads finished is equal to the number of threads started." The recipe is named part by part: "Using account-level data storage and the 'atomic increment' operation to set up a system which counts the number of threads running and identifies when they are all complete", a polling loop where "it will delay for 5 seconds before checking again", and a guard Tray tells you to add yourself: "Note that, in a production setup you will also need to include a check for how long the workflow has been running, in case any threads have processing errors."

Using account-level data storage and the 'atomic increment' operation to set up a system which counts the number of threads running and identifies when they are all completeTray.ai docs, Workflow threads

The ceiling on that pattern is published in the same worked example: "The overall processing limit for this example is 6MB of data (each thread has a limit of 400KB)", with "Some testing may be required to determine the batch size that will not overload the 400KB limit in each of the sub-processing workflows." So an overnight price file has to be cut to fit a 400 KB per-thread budget, and the reconciliation report that goes out when the last store finishes depends on the counter, the poll and the hand-added timeout all holding.

Two further published details matter for a nightly job. Overlapping schedules are dropped rather than queued: "In a case where 3 attempts at starting a run are made while one is still completing, these runs are missed. They are not added to a queue." And a Project Queue connector shipped in January 2026 (add messages to the queue, add multiple messages in batch, clean the queue), which adds queueing; the pages we read pair it with no completion detection, so the fan-in stays the counter.

Built for this, in the live inventory:pattern-latches
Test 03 hand-built coordination is where 2am pages come from
13Two-way sync without the runaway update loop

Contact changes flow both ways on day one, without the overnight loop that rewrites one record 4,000 times. On Tray.ai, the echo guard is a field list somebody keeps current in both directions.

Open the scenario
3
Capability 13

Two systems updating each other trigger each other, forever.

Two-way sync with loop prevention as a first-class primitive

The scenario 22 physio clinics sync patient details both ways; a loop rate-limits every clinic.

22 physio clinics sync patient details both ways; a loop rate-limits every clinic.

Arrowe Physio, 22 clinics. Patient contact details must stay identical in the practice-management system and the marketing CRM, editable from either side. The failure mode is famous: the CRM update fires a webhook, the integration writes to practice management, which fires its webhook, which writes to the CRM, which fires again. By morning one patient record has been "updated" four thousand times and both APIs have rate-limited the clinic.

On APIANT
  1. The clinic asks for contact details to match in both directions, and the AI builds the sync from the two-way pattern with echo suppression on by default: the platform recognizes changes the integration itself wrote and declines to bounce them back. It then tests the pair by pushing a change from each side and verifying no echo returns.
  2. Or the practice's own admin builds it from that same pattern. Either way the suppression rule and the conflict handling (both sides changed the same field) are visible, configurable nodes rather than folklore.
  3. The sync runs both directions on day one, and "infinite loop" is not in the runbook.

The sync runs both directions on day one, and "infinite loop" is not in the runbook.

On Tray.ai

Tray names this failure mode themselves and then hands you the guard. From their data-synchronisation page: "In this way, the workflows will trigger each other and sync the data for both services. While doing so, they may end up in an infinite loop, where they would continue to trigger each other. To avoid this, we use a method of payload comparison, which compares the new data received through trigger with the existing data."

they may end up in an infinite loop, where they would continue to trigger each other. To avoid this, we use a method of payload comparison, which compares the new data received through trigger with the existing data.Tray.ai docs, Data synchronisation

The guard is assembled from steps. "We use the Object Helpers 'Add key/value pairs' operation to build these payloads and include the fields we want to compare", then an Equals comparison decides whether to write. It also needs a custom identifier written into each third-party system so each side can find its counterpart record, and Tray leaves that with you: "Exactly how you create a custom field will depend on the service you are using." Because the comparison covers the fields the builder chose to include, adding a field to the sync later means remembering to add it to the comparison as well, in both directions, for as long as the integration lives.

Worth reading beside their per-integration marketing, which sells the same capability as configuration: their Salesforce page offers "Bi-Directional Salesforce and Marketing Automation Sync" and says you can "build Salesforce integrations and automations that keep your CRM accurate ... no custom code required." Both statements are Tray's, and what sits between them is the field list somebody keeps current.

Built for this, in the live inventory:assembly-bidirectional-sync/test-integration
Test 03 a naming convention is what stands between you and 4,000 writes
14One daily digest instead of hundreds of alerts

Customers get one 5pm summary instead of 400 pings, and nothing is lost when two runs land at once. On Tray.ai, the digest is a workflow that writes into a store and a schedule that drains it.

Open the scenario

Customers wanted one daily digest, not four hundred notifications.

17 · Collector: aggregate items into named buckets across many runs, drained on a schedule

The scenarioKestrel Freight: 400 daily alerts, two big shippers asking to be unsubscribed

Kestrel Freight: 400 daily alerts, two big shippers asking to be unsubscribed

Kestrel Freight Brokerage moves 380 loads a day for 60 shippers out of Memphis, and every pickup, delay, and delivery event pings the shipper's contact. Two of its largest accounts asked to be removed from notifications entirely after one Tuesday produced roughly 400 emails. What they actually want is a single summary at 5pm listing every load and its status. The dispatch operations manager has been assembling that digest by hand each afternoon since March, and she is away next week.

The operations manager asks for one 5pm summary and the AI builds the collector: events drop into a named bucket all day, drained on the schedule. She can build the same bucket herself. It is a dedicated primitive, safe when two runs land at once.

Turning four hundred notifications into one daily digest means holding a day of events somewhere and draining them on a schedule. On Tray that store is the Data Storage connector, and its ceiling is published: "Storage limit under single key | 400 KB", with a "Nested depth limit | 32" and scopes that decide how long an accumulation survives ("Workflow scope: until deletion of the workflow", "Account scope: until deletion of the workspace", and current-run data held "30 days from execution"). A day of pickup, delay and delivery events for sixty shippers has to fit inside a 400 KB key, or be split across keys somebody has to name and reconcile. Their queueing page opens with a caution rather than a primitive: "Please be aware that building a queue may not be appropriate for your requirements." And where the digest has to be per end customer inside a customer-facing solution, their newer store is ruled out: "The current version of data tables cannot be accessed from within an end-user solution instance." The pages we read on this (queueing, chunking and batching, data tables, storing and retrieving data, and workflow alerting) present batching, queueing and storage as patterns to assemble and name no digest or aggregation primitive. So the shape of the answer on Tray is a workflow that writes into a key, a schedule that drains it, a per-recipient split, and a 400 KB budget to stay inside.

pattern-collector

15Pause a job for days, resume automatically

A three-day follow-up needs one system, not a separate scheduler for somebody to own. On Tray.ai, a multi-day wait that resumes itself is not a documented platform behaviour.

Open the scenario

"Follow up in three days" required an external scheduler and a second system to maintain.

18 · Snooze: pause a run until a future moment

The scenarioTallgrass Mutual: three-day claim follow-ups riding on an unowned external scheduler

Tallgrass Mutual: three-day claim follow-ups riding on an unowned external scheduler

Tallgrass Mutual handles 6,200 auto claims a month in Iowa, and about one in five stalls waiting on a document from the insured. State rules put a clock on the claims supervisor: if the adjuster has not followed up within three days, the file ages into a regulatory bucket that carries a penalty. That three-day wait currently lives in an external scheduler a contractor built in 2023, which the present team cannot modify. It missed 34 follow-ups last quarter, and the audit is in November.

Ask the AI to hold the file for three days and it adds the snooze step; the supervisor can add that step herself. The run suspends for three days, or until next quarter, and resumes with its state intact. One system, one place to look.

A claim that stalls for three days and then picks itself back up is either something the platform does or a second system your team runs and monitors. Tray.ai does not document this. We searched their technical limits table, the batching and queueing pages, the polling-for-new-data pages, calling other workflows, the workflow-settings pages and the help bundle, and searched the full platform and developer documentation bundles for "snooze", which returns nothing. On that basis it is manual work rather than a platform behaviour. Two published mechanisms sit near it without being it. A Delay connector, which their docs use for short waits ("you might need to make use of the delay connector to set e.g. a 10 second delay between batches"). And the Fire and Wait for Response operation on the Callable response connector, which their limits table says has no timeout, "as a workflow could take a long time to complete". The second is a run held open for days rather than a job put down and picked up, which is a different thing to operate and a different thing to bill. The same limits page bounds whatever state such a wait would carry: data under Current Run scope is held "30 days from execution". The evidence you would need to prove what happened during the wait expires sooner, at 7 days of log retention on Pro and Team and 30 on Enterprise.

pattern-snooze

16Hold a record for human approval

Refunds over $500 wait for a manager's approval while everything else keeps moving. On Tray.ai, the documented approval gate is Agent Gateway's, on a paid agent add-on; anything else is a workflow you build.

Open the scenario

Some records must not sync until a person says yes, and the wait cannot block the platform.

19 · Human approval gates with a moderation queue

The scenarioRowan Box Office: £500-plus refunds stuck in a support inbox before a storm

Rowan Box Office: £500-plus refunds stuck in a support inbox before a storm

Rowan Box Office sells 1.2 million tickets a year for 90 regional venues, and refunds flow straight through to the payment processor and the venue ledger. After a cancelled festival produced £48,000 of refunds in one night, finance set a rule: anything over £500 needs a venue manager's yes before it moves. The head of support now parks those requests in a shared inbox and chases approvals by text, while every small refund queues behind them. Friday is a sold-out arena show with a weather warning on it.

Ask the AI for a gate above $500 and it adds the moderation step; the head of support can add it herself. The run pauses on a queue, a person approves or denies from a link, and the run resumes. Everything smaller keeps flowing.

Tray documents human approval, and that should be granted plainly. Their Agent Gateway pages list "Governance - Human-in-the-loop approvals, audit logging, security controls" and "Human-in-the-Loop Approval ... Request approval", and their tool comparison table marks "Requires approval" as available on workflow tools where connector tools have it unchecked. Their intelligent-automations page names "Human-in-the-loop approval workflows" as well. The cost is where that control lives and what it gates. The documented gate is Agent Gateway's, which their pricing page sells under the "Agent Development" add-on and which their staff switch on: "Agent Gateway access must be enabled at the organization level. Contact your Customer Success representative." What it approves is an agent's call to a tool. A refund parked until finance releases it is a different object: a record held outside the run, with a reviewer's link, a retention window, and an audit of who released it. For that second case the pages we read (Agent Gateway workflow tools and connector tools, intelligent automations, workflow settings, error handling, the advanced use cases and the help bundle) describe approval as a workflow you build. The parking, the link, how long a held record survives, and what happens to it when the reviewer does not click are design decisions that land on your team rather than settings you pick.

pattern-human-moderation

17Break big processes into testable pieces

Change one step of a fifty-step process without re-testing the other forty-nine. On Tray.ai, a step tested alone keeps no log of what it did.

Open the scenario

One monolithic automation became unmaintainable and untestable.

20 · Parent and child automation chaining with parameter passing

The scenarioVosdal Precision: 64 untestable steps, and an 18-percent customer needs a branch

Vosdal Precision: 64 untestable steps, and an 18-percent customer needs a branch

Vosdal Precision, a contract manufacturer with three plants in Ontario, runs order-to-cash through a single automation that has grown to 64 steps: quote, credit check, works order, shop-floor release, shipment, invoice. Any change to the credit-check rules means retesting all 64, so the applications manager tests none of it and edits at 5am on Sundays. Two plants now need a different shop-floor release rule, which puts a branch inside a branch that is already three deep. The customer asking for it is 18 percent of revenue.

The AI splits the 64 steps into small automations that call each other with parameters, or the applications manager does the split himself. Either way each piece tests alone, so a credit-check change retests one piece instead of all 64.

Splitting a 64-step order-to-cash flow into pieces is documented and recommended on Tray, for the same reason we recommend it: "it is highly recommended to use a callable workflow for each processing action. This will enable you to work with a set of simpler 'parent and child' workflows which are easier to understand and maintain than one large sprawling workflow." Concede that. What is thinner is proving one of those pieces without running the rest. Their isolation feature "allows users to isolate and test individual steps within a workflow", and their own bullets bound it: "This functionality is designed for running individual steps and does not execute full workflows or multi-step processes", "this feature is not intended for end-to-end integration testing", and "Testing a step within a workflow that could affect a third-party system will have a real impact". Anything holding state is excluded: "the data storage step with a scope of 'current run' cannot be used in isolation." Two consequences land on the person changing the credit-check logic. The evidence disappears: "No logs are retained for test runs. Exercise caution, especially when testing with production systems, as there will be no record of your actions." And the attempt is metered: "Each time you run a step in isolation it is billed as a single task." So the way to exercise the credit-check branch with its neighbours intact is to fire the workflow, which their own documentation describes as running every step against whatever it is wired to.

pattern-execute-automation

18Turn a mapping spreadsheet into working mappings

A customer's 300-row mapping sheet becomes the configuration directly, with unresolved rows flagged, instead of a week of error-prone typing. On Tray.ai, no spreadsheet import is documented for workflow mappings.

Open the scenario

A customer's mapping requirements arrived as a 300-row spreadsheet, and hand-entering it was a week of error-prone work.

21 · Field mappings imported from a spreadsheet

The scenarioHarrowgate Press: 300 mapping rows to key in before October renewals

Harrowgate Press: 300 mapping rows to key in before October renewals

Harrowgate Press is migrating 210,000 magazine subscribers off a 1990s circulation system onto a new CRM, and the vendor delivered the field map as a 300-row spreadsheet: expiry codes, agent sources, gift-recipient flags, six renewal statuses that each mean something slightly different. The circulation director has one implementation consultant for four weeks, and hand-keying 300 rows into a mapping screen eats most of week one. Every keying slip surfaces later as a subscriber who stops receiving the magazine or gets billed twice. Renewal season opens on 1 October.

Hand the AI the 300-row file and it becomes the mapping directly: the AI reads it, applies it, and flags the rows that do not resolve. The consultant can key a row herself, or correct one the AI flagged, on the same screen.

Three hundred rows of expiry codes, agent sources, gift flags and renewal statuses have to get from the vendor's spreadsheet into the platform, and every row is a chance to transpose something. Tray.ai does not document this. We searched all seven Embedded data-mapping pages, the config slots page, managing CSV files, all nine mapping-data pages and the Embedded delivery-method pages. On that basis it is manual work rather than a platform behaviour. What is published is a programmatic route into an end customer's configuration rather than into a workflow's mappings: config data can be supplied on the end user's behalf as a configValues array passed with the upgradeSolutionInstance mutation. That is a script written against their GraphQL API, owned and maintained by whoever wrote it, and it moves values into slots that already exist rather than creating the mappings. Their own pages name the ceiling a 300-row map runs into: "Your solution requires the end user to map 100 fields in the configuration step, 100 fields can't fit in one page of the config wizard", with the recommended answer being to "build your own form experience, leveraging our API's". That whole surface is part of the Embedded bundle, which is "available to Enterprise customers as an optional add-on".

pattern-csv-mapping

19Institutional memory that outlasts your engineers

Turnover stops costing you the same debugging twice: a quirk solved once stays solved after its author leaves. On Tray.ai, the reusable step is a clipboard copy with no link back to the snippet.

Open the scenario

The same API quirk was rediscovered every time, by whoever drew the short straw.

22 · A pattern library that persists institutional memory

The scenarioCedarline Credit Union: nine years of API knowledge leaving in three weeks

Cedarline Credit Union: nine years of API knowledge leaving in three weeks

Cedarline Credit Union serves 74,000 members in Alberta with a four-person integration team, and every project rediscovers the same two things: the core banking API reports posting timestamps in local time with nothing marking the zone, and the loan-status enum needs a lookup table that exists in one engineer's head. That engineer has been there nine years and has given notice. The IT director counted 11 live integrations resting on knowledge that was never written down. His replacement starts in three weeks.

The AI writes each solved quirk into a searchable library and checks that library before it builds anything, so the timestamp-zone trap is solved once, ever. Your engineers read and write the same library, which is what keeps the knowledge after its author leaves.

The two facts a four-person team rediscovers on every project, the API that reports timestamps with no zone and the field that silently truncates, have to live somewhere the next person finds them. On Tray the unit for a configured step is a snippet, and the mechanism is the clipboard: "When using the build interface you can save single or multiple workflow steps as 'snippets' to be re-used in any of your workflows", and "This will copy the snippet to your clipboard and you can then right-click and paste it anywhere in your workflow." Pasted copies are independent objects, which their log-masking page shows in passing: "Copying or duplicating a masked step - The copy is a new step and is not masked." So a correction to the snippet reaches the next paste and not the copies already sitting in the automations built last year, which is how two versions of the same hard-won fix end up in production. Their machine-readable memory is real and worth conceding: the tray-gotchas skill is a "Debugging guide for known edge cases and tricky surfaces" and tray-patterns covers "Workflow structure patterns". Those files are Tray's own, shipped as reference files in their public plugin repository, so what an assistant reads back next session is Tray's accumulated knowledge of Tray. Across the four Tray Headless pages, snippets, workflow documentation and the two augmented-development pages we read, nothing describes a store your own team writes to and the assistant reads on a later session.

patterns toolset · 3 tools

20Custom code as exception, not foundation

A genuinely odd requirement ships without waiting on a vendor release, and everything around it stays readable. On Tray.ai, the escape hatch for a wizard dropdown needs a support ticket to switch on.

Open the scenario

Occasionally a requirement is genuinely outside any data model, and waiting for a platform release is not an answer.

23 · A server-side scripting escape hatch

The scenarioRedbank Falls: a 1987 check-digit rule blocking a 30 September council deadline

Redbank Falls: a 1987 check-digit rule blocking a 30 September council deadline

Redbank Falls, population 88,000, is connecting its new permits portal to a 1987 mainframe that still holds property records, and that mainframe accepts fixed-width records ending in a check digit computed by a rule written out in a retired clerk's ring binder. Nothing in any mapping tool expresses it. The city's systems analyst has a council deadline of 30 September for online permit applications and a vendor quote of $140,000 to build a middleware layer for this one field. He is not going to get a platform release that adds a 1987 check-digit function.

Give the AI the ring-binder rule and it writes the check-digit logic into one script node and compiles it; the analyst can write that node himself. Either way code is an optional leaf inside a data document, never the foundation, and everything around it stays visible, testable and machine-editable.

Occasional code on Tray is not that occasional. The three jobs that most often reach for it are an operation the catalog does not carry, end-user field mapping, and a dropdown in a customer-facing config wizard. Of those three, one needs a support ticket to switch on and one needs the Embedded bundle. Field mapping is the clearest case. Tray's Embedded data-mapping introduction states the mapping itself is built as code: "This is done by making a Script connector-based workflow which maps the fields in the original service to the correct fields in the destination service." Where a wizard needs a dynamic list their connectors do not supply, the documented answer is Custom JS, behind a request: "If you wish to use Custom JS please contact support to arrange turning on the feature flag." The lighter surfaces are bounded or sold separately. Inline functions return scalars, with "Supported return types include: string (default), number, boolean." The SQL Transformer is offered explicitly as a replacement for code, "Instead of building complex, multi-step data-shaping logic using loops, list helpers, and script steps, you can now use a single SQL query", and it is gated on a conversation: "If you're interested in using this feature, please reach out to your Customer Success Manager or Account Executive." A missing operation, meanwhile, is not an exception at all but the CDK route past one or two endpoints, a TypeScript project on Node 18 with one namespace per organisation and a Jest test per operation, owned by whoever wrote it.

At scale, this means

Logic complexity does not convert into code ownership. The awkward rules that make your business yours stay inside a model that your people can read, your tests can cover, and your AI can safely change.

Act 4 of 8

Proving it before a customer ever sees it.

Branches get proven on real data before deploy here; Tray's validation is structural, and their own build-workflow skill says a fire hits "the live Tray workspace, not a dry-run, not a sandbox", where "a Slack step posts a real message, a Salesforce step writes a real record".

"It worked when I tried it" tests one path out of eleven. The other ten are where customers live. This act is the answer to the third standing test: when the AI, or a person, gets something wrong, what in the architecture catches it before production data does?

21Force a rare path to run on demand

Prove a path that fires once a year works today, not in nine months. On Tray.ai, reaching that branch means a sandbox tenant or a hand-assembled payload.

Open the scenario
3
Capability 21 · Patent pending

The branch nobody could trigger on demand was the branch that broke.

Execution-state mutation: change a saved run's data and re-execute from any step, forcing the path that only happens for one customer in December

The scenario United Harvest, 90 food banks: proving a December donation path works in March.

United Harvest, 90 food banks: proving a December donation path works in March.

United Harvest, a federation of 90 food banks. Their donation pipeline has a branch that fires only for tribute gifts carrying a matching-gift employer code, which in practice happens in the last week of December. It is March. The integration was just modified. The question: how do you prove the December branch still works, in March, without waiting nine months or faking an entire donation flow end to end?

Swipe to see the whole diagram ON APIANT Saved real run ordinary gift Mutate state + employer code December branch ✓ ordinary branch Re-execute from any step. The untaken path runs today, on real data, in March. ON TRAY.AI Replay original payload only untaken, untested same path again
On APIANT
  1. She asks the AI to prove the December branch. It takes a saved test run, every step's real data captured from real records, mutates its state to mark a tribute gift with a matching-gift employer code, and re-executes from the step before the branch.
  2. The platform can do this because an execution is a structured document, definition and runtime state together. She can make the same edit and re-run it in the editor, and either way the run is there to read step by step afterwards.
  3. The AI works through every branch the automation still reports as unexercised, which is how a freshly modified integration proves all its paths before deploy. The December branch is tested by lunch, in March, on data that is real in every respect except the two fields changed.

The branch that used to be tested by December is tested by lunch.

On Tray.ai

Getting a rare branch to run when you need it, rather than in the last week of December, is work you arrange yourself on Tray. Tray.ai does not document this. We searched their testing and debugging pages on working with test data, debug logs and the execution kill switch, their building-workflows development tips, the conditional-logic page under branching and looping, and the connector tester and operations explorer under developer tools. On that basis it is manual work rather than a platform behaviour.

What their testing guidance does publish is four routes, and each one leans on something outside the platform: "If available, make use of the ability to send test webhook payloads from the 3rd party Service"; "If you have a sandbox account for the 3rd party service, fill it with test data and add / edit / move records in a way that will trigger the webhook conditions"; "an alternative option is to use a REST API client such as Postman or Thunderclient for VSCode to send a dummy payload to the webhook url of your workflow"; and pasting a payload into the Object Helpers JSON parse step. The Postman route also meets a published ceiling, since data consumed by the webhook trigger is capped at 1 MB.

Two of those routes change the workflow before they test it. Tray states the trigger swap plainly: "If you are using a dedicated Tray Service trigger then you will need to temporarily swap it out for a Webhook trigger." And the paste route leaves cleanup: "This method is not ideal as, once you have completed testing, you will have to replace the `$.object-helpers-1.result` jsonpaths with the appropriate service jsonpaths e.g. `$.salesforce-1` or `$.hubspot-1`." The nearest steering control, the Terminate connector, truncates a run rather than directing it: "we temporarily add a terminate step after the last Jira step."

Test 03 their documented replay takes one argument: the execution ID

The AI tests every branch before it ships. Not the branches somebody thought to write payloads for. Every branch.

22Know which customers a shared fix touches

Ship a one-line fix across 300 accounts knowing exactly which customers it touches. On Tray.ai, the preview reports instance impact and the upgrade is still a loop you write, one instance per call.

Open the scenario
1
Capability 22

A one-line connector fix silently changed behaviour for three hundred accounts.

Blast-radius analysis before touching a shared building block: which automations, and which customers, depend on this

The scenario Beacon, 300 live accounts: a one-line date fix that could break customers.

Beacon, 300 live accounts: a one-line date fix that could break customers.

Beacon, a B2B SaaS vendor with 300 customer accounts live. A date-format bug is found in a shared connector operation. The fix is one line. The question that separates a routine Tuesday from an incident: which automations call this operation, on which customers' accounts, and which of them are relying on the buggy behaviour without knowing it?

On APIANT
  1. She asks which automations use the block, or looks it up herself. One call returns the assemblies that reference it, a second the automations built on those, a third the child accounts running them, all inside the permissions of whoever asked.
  2. Because every layer is data, blast radius is a lookup rather than an investigation. The AI applies the one-line fix to the single node it concerns, retests the affected automations against saved runs, then publishes and deploys to the accounts on that list.
  3. The deploy returns its plan before it writes, and the version it replaces stays on the shelf to redeploy if the fix was wrong. The fix ships with a printed list of everyone it touches, known before the edit rather than after it.

The one-line fix ships with a printed list of everyone it touches, so the dependents are known before the edit rather than after it.

On Tray.ai

Tray has real impact analysis and it has to be conceded before the gap is named. Since July 2026, "You can now open an information page for any authentication to see the workflows that depend on it, so you can check what will be affected before you update or delete it", Embedded slots reach step level ("You can now see exactly which workflows and steps each slot is used in"), and the deployment path has pre-flight previews: "Call POST /core/v1/solutions/{solutionId}/releases/previews to analyze potential changes and solution instances impact before publishing." That preview reaches instance level, and their change-management page also documents filtering instances "by the owner, original solutionId, or both". Concede all of it.

It is the affected connectors and their relative jsonpaths which will need to be checked and tested. We highly recommend you make a list of all the step dependencies associated before beginning any alterations.Tray connector versions documentation, seen 2026-08-20

What the preview tells you and what the platform then does for you are different things. The upgrade after it is still one instance at a time: "Query all the instances of the solution using Get Solution Instances" then "Loop and upgrade each one using the upgradeSolutionInstance mutation", a mutation that takes a single solutionInstanceId with no batch form published, and the sequence ends on the customer's side, "Notify the end users of these instances to run the config wizard." All of that sits inside Embedded, which is "available to Enterprise customers as an optional add-on."

The connector question is the one with no published query behind it. For a connector operation, Tray's own instruction before you change anything is bookkeeping by hand: "It is the affected connectors and their relative jsonpaths which will need to be checked and tested. We highly recommend you make a list of all the step dependencies associated before beginning any alterations." Adoption is then per workflow and deliberately manual, "you will need to manually update it yourself. We do not allow automatic version updates because there is a risk that it may break your workflow", and there is no watchlist to lean on: "it is currently not possible to subscribe to updates for a particular connector."

Built for this, in the live inventory:asm_find_referencers, assembly toolset
Test 01 "who depends on this" should be an answer, not an archaeology project
23Measured proof every path was tested

You know a change is fully tested because the platform counts untested paths, not because someone felt confident. On Tray.ai, tracking which branches have been exercised is manual work, not a documented platform behaviour.

Open the scenario

"It worked when I tried it" tested one path out of eleven.

26 · Branch-coverage test points

The scenarioHalden Mutual ships a claim-intake change with ten of eleven branches unwalked

Halden Mutual ships a claim-intake change with ten of eleven branches unwalked

Halden Mutual writes crop insurance for 6,800 farms across three Midwestern states. Their claim-intake automation has eleven branches: hail, frost, flood, partial loss, reinspection, denial appeal, and five more that fire a handful of times each season. Claims supervisor Dana Whitlock signed off on a mapping change in August because the hail path ran clean in the test. Harvest starts in five weeks and ten of those branches have never been walked since the change.

She asks whether the change is fully tested, and the AI answers from the branch test points the platform tracks, then walks the ones still unexercised. She can read the same list herself. Coverage is measured, not assumed.

Tray.ai does not document this. We searched the whole platform, developer and help documentation bundles for coverage, untested and paths tested, plus the Insights page under enterprise core, all four testing and debugging pages, the development-tips page and the Agent Builder testing page. On that basis, keeping score of which branches have actually been exercised is manual work rather than a platform behaviour, so the answer to "is the frost path proven" is what the team remembers. The single place "coverage" appears is about connector unit tests in the CDK, and Tray hands the decision to the developer: "in practice, a connector test's focus is more about making sure that operations are properly communicating with the underlying implementation instead of testing its functionality, but ultimately it is up to the developer to decide how much and what type of coverage suits a given connector best." The automated check that does run on every change is structural rather than behavioural. Tray describes their validation scope as "jsonpath resolution, output-shape rules, structural conventions", which catches a broken reference and not an untried branch, and the one execution route their agent surface has is a live fire: "Firing a workflow runs every step against whatever it's wired to ... a Slack step posts a real message, a Salesforce step writes a real record, a webhook calls the real endpoint. It consumes API quota and writes an execution log." Proving eleven paths that way means eleven real runs against real systems.

exec_get_branch_test_points

24Retest on real customer data, not samples

Bugs get retested against the actual record that broke, emoji in the surname included. On Tray.ai, replay expires in 7 days on two of the three plans.

Open the scenario

Synthetic test data does not contain the thing that breaks integrations.

27 · Replay a real execution on real data

The scenarioFairmount Dental needs a six-week-old run to reproduce a billing failure

Fairmount Dental needs a six-week-old run to reproduce a billing failure

Fairmount Dental Partners runs 61 practices across the UK and syncs treatment plans into a central billing ledger. A patient's insurance pre-authorisation posted wrong on 3 July, and the practice manager in Leeds escalated it on 12 August after the third rejected claim. Reproducing it needs that exact run: an emoji in the surname field and a mobile number typed with a leading plus and two stray spaces. The run she needs happened six weeks ago.

She names the 3 July run; the AI re-executes it from the step that broke, its captured data intact, or she does it herself. The emoji in the surname and the mangled mobile number are in the test, because the real record is the test.

Tray does replay a real run, and it is one click from the log: "When you want to replay a run, simply hover over the run log in question, and a new button option will be presented to you... Note that when you replay a run, a new workflow run is activated... The original workflow run will still be present." On real customer data that is the right mechanism, and it should be conceded before anything else is said. The constraint is the window, and Tray publishes it per plan: "How long you will be able to access logs and replay associated workflow runs will depend on your package: Pro = 7 days from the last workflow run; Team = 7 days (30 days as optional add-on); Enterprise = 30 days." Their own worked example spells out the consequence: "When you do discover the error, say, the following Tuesday having not received the usual list update, you will be unable to re-run said log. This is because the run log itself is over 7 days old... PLEASE be wary of such instances occurring." A finance escalation that surfaces six weeks after the bad posting is past that line on every published plan, and the retention can also be dialled down further, since "The data retention period can be reduced to 1 day via an organization-wide setting." There is a documented route to a longer horizon, and it points off the platform: log streaming is "available regardless of your log retention period. This allows you to stream your workflow execution data to your own systems or SIEM so you can set your own retention period", which is an Enterprise line item and separately a paid add-on. The lighter test path keeps nothing to come back to: for steps run in isolation, "No logs are retained for test runs."

exec_restart_from_step

25Re-run last month's live traffic

Answer a month-old complaint by re-firing the exact message that failed. On Tray.ai, last month's runs sit outside the published replay window.

Open the scenario

Testing a webhook-triggered flow meant asking a customer to go and click something in their system.

28 · Webhook replay from historical payloads

The scenarioKestrel Freight cannot ask shippers to re-send tenders just to test a fix

Kestrel Freight cannot ask shippers to re-send tenders just to test a fix

Kestrel Freight Group brokers 4,200 load tenders a day out of Rotterdam, each arriving as a webhook from a shipper's system. Two of its largest shippers push a rate-confirmation payload shape that was never documented, and last month it began dropping accessorial charges worth roughly 18,000 euros a week. IT director Sanne de Boer has the fix written. Validating it used to mean emailing a shipper's operations desk and asking them to re-tender loads they already moved, and that is goodwill she cannot spend twice.

She asks for last month's tender; the AI finds the stored payload and re-fires it at the fixed automation, or she replays it herself and watches it process. No shipper is asked to re-send a load they already moved.

Replaying last month's live traffic is outside the window Tray publishes. Their limits table gives one line for it, "How long can logs be re-run for? | 7 days", and their debug-logs page gives the plan-dependent reading, 7 days on Pro, 7 with a 30-day add-on on Team, 30 on Enterprise. A payload shape that started arriving four or five weeks ago sits beyond both readings. The payload itself is kept for exactly this purpose while the log lives: "Tray stores this data to allow workflow steps to use previous step outputs and for replaying or re-running workflow executions as and when needed." So the mechanism is there and the retention is what binds, which is why the documented answer for longer horizons is to move the data off Tray: "Log streaming, available regardless of your log retention period. This allows you to stream your workflow execution data to your own systems or SIEM so you can set your own retention period." That is an Enterprise plan line and a separate add-on, and what it gives you is your own copy of the execution record in your own tool. Two related caps are worth knowing before planning around replay: the webhook trigger consumes at most 1 MB ("file content can be sent as multi-part http requests, with an overall limit of 10MB"), and data passing between any two steps is capped at 6 MB, "any more will cause issues."

exec_replay_webhook

26Test a shared building block alone

Shared logic proves itself in one run instead of dragging nine workflows through a test cycle. On Tray.ai, a shared sequence is proven through the workflows that call it.

Open the scenario

Proving one shared component meant running nine automations.

29 · Test a subroutine in isolation

The scenarioAshgrove Polytechnic must prove a shared sequence before Monday enrolment opens

Ashgrove Polytechnic must prove a shared sequence before Monday enrolment opens

Ashgrove Polytechnic enrols 19,000 students, and its intake, transfer, credit-recognition and bursary automations all call the same shared address-and-residency normalisation sequence. Registrar Priya Nandakumar needs one change to that sequence before enrolment opens Monday at 8am. Proving it today means dragging all nine parent automations through a full test cycle on a Sunday, with the enrolment team already off shift and a 30,000-applicant queue waiting on the other side of the deadline.

She asks the AI to prove the shared sequence; it runs the subroutine alone on controlled inputs and reports what came back. She can run it the same way herself. One run, not nine parents dragged through a cycle.

Tray does let you exercise one piece without running the whole thing, and says so in the terms a maintainer cares about: running steps in isolation "Eliminates the need to run entire workflows to test a change on just one connector." They also recommend the by-reference structure that creates shared logic to begin with: "it is highly recommended to use a callable workflow for each processing action." The bound is that isolation is per step, not per sequence. Tray states it: the feature "does not execute full workflows or multi-step processes... not intended for end-to-end integration testing; it solely verifies the functionality of individual steps." It also keeps no record and is metered, since "No Logs Retained" and "Each time you run a step in isolation it is billed as a single task." So a shared multi-step sequence is proven through the workflows that call it, and one shape of callable cannot be re-run on its own at all: "For a fire and wait for response callable workflow, you can only replay from within the calling workflow (i.e. not the workflow being called)", repeated in their help centre as "you CAN replay 'fire and forget' operations but CAN'T replay 'fire and response' ones". The same asymmetry shows up on their agent surface: their plugin's own notes say "Callable workflows can't be turned off directly. Tray prevents update_workflow_metadata({enabled: false}) on a callable to avoid breaking other workflows that depend on it." That refusal is sensible, and it also means an agent handles the shared unit through its dependents rather than directly.

exec_test_subroutine

27AI reads production, writes need approval

An agent works production with full read, and the actions that reach a fleet return a plan a human approves. On Tray.ai, the destructive-action prompt is the agent client's, and their own note says "a raw client applies only the guardrails you give it".

Open the scenario

The fastest way to an outage is a confident agent with production credentials.

30 · Production is read-only by default; writes gate on explicit confirmation

The scenarioRavensbourne Credit Union weighs handing an AI agent production ledger credentials

Ravensbourne Credit Union weighs handing an AI agent production ledger credentials

Ravensbourne Credit Union serves 41,000 members and posts about 2,600 ACH transactions a night through its integration layer. IT director Marcus Adeyemi has been asked to let an AI agent work directly on those production integrations to clear a backlog of 30 change requests. Regulators audit every write to the member ledger, and one mis-sequenced deploy at 11pm becomes a reportable incident by the time branches open. He is being asked to hand production credentials to something built to act with confidence.

The AI reads production freely: run history, step data, assembly logs, the account changelog. The actions that reach a fleet are preview-first by design. deploy_to_accounts returns the deployment plan on its first call and writes when a human passes an explicit confirmation, not before, and the group kill switch and its restore behave the same way. Marcus can make those same calls himself, and the changelog shows what happened either way.

Tray is unusually straight about this, and the sentence to read to an IT director is theirs: "The plugin acts in your Tray organization as you: Once you sign in, the plugin operates with your Tray identity and permissions in the workspace you select during sign-in. It can create, modify, and delete projects, workflows, and authentications, and run workflows that have real side effects. What it's allowed to do is governed by the permissions you grant it in Claude Code." That last clause places the guardrail in the client rather than in the platform, and Tray draws the distinction itself: "The packaged plugin surfaces destructive actions for confirmation; a raw client applies only the guardrails you give it, so review what your agent is allowed to do." The in-canvas assistant is described the same way: "Does Merlin interact with my live data? Yes. Merlin will update and delete any records that you ask it to. It is recommended to first test Merlin on test data / sandbox environments." And the agent's one execution route is production traffic by design, since firing a workflow "runs every step against whatever it's wired to ... a Slack step posts a real message, a Salesforce step writes a real record" and "It consumes API quota and writes an execution log." A read-mostly posture is therefore something you assemble rather than switch on: sign the agent in as a restricted user under Tray's roles model, keep it in a workspace you are willing to lose, and rely on whatever confirmation policy the MCP client enforces. A night of ACH postings is not the place where the difference between a client-side prompt and a server-side gate is discovered.

At scale, this means

Test coverage is a property of the platform, not of your team's imagination for payloads. Across months of daily production builds on APIANT, no hallucinated mapping, structure, or logic has been observed reaching production. That is what the compiler and the branch walk are for.

Act 5 of 8

Shipping to a fleet, not to one customer.

One fix reaches 232 locations in a single deploy here; on Tray a breaking change loops upgradeSolutionInstance, one solutionInstanceId at a time, and where their requiresUserInputToUpdateVersion flag is set each end user runs the config wizard again.

Building the integration once is the demo. Running it for three hundred customers, each configured differently, each on their own credentials, all needing the same fix on the same day, is the business. This act is where per-customer platforms and per-fleet platforms part ways.

28One build, hundreds of customers, per-customer settings

Ask the AI to ship the fix and it deploys to 232 linked accounts on your confirmation of the plan it returns. On Tray.ai, an Enterprise add-on with no published price, plus the instance lifecycle as an application you write against their GraphQL API.

Open the scenario
3
Capability 28

Every customer wants the same integration configured differently, and cloning it per customer creates hundreds of divergent copies.

Build once, deploy to hundreds: universal logic, per-customer settings

One codebase carries the logic. Settings (which fields sync, which features are on, time zones, branding) vary per customer. The same automation serves a single-location studio and a 232-location franchise.

The scenario A 232-location fitness franchise needs one fix live everywhere before evening classes.

A 232-location fitness franchise needs one fix live everywhere before evening classes.

A fitness franchise with 232 locations runs a booking-system-to-CRM integration at every site. Each location has its own booking credentials and its own quirks (time zones, membership names, feature toggles), but the logic is identical everywhere. Today, a fix needs to reach all 232 before the evening class rush. This is a real deployment shape running on APIANT now.

Swipe to see the whole diagram ON APIANT One codebase logic, universal Location 001 Location 002 Location 232 own credentials, own settings one call, previewed: reaches all 232 ON TRAY.AI Publish v14 breaking change Instance · v14 ✓ Instance · v12 Instance · v13 Instance · v9 updated one instance at a time, or by a script your team writes
On APIANT
  1. The integration exists once, as universal logic, and each location's differences live in settings rather than in copies. You ask the AI for the fix: it edits the single automation, replays it with exec_test_automation against a saved run, then calls deploy_to_accounts across the 232 linked accounts, returning the deployment plan and writing on your confirmation.
  2. You can do both by hand, and either way you read the same plan and the same per-account result. Because the accounts are linked, the next fix updates those same copies rather than creating new ones.
  3. Staging is naming a subset of accounts on one call and the rest on the next. A reversal is a redeploy of the previous version, which the platform keeps and the AI can diff.
  4. Fix at 2pm, fleet-wide by 2:15, evening classes uneventful.

Fix at 2pm, fleet-wide by 2:15, evening classes uneventful.

On Tray.ai

Buying the platform does not buy this. Tray's multi-tenant layer is Embedded, and Embedded is sold separately: "The Tray Embedded bundle is available to Enterprise customers as an optional add-on. Please contact your sales representative if you wish to activate the bundle." It appears in no tier's feature list on their pricing page and in no line of their published add-ons, so there is no figure to put in a model.

The Tray Embedded bundle is available to Enterprise customers as an optional add-on. Please contact your sales representative if you wish to activate the bundle.Tray.ai docs, What is Embedded

Concede the screen, because Tray ships it. The Config Wizard is Tray-built and Tray-hosted, the end customer creates their own authentications and enters their own config data in it, and their Embedded use-case page promises "No third-party logo, no second login, no hand-off to a vendor's portal". Two published conditions sit on it. Rendering it inside your own page needs Tray to act: "If you wish to present the Config Wizard in an iframe, your domain will need to be added to our allowlist. Please contact us at support to arrange this." And it carries a size ceiling with a documented exit: "Your solution requires the end user to map 100 fields in the configuration step, 100 fields can't fit in one page of the config wizard", where the recommended answer is to "build your own form experience, leveraging our API's".

What the add-on gives you around that screen is the runtime, not the application. A Solution exposes a project's config and credentials as Config Slots and Authentication Slots, and each customer's values live in their own Solution Instance. That model is sound and it works. The layer that creates an instance, reads its version flags, passes config values and triggers an upgrade is yours to build, and Tray's own architecture description says so: "Your application code behind the UI (in the dark box) which is built using our GraphQL APIs." One published constraint shapes the estate around it, "It is not currently possible to create Embedded Solutions in custom workspaces", which is why Tray recommends separate Tray accounts to get a dev-to-prod path.

End-user volume is metered on its own meter. The usage dashboard carries an End User Tasks tab where "This view only applies to Enterprise customers using the Embedded Bundle", and per their January 2026 update, "test users are now billed according to standard entitlement terms."

Built for this, in the live inventory:/deploy-automationdeploy toolset · 7 tools
Test 03 version drift across a fleet is a slow-motion incident
29Parent account routes work to child locations

One incoming request lands in the right location's account, on that location's own credentials, with hundreds of accounts behind the curtain. On Tray.ai, the event-to-location map is a database you own and keep in sync.

Open the scenario

Three hundred locations cannot each hold their own credentials and configuration.

32 · Master and child account architecture, with master-account routing

The scenarioKestrel Pharmacy: 178 branches, one webhook endpoint, refills landing at 6:40am

Kestrel Pharmacy: 178 branches, one webhook endpoint, refills landing at 6:40am

Kestrel Pharmacy Group runs 178 branches across Ontario and Alberta, each dispensing on its own credentials. Refill notifications from the dispensing vendor all arrive at a single endpoint with a four-character store code buried in the payload. IT director Priya Raman keeps 178 credential sets straight and has one URL to route them through. At 6:40am the day's first refill batch starts landing, and every message has to reach the branch that can actually fill it.

A parent account governs 178 children: the webhook hits the master, which routes by store code to the right child, processing on that branch's own credentials. Priya asks the AI where a refill landed and admin_auto_search_exec_history answers across all 178, or she opens the run herself.

The documented equivalent on Tray is not an account hierarchy, it is a join you maintain. Their End User model is deliberately two-sided: "They should be stored in your own user database, and when they are created using the createExternalUser API they will be stored in your Tray Embedded account. They must be linked between these two databases using a common externalUserId." A four-character store code buried in a refill payload therefore becomes a lookup you write, against a table you keep in step with theirs. The other route, one workspace per location, has a ceiling published on the plan line: three workspaces on Pro, twenty on Team, unlimited on Enterprise. A 178-branch estate is Enterprise, or it is not workspaces at all. Tray.ai does not document this, meaning an account hierarchy in which a parent receives one endpoint's traffic and routes each event to the right child location by a key in the payload. We searched their org setup, workspaces and projects, user roles, Embedded end users, Embedded solution instances and environment setup pages, plus the workspace limits on their pricing page. On that basis it is manual work rather than a platform behaviour.

30Share one credential, keep the rest separate

One CRM login covers every location while each site keeps its own booking login. On Tray.ai, a shared credential is shared with everything in the workspace.

Open the scenario

Re-authenticating per location does not scale past about twenty.

33 · Shared where it matters, isolated where it must be

The scenarioSouthern Reef Dental: 96 practices, one CRM login, re-authorised by hand

Southern Reef Dental: 96 practices, one CRM login, re-authorised by hand

Southern Reef Dental operates 96 practices across Queensland and New South Wales, all reporting into a single group marketing CRM. Every practice holds its own practice-management login, but the CRM is one company account whose token expires every 90 days. Practice manager Dan Whitlock has burned three weekends re-authorising connections clinic by clinic, and the group settles on four more practices this quarter.

One CRM credential, flagged shared, serves all 96 practices while each keeps its own practice login. Dan asks the AI whether the group token still authenticates: asm_test_api_connection. He can check by hand. Sharing is a toggle on the hierarchy, alongside shared settings and automations.

Sharing one credential across locations works on Tray. The cost is that it is shared with everything else in the same workspace. Their environment guide lists the granularity under Limitations: "Cannot limit auth access per project within an environment." Workspace auths are available to every project in that workspace, so the group's single CRM token and everything else in the workspace sit at one level of access. Concede the separate half, which Tray documents cleanly: in Embedded "it is possible to set a limitation so that an End User is forced to add a new authentication for a particular Solution Instance, and cannot choose from a list of already-made authentications." That is what per-practice logins need, and it is there. The sharp edge is the shared token's refresh. Tray publishes it: "any changes made to an authentication will generate a new auth slot id on the backend of the service", and a changed auth slot id sits on their own list of breaking changes. So rotating the one company credential moves the integration onto the per-customer upgrade path rather than the automatic one.

31Fleet-wide upgrades from one confirmed action

A week of hand-updating becomes one confirmed action, staged if you prefer, with every prior version kept for a redeploy. On Tray.ai, breaking changes go instance by instance and reversal is a forward publish.

Open the scenario

Shipping a fix to two hundred customers by hand takes a week and misses some.

34 · One-click deployment and upgrade to every linked account

The scenarioHalyard Ticketing: refunds broken at 186 venues before Friday's 10am on-sale

Halyard Ticketing: refunds broken at 186 venues before Friday's 10am on-sale

Halyard Ticketing sells box-office software to 186 venues, from 300-seat regional theatres to a 19,000-seat arena. A payment provider renamed a field overnight and refunds have been failing at every venue since 05:00. Head of support Marta Kovac has the fix in hand and 186 customer environments to get it into before Friday's 10am on-sale, when 40,000 seats go live at once.

Marta tells the AI to ship it: deploy_publish_folder, then deploy_to_accounts across the 186 venues, each returning its plan and writing on her confirmation, per-account results in front of her. She can run both herself. Staging is naming a subset on one call, and every prior version is kept, so a reversal is a redeploy rather than a rebuild.

Tray splits this into two jobs, and the split does not follow how urgent the change is. Cosmetic changes ride the automatic path: a non-breaking publish is "a lazy update, with a delay of approx 2 minutes from release", and "If a source workflow runs on a scheduled trigger it won't happen until the next scheduled run." Anything Tray classifies as breaking goes customer by customer: "Query all the instances of the solution using Get Solution Instances. Loop and upgrade each one using the upgradeSolutionInstance mutation." That mutation takes a single solutionInstanceId in their published Embedded API, with no batch form, and their Embedded endpoints are "rate limited at 30 requests per second or 1800 requests per minute", so the fleet push is a script you write, own and pace. The classification is where a 05:00 incident lands. Their breaking list includes an auth slot "linked to a new service version or environment (e.g. the Salesforce connector has been updated to a new version)", so moving to the connector version that carries the fix is breaking by their own definition, and instances flagged requiresUserInputToUpdateVersion need the venue to run the Config Wizard again. Reversal is documented as a forward publish. The Rolling back changes section runs two lines in full: "If breaking change due to auths, manual rollback only. Always need to publish new version manually in solution editor." Concede the preview, which is genuinely strong: their publish-preview API reports breaking changes and per-slot detail before you ship. It tells you what will break; it does not push the fix.

deploy_to_accounts

32Every version kept, compared, and reversible

Ask the AI what changed and it diffs the bad version against the last good one; the reversal is a redeploy of that kept version to the fleet. On Tray.ai, readable for twelve months, reversible for thirty days.

Open the scenario

A change made things worse, and there was no way back.

35 · Version history, comparison, and rollback on a live integration

The scenarioFoothill Co-op: guardian records merging across 41 districts, enrolment week opens 07:30

Foothill Co-op: guardian records merging across 41 districts, enrolment week opens 07:30

Foothill Education Co-op moves enrolment records between a student information system and the rostering tools of 41 school districts, 216,000 students in all. At 21:40 the night before enrolment week, integrations lead Yusuf Aldridge pushed a change to how guardian contacts are matched, and registrars in six districts are now seeing siblings collapsed into one record. He needs to know exactly what changed and be back to last night's state before offices open at 07:30.

Yusuf asks the AI what changed, and auto_compare_versions diffs tonight's committed version against last night's, naming the guardian-matching edit. He can read that diff himself. Getting back is a redeploy of the kept good version to the 41 districts, plan returned before it writes.

Two clocks, and the shorter one is the one you need at 21:40. Tray publishes both under version history storage: "Edit history: Viewable up to 12 months. Rollback feature: Can rollback to a previous workflow version up to 30 days prior to your current changes." Their own worked consequence is on the page: a change older than thirty days stays visible in the record and cannot be reversed. The versioning page repeats the ceiling. Concede what a version is, because it is real. Tray describes versions as commits, with an author, a change list and a restore. What they do not publish is a comparison of two chosen versions at any granularity. What a version shows is a count grouped one level above the step, "Changes are grouped by project assets, such as: Workflows / Project configuration ... / Solution", rendered as created, updated and deleted totals you then drill into. Two published caveats attach to the restore. Versions are snapshots someone has to remember to take, "save versions at key points during the development, similar to committing code", and the snapshot has holes: "Note that Datatables, Vector tables and API management are not yet supported. E.g. if a workflow refers to a datatable, the references will be saved but the datatable itself will have to be recreated manually."

33Permissions scoped by place in the hierarchy

A regional manager sees their 30 locations, support can look without touching, the master admin sees the whole franchise. On Tray.ai, roles stop at the workspace and cannot narrow per project.

Open the scenario

Support needed to see a customer's runs without being able to change them.

37 · Role-based access with account-level permissions

The scenarioRowan Yards: 340 buildings, 14 owners, all-or-nothing access, audit in five weeks

Rowan Yards: 340 buildings, 14 owners, all-or-nothing access, audit in five weeks

Rowan Yards manages 340 residential buildings for 14 institutional owners across three states. Regional managers are cleared to see their own thirty-odd buildings and nothing beyond them, and one owner's contract forbids staff on another portfolio from viewing a single record. When rent posting fails, the support desk has to inspect the run without being able to change owner data. Compliance officer Tomas Berg has an audit in five weeks and access today is all or nothing.

Administrators, builders and viewers are scoped by account: a regional manager sees their thirty-odd buildings, Tomas sees all 340, support reads a failed posting without touching owner data. Ask the AI and it stays inside that scope, dependency lookup included, with admin_account_changelog as the audit.

Roles on Tray stop at the workspace boundary. Their environment guide lists it under Limitations: "Unable to assign different roles to users per project", next to "Cannot limit auth access per project within an environment." A regional manager cleared for thirty buildings and nothing beyond them has to be given a workspace of their own, so the estate ends up cut into workspaces to match the permission map rather than the work. Above that line the scope is wide by design, and Tray's own release note says so: "Admin role grants access to ALL workspaces, not just the originally selected one." Some day-two data sits behind that role. Usage information is "limited to users with Admin or Owner roles", and masking, unmasking or revealing step data is restricted to Admins and Workspace Admins, as is running a step that has masking applied. Concede the read-access support case, which Tray handles properly: the Viewer role has read access to logs, and replay is available to Owner, Admin and Contributor while Viewer is excluded. That half of the requirement is theirs.

34One query shows who a vendor change breaks

You ask the AI who is exposed and get the list in minutes. On Tray.ai, connector updates are manual per workflow, with no subscription.

Open the scenario

An API deprecation notice arrived, and nobody knew who was exposed.

38 · Fleet-wide impact analysis: which of my customers use this connector, this app, this operation

The scenarioAldergrove Underwriting: carrier API retires in 90 days, exposure list missing

Aldergrove Underwriting: carrier API retires in 90 days, exposure list missing

Aldergrove Underwriting, a managed general agent in Ohio, connects to 74 carrier and claims systems on behalf of 1,900 broker partners. On a Tuesday afternoon its largest carrier emails that v1 of the claims API retires in 90 days. Claims systems manager Rosa Ibarra has until Friday to name which integrations, which broker accounts, and which nightly jobs touch that endpoint, and today that list does not exist.

The carrier emails that v1 retires in 90 days. Rosa asks the AI who is exposed: admin_auto_search_by_app names every automation on that app across the broker accounts, asm_find_referencers the assemblies depending on the connector, permission-scoped. She can search herself. Minutes, and it is the migration worklist.

Tray answers this for authentications and leaves it open for the thing that actually changed. Their connector policy is published and deliberate: "When a new connector version is available and you are using it in a workflow, you will need to manually update it yourself. We do not allow automatic version updates because there is a risk that it may break your workflow." There is no watchlist to lean on either, "it is currently not possible to subscribe to updates for a particular connector", and the notification channel is a newsletter: "You will know there is a new version of your connector (or trigger) when it is mentioned in the latest Release Notes publication." So the 90-day deprecation notice arrives and the exposure question is answered by hand. Step Dependencies exists, but Tray scopes it to one workflow and calls it "A visual aid", and their instruction before a version change is bookkeeping: "We highly recommend you make a list of all the step dependencies associated before beginning any alterations." Their product page's claim of "one maintained connector library, always up to date" sits beside that policy, and a reader should weigh the two. Concede two genuine dependency queries, both recent. An authentication's information page lists the workflows that depend on it, shipped July 2026, and the Embedded slots usage modal shows "exactly which workflows and steps each slot is used in." Neither answers which workflows use a given connector operation.

At scale, this means

Customer three hundred costs what customer three cost. Growth in breadth, more customers, more locations, does not multiply your operational surface, and does not show up as a per-deployment line item on the platform bill.

Act 6 of 8 · The centrepiece

Running it for years.

In year three a connector fix lands in one data assembly here; on Tray connector updates are manual per workflow with no way to subscribe, and in-platform replay runs 7 days on Pro, 7 with a paid add-on on Team, 30 on Enterprise, with log streaming to your own SIEM as the documented route past that.

Nobody buys an integration platform for month one. The purchase is really years two through five: the customer reports, the API drift, the 2am incidents, the person who left. Every platform demos the build. This act is about everything after the demo, which is where the money is, and where architectures stop being interchangeable.

35Find one customer's run from weeks ago

Answer a three-week-old customer complaint before standup: find the run, fix it, prove it, ship to all 90 sites. On Tray.ai, seven days on two of three plans, and seven days to re-run on all three.

Open the scenario
13
Capability 35 · The needle in the haystack

"It did not work for this one customer last Tuesday" was a multi-day archaeology project, and often unanswerable.

Out of hundreds of thousands of runs: find the one, watch what it did to the data at every step, fix it, prove the fix, and ship it to everyone. Conversationally.

The scenario A 90-site franchise asks why one member vanished from their CRM three weeks ago.

A 90-site franchise asks why one member vanished from their CRM three weeks ago.

6:51am, a support inbox. One location of a 90-site franchise writes: "A member signed up on June 30 and she never showed up in our CRM. She's furious. What happened?" It is July 21. Three weeks ago. The platform has run hundreds of thousands of executions since. Somewhere in there is one run that did something wrong to one record, and a customer is waiting to find out whether you are the kind of vendor who can answer.

Swipe to see the whole diagram ON APIANT June 30, 09:12 found by her email 1 · signup event 2 · fetch member 3 · tier lookup ✕ 4 · CRM write step 3 dropped legacy plan codes: the record died here, silently fix one node replay her real run ✓ deploy to 90 sites Directed in plain English. Each deploy previews before it writes. Answered before the 9:30 standup. ON TRAY.AI The run is from three weeks ago. Log retention: 7 days on Pro. The step results you would need to trace no longer exist there, or on Team without the 30-day add-on. Enterprise: 30 days. Within the window: per-workflow log search, step data, then a fix in the builder and a per-instance rollout.
On APIANT
  1. Find her. She asks, and the AI searches execution history by the data itself, her email, returning the exact run, June 30 at 09:12, out of hundreds of thousands. See what it did. The AI pulls the step data and reads the record as it was transformed at each stage: step 3, a tier-lookup transform, silently dropped members carrying a legacy plan code.
  2. The same run renders visually, so a person can look at the evidence and judge it too. Fix one node. She corrects the transform where it lives, or asks the AI to; either way the edit targets that node, so its blast radius is that node. Prove it. The AI keeps her June 30 payload as a test run and re-executes it from that step through the fixed logic: the member lands in the CRM, and the branch walk confirms nothing else moved. Ship it.
  3. One confirmed call returns the deployment plan before it writes anything, then reaches all 90 linked sites, with the prior version kept and diffable if the change was wrong. Then one read-only query answers the follow-up that separates good vendors from great ones: who else did this silently affect since June. All of it directed conversationally, by one person, before the 9:30 standup.

All of it directed conversationally, by one person, before the 9:30 standup. The reply to the location: what happened, why, fixed, and here are the other three members we caught and restored.

On Tray.ai

Whether the answer exists at all depends on the plan, and Tray publishes the split: "How long you will be able to access logs and replay associated workflow runs will depend on your package: Pro = 7 days from the last workflow run; Team = 7 days (30 days as optional add-on); Enterprise = 30 days." A June 30 run queried on July 21 is inside the window on Enterprise and outside it on Pro, and on Team unless the add-on was bought.

How long you will be able to access logs and replay associated workflow runs will depend on your package: Pro = 7 days from the last workflow run; Team = 7 days (30 days as optional add-on); Enterprise = 30 days.Tray.ai docs, Debug logs

Reading is not re-running, and the re-run number is the same on every plan. Their limits table: "How long can logs be re-run for? | 7 days." So the three-week-old run can be found and read on Enterprise and cannot be replayed to see what it does now, which is the step that turns an answer into a fix.

Concede the escape hatch, because a prospect will raise it. Log streaming sends execution data to your own systems or SIEM "so you can set your own retention period." It is a separate paid line item, the archive is your infrastructure to run, and it sits outside the product where the replay button is.

Test 01 can a human watch what the data went through, weeks later Test 03 the fix is proven on her real run before it ships

"It didn't work for one customer last Tuesday" stops being a week of archaeology. It becomes a conversation.

36Alert rules that cut noise to real alerts

A real deployment went from 140 alerts a day to 3. On Tray.ai, the noise filter is a workflow you write plus a log sink you own.

Open the scenario
3
Capability 36

Alerting was either silent or so noisy that everyone stopped reading it, which is the same thing.

Alert governance: per-automation and per-step rules, system-level mappings, a trace of why an alert fired or did not, suppression lists

The scenario A team muted 140 daily alerts; a real one sat unread nine hours.

A team muted 140 daily alerts; a real one sat unread nine hours.

A platform team's alert channel gets 140 integration alerts a day. A hundred and thirty-eight are a flaky sandbox and a vendor's nightly maintenance window. Two are real. The humans did the rational thing months ago: they muted the channel. Last Thursday, one of the two real ones sat unread for nine hours while a customer's orders silently queued.

On APIANT
  1. She asks the AI to clean up the channel. It reads the current error policy, then writes rules where they matter: per automation, per step, and system-wide mappings that classify an error once for the whole tenant.
  2. The known noise, the flaky sandbox and the vendor's maintenance window, goes onto suppression lists, deliberately and with a standing list of what is suppressed, instead of into the humans' learned indifference. When an alert fires, or when one should have and did not, the AI pulls the mapping trace: which rule matched, which mapping transformed it, which suppression swallowed it.
  3. She can set the same rules and read the same trace herself. One working session took a real deployment from 140 alerts a day to 3.
  4. Three alerts a day, each one real, each one read. The channel gets unmuted.

Three alerts a day, each one real, each one read. The channel gets unmuted.

On Tray.ai

On Tray, the thing that turns 140 alerts into two is a workflow you write, and it works against a log store you buy. Alerting is authored rather than configured: you build workflows against an Alerting Trigger at instance, workflow or personal scope, and their alerting page states the dependency plainly, "Logging errors outside of Tray in some way is essential. What service you choose for this logging process is up to you." Those alerting workflows consume tasks like any other workflow, so suppressing a flaky sandbox is billed work.

Logging errors outside of Tray in some way is essential. What service you choose for this logging process is up to you.Tray.ai docs, Alerting

Concede the platform-side noise reducer, because it exists and it is good. Anomaly Detection watches task volumes and errors over five-minute, hourly and daily intervals, and "You control the algorithm sensitivity." Three published conditions attach: it requires log streaming enabled, it is requested rather than switched on ("please contact your admin to set up the Anomaly Detection in your organization account settings"), and the thresholds are not per integration, "Please note the rule-based applies to the whole org."

Concede too that their agent reaches part of this, which is worth saying because it is often claimed the other way. A step's error and alerting behaviour is a field their build tools write, and the alerting workflow itself is a workflow their agent can author and edit. What stays with a person is the Account Settings screen deciding which alerting workflow receives an organisation's errors, the retry count and backoff, which Tray publishes as fixed platform policy, and the Anomaly Detection thresholds.

Built for this, in the live inventory:/alert-handlingalerts + admin_alerts · 16 tools
Test 03 an alert nobody reads catches nothing
37One-command shutdown and exact restore during outages

Ask once and 180 automations across a parent and 60 children are snapshotted and disabled, then restored exactly as they were. On Tray.ai, both shutdown controls are scoped to one workflow, and the stop has no endpoint in either published spec.

Open the scenario
3
Capability 37

When an upstream vendor breaks, the choice was between flooding a broken API and losing track of what to turn back on.

The incident kill switch: snapshot and disable every running automation across a parent account and all its children, then restore exactly what was on

The scenario 180 automations hammer a dead CRM across a parent and 60 child accounts.

180 automations hammer a dead CRM across a parent and 60 child accounts.

Tuesday, 11:40am: a CRM platform your customers depend on goes down hard. Across one parent account and its 60 child accounts, 180 automations are hammering a dead API, burning retries, and generating an alert storm. Every minute they keep running makes the eventual recovery messier. But some of those automations were off already, on purpose, and when the vendor recovers you must restore exactly the previous state, not "turn everything on" and reawaken the three that were disabled for good reasons.

On APIANT
  1. The on-call lead asks the AI to shut it down. One group call snapshots the on/off state of every automation across the parent and all 60 children, then disables the ones that are on, returning the preview before it writes so she can confirm the 180 in the plan.
  2. Nothing new starts after 11:42, and a second call halts the runs already in flight. The snapshot tag is the restore plan, so no spreadsheet is kept, because the platform kept the truth. Vendor recovers at 3:15.
  3. One call restores exactly the automations carrying that tag; the three deliberately-disabled ones stay off. Then the mop-up: the AI lists the failed runs from the outage window and retries them in bulk.
  4. She can run every one of those steps from the console herself. Minutes at the start, minutes at the end.

Total human attention: minutes at the start, minutes at the end. No flood, no amnesia.

On Tray.ai

On Tray the shutdown is assembled workflow by workflow, and the two controls are scoped to one workflow each. The kill switch stops what is running: "if you need to immediately stop all executions of a workflow you can do this with the 'Stop all executions' button", and covering what has not started yet is the separate control: "To stop all past and future executions this functionality would need to be used alongside the disable workflow functionality." The stop is a UI action, with no endpoint in either published OpenAPI spec, trayapi.yaml or embeddedapi.yaml, and no tool on the agent surface. The disable is agent-callable per workflow through update_workflow_metadata, and refused on shared logic: "Tray prevents update_workflow_metadata({enabled: false}) on a callable." For 180 automations across a parent and 60 child accounts at 11:40, that is 180 stops by hand in the builder plus 180 per-workflow disables.

This is not the same as the 'disable' button as it only stops executions that started before the button is pressed. To stop all past and future executions this functionality would need to be used alongside the disable workflow functionality.Tray execution kill switch documentation

The return pass is the part with no published mechanism. We searched the execution kill switch page, organisation-management/managing-workflows, Insights, the eleven lifecycle-management pages and the platform API index, and swept all three documentation bundles for kill switch, bulk disable and disable all. Their documentation publishes no statement on a disable that covers an organisation and its child workspaces in one action, and none on a snapshot of which automations were on so the same set can be turned back on. On that basis, putting the estate back to the set that was running at 11:39 is manual work rather than a platform behaviour.

The nearest documented thing is a different thing. Project versioning can restore a project, and "Project rollback: A grouped set of changes applied when a version is restored" is a documented change type, but that returns configuration rather than the enabled and disabled state the estate was in before the incident, and it is bounded: "Note that you can only restore workflow states from the last 30 days."

Built for this, in the live inventory:/support · kill switch tools
Test 03 incident tooling written during the incident is not tooling
38Set which errors retry and which stop

Transient blips retry themselves while broken credentials stop instead of hammering a customer's API, set once for the whole tenant. On Tray.ai, retry counts and intervals are published as fixed platform behaviour.

Open the scenario

Transient failures were treated as fatal, and genuine auth failures were retried forever.

42 · Error policy control: which errors deserve retries, and which must stop

The scenarioKestrel Freight: 340 overnight load tenders dropped, trucks idle by 6am

Kestrel Freight: 340 overnight load tenders dropped, trucks idle by 6am

Kestrel Freight Partners, a freight brokerage in Rotterdam, tenders overnight loads to 1,900 carrier systems between 1am and 5am. At 03:10 a carrier gateway returned a run of transient 502s and 340 tenders were abandoned as fatal, while on a different lane an expired token was retried every 90 seconds for six hours until that carrier's account locked. Joran, the night dispatch supervisor, has until the 06:00 driver call to work out which loads are actually covered. Trucks that sit unassigned past 07:00 come off the contract rate.

Ask the AI to retry the 502s and stop the expired token, or set the lists yourself: retryable error classes are tenant-wide, and auth failures on named domains get carve-outs. Shutoff is a policy on record, not a surprise you discover.

What you can set on Tray is a per-step mode, not a retry policy. The three modes are Stop workflow, Continue workflow and Manual. Which errors retry, how many times, and how long between attempts are published as platform behaviour rather than as settings your team owns. Their limits table is explicit about it: "Service connector API returns an error | Retry 3 times every 40 seconds | Retries 3 times only if set to stop workflow, error handling retries 0 times", and "Wrong user input (e.g. wrong jsonpath) | Doesn't retry regardless of error handling". Platform-side failures get their own fixed schedule, "Retries 15 times regardless of error handling", with the delay growing until "10th time will wait for 30 minutes". Kestrel's 03:10 carrier wobble therefore gets whatever the step's mode gives it, and the counts and intervals stay where Tray set them. In Tray's favour, they publish that this work is free: "Retries as explained in this table are not charged." The awkward case for a freight gateway is one Tray documents separately. A third-party throttle does not arrive as an error at all: "the 429 response will be contained within a Tray 200 response", so connector retry does not fire on it and the backoff is something you build into the workflow. We searched technical-limits, error-handling, manual-error-handling and the third-party error-handling pages for an account-level list of which status codes or error strings are retryable, and their documentation publishes none, so which failures count as fatal is decided step by step by whoever last edited the step.

/alert-handling

39Bulk retry of everything that failed

After an outage, hundreds of failed records get reprocessed from one screen instead of by hand. On Tray.ai, replay is documented one run or one step at a time, inside 7 days.

Open the scenario

After an upstream outage, hundreds of records needed reprocessing, and there was no safe way to do it in bulk.

43 · Retry inspection and bulk retry

The scenarioHalden Pharmacy: 2,600 failed refill requests, patients arriving Monday morning

Halden Pharmacy: 2,600 failed refill requests, patients arriving Monday morning

Halden Pharmacy Group runs 118 high-street stores across the north of England, and its prescription-refill hub was unreachable from 13:00 to 17:20 on a Saturday. In that window 2,600 refill requests failed on the way to the dispensing system. Priya, the pharmacy operations manager, has Sunday to get them through, because on Monday patients walk in expecting scripts that were never queued. Re-keying 2,600 records by hand is not a plan, and she has two staff available.

Ask, and the AI lists every failed run, shows what each was carrying, and retries them in bulk once the cause is fixed. Priya can work the same surface herself, at 2,600 or at any scale.

Reprocessing Halden's 2,600 failed refills is per run work on Tray, inside a published window. Replay is documented at two granularities and both are singular: "In your workflow logs it is possible to re-run either: An entire workflow run (using the left-hand column…) / An individual workflow step (using the right-hand column…)". The action itself is a hover: "When you want to replay a run, simply hover over the run log in question, and a new button option will be presented to you." The clock is the harder constraint for a Saturday outage. Their limits table sets "How long can logs be re-run for? | 7 days", and the log window behind it is package-dependent: "Pro = 7 days from the last workflow run; Team = 7 days (30 days as optional add-on); Enterprise = 30 days". Shared logic narrows it again: "For a fire and wait for response callable workflow, you can only replay from within the calling workflow (i.e. not the workflow being called)." On selecting many failed runs and replaying them in one action, their documentation publishes no statement. We searched both debug-logs pages, development-tips, the RBAC matrix in users/roles (which carries a "Replay executions" column with no bulk notion) and the platform API index, and swept all three documentation bundles for bulk retry, replay multiple and re-run multiple. On that basis a 2,600 record catch-up is per run work rather than a platform behaviour, and it has to happen inside the seven days.

exec_retry_failed

40Stop a runaway job while it runs

Ask the AI and a job pounding a customer's system stops: the in-flight runs halted, the automation deactivated so nothing new starts. On Tray.ai, stopping the runs already in flight is a UI action per workflow, with no endpoint in either published spec.

Open the scenario

A misconfigured run was hammering a customer's API, and the only remedy was waiting.

44 · Halting a runaway execution mid-flight

The scenarioLoftgate Ticketing: a looping sync burns an arena's API mid-onsale

Loftgate Ticketing: a looping sync burns an arena's API mid-onsale

Loftgate Ticketing in Melbourne sells for 240 venues, and at 14:20 on the biggest onsale of the quarter a misconfigured seat-hold sync started looping, firing thousands of calls a minute at a 12,000-seat arena's box-office API. The arena's operations lead is on the phone saying she will revoke the API key. Dane, head of platform, watches the run count climb while the sale is live and 40,000 fans are in the queue. Every minute the loop keeps going spends rate allowance the sale itself needs.

Ask the AI to stop it: one call halts the runs in flight, a second deactivates the automation so nothing new starts. Dane can press both himself, while the sale is still live.

Tray publishes a kill switch and it is core rather than an add-on, which is worth saying before the limits: "if you need to immediately stop all executions of a workflow you can do this with the 'Stop all executions' button". Individual runs can also be stopped from the logs view. Two published facts about that button are parity rather than argument, and it is better to say so than to have a reader discover it. Their stop lands at a step boundary, "All running executions of the workflow will be stopped once the current step for each execution is completed", and a step is a bounded unit rather than an immediate one, with connector timeout at "45 seconds OR 120 seconds if built and deployed by you using CDK" and the HTTP Client at "15 mins". APIANT interrupts a run at the next step boundary too. Nothing in this row turns on that. What it turns on is which of the two controls an agent can reach, and how wide either one goes. The button covers what has already started: "This is not the same as the 'disable' button as it only stops executions that started before the button is pressed. To stop all past and future executions this functionality would need to be used alongside the disable workflow functionality." That stop is a UI action, with no endpoint in either published OpenAPI spec, trayapi.yaml or embeddedapi.yaml, and no tool on the agent surface. The disable is different and should be conceded: it is agent-callable per workflow through update_workflow_metadata, and refused on shared logic, where their plugin's own notes say "Callable workflows can't be turned off directly. Tray prevents update_workflow_metadata({enabled: false}) on a callable to avoid breaking other workflows that depend on it." Both controls are scoped to one workflow, so the intervention at 14:20 is a person in the builder for the runs in flight, plus a per-workflow disable for the next ones.

exec_halt

41See events that arrived but never processed

Catch a silent backlog before the customer calls: work that arrived but never ran has its own screen. On Tray.ai, a webhook burst is answered with a 429 rather than queued.

Open the scenario

Silent backlogs: everything looks healthy, and nothing is moving.

45 · Visibility into webhooks received but not yet processed

The scenarioRidgeway Environmental: 430 pickup reports stalled, trucks already left the yard

Ridgeway Environmental: 430 pickup reports stalled, trucks already left the yard

Ridgeway Environmental holds 61 municipal waste contracts across Ontario, and missed-pickup reports arrive from city portals as webhooks that feed route reassignment. At 08:10 on a Thursday, Marlene the dispatcher discovers 430 reports arrived overnight and never moved past the door. Every status board she has was green. The trucks rolled out of the yard at 05:30 without the reroutes, and the cities charge a penalty per street left uncollected.

Ask what arrived and never ran: the AI returns the received-but-unprocessed queue, 430 events, and Marlene sees the same view unprompted. Stuck work shows up before a customer notices the gap.

What Marlene needs at 08:10 is a list of events that arrived and never ran. Tray.ai does not document this. We searched both debug-logs pages, technical-limits, the help centre's working-with-logs and general-troubleshooting pages, the developer notes on working with webhooks and the queueing page under advanced use cases, and swept all three documentation bundles for unprocessed, dead letter and undelivered. On that basis reconstructing the backlog is manual work rather than a platform behaviour. What their documentation does publish about overflow points the same way. A source that outruns a webhook trigger is turned away rather than held: "If too many requests (i.e. several hundred per second) come in to your webhook trigger at once, Tray.io will respond with an HTTP 429 (too many requests) error", with the instruction to "throttle requests appropriately at the source third-party service". Overlapping scheduled runs are dropped in the same spirit: "In a case where 3 attempts at starting a run are made while one is still completing, these runs are missed. They are not added to a queue." On the Trigger API side, undelivered events are retried and still charged: "Events where Tray attempted delivery but your endpoint doesn't respond after retries… these will be billed." So for Ridgeway's 430 missed-pickup reports, the record of what never ran sits with the city portals and with whatever the team reconciles by hand, rather than in a view inside the platform.

exec_list_unprocessed_webhooks

42Search every account by the data itself

Type a customer's email or order number and land on the runs that touched it across every account. An hour of log reading becomes a minute. On Tray.ai, cross-account search means a SIEM you buy and operate.

Open the scenario

Correlating a failure across accounts meant reading logs by hand.

46 · Cross-tenant search by the data itself

The scenarioAmbervale Insurance: one claim lost across 74 broker accounts, clock running

Ambervale Insurance: one claim lost across 74 broker accounts, clock running

Ambervale Insurance Services, a Dublin managing general agent, handles claims for 74 broker partners, each in its own account. After a hail event, claim reference AV-2291884 was acknowledged to the policyholder but never reached the loss adjuster, and the regulator's five working day acknowledgement clock runs out on Monday. It is 16:00 on Friday, and Eoin, the claims supervisor, does not know which of the 74 accounts that reference passed through.

Ask with the claim reference and the AI searches every account at once for that value, returning the runs that touched it. Eoin can run the same search. Correlation across 74 accounts is a query, not a shift.

Correlating one claim reference across 74 broker accounts is work you do in a tool you supply. Tray's documented log filter is scoped to a workflow, and the sharing unit says so: "To share your logs filter just send the workflow URL to the user in question". Insights filters by workspace, project, solution instance and workflow, not by a value inside a payload. Their published answer for the estate-wide question is export: "you can use our log streaming functionality to send logs and events to an external source such as Datadog which can be used to build customized dashboards." That is a real escape hatch and it deserves credit, including on retention, since streaming is documented as available regardless of the log window your package gives you. It is also a separate purchase, an Enterprise plan line item and a paid add-on, and the index you end up searching is a system your team buys, runs and secures. Inside the platform, their documentation publishes no statement on searching every workspace by a value inside a payload. We searched both debug-logs pages, log-streaming, Insights, the help centre's working-with-logs page and organisation-management/managing-workflows. On that basis finding claim AV-2291884 across 74 accounts is either a per-account log search in the package's window or a query against your own exported copy.

43Ask questions of your own data

A support question that used to need a database ticket and two days gets answered in the meeting. On Tray.ai, SQL reaches files inside a workflow, not your run history.

Open the scenario

Diagnosis stalled waiting for someone with database access.

47 · Ad-hoc data queries to validate a hypothesis

The scenarioNorthfell Polytechnic: 260 students without timetables on day two of term

Northfell Polytechnic: 260 students without timetables on day two of term

Northfell Polytechnic in Manchester enrolled 18,400 students this term, and the overnight sync into the student records system left 260 of them without timetable records. It is 07:40 on day two of term and a queue is already forming at the registry counter. Alison, the registrar, has a theory that it is confined to the part-time apprenticeship cohort at one campus, which would change the fix entirely, and she cannot test it without someone who has database access. Enrolment records are what the funding return is built from.

Is it the part-time cohort at one campus? The AI answers in seconds with a guardrailed read-only query, and Alison can run the same query herself. Tested in the meeting, not in a database ticket.

At 07:40 the question is which 260 students and why. Tray has SQL, and it is pointed at a different target: the SQL Transformer works by "enabling you to run SQL queries against data loaded from files within your workflows". It queries the data a workflow loaded, not the history of what the workflows did, and it is gated behind a Customer Success conversation as part of the data engineering add-on. The published surface for operational questions is Insights, and it is a set of KPI cards: "Active Workflows / Task Runs / Data Volume / Solutions / Solution Instances / End Users", each with "a trend metric that shows the percentage change compared to the previous period". Useful for a weekly review, and not the shape of a question about 260 named records that went missing overnight. On ad-hoc queries against your own execution history or platform metadata, their documentation publishes no statement. We searched the SQL Transformer page, Insights, usage and billing, the logs and debugging section and data-tables. On that basis the 07:40 answer is assembled by reading run logs workflow by workflow, and by whoever has the rights to do it, rather than asked as a question.

admin_sql_query · read-only

44Per-customer usage, health and volume numbers

Know which customers are heavy, erroring, or growing before renewal talks and capacity planning, per account, on demand. On Tray.ai, no workflow can read usage, and token-to-task conversion comes from customer support.

Open the scenario

Capacity and billing questions had no ground truth.

48 · Health, usage, and task totals per tenant and per account

The scenarioTrellwood: quarter close, 380 agency accounts, disputed usage invoices

Trellwood: quarter close, 380 agency accounts, disputed usage invoices

Trellwood is a workforce-management SaaS in Austin serving 380 staffing agencies, and it bills on synced placement volume. Deb, the controller, is closing the quarter with two agencies disputing their invoices and one that appears to have grown fourfold without ever moving off its entry plan. The numbers she is invoicing against were assembled by hand from three exports, and she cannot tell a heavy customer from an erroring one. Revenue recognition sign-off is due Thursday.

Ask which accounts are heavy, erroring or growing: the AI returns per-account health, usage and task totals across all 380. Deb's team queries the same numbers and exports them to your monitoring stack.

Concede this one substantially. Tray's usage dashboard breaks down by customer where Embedded is in play: the tabs run "All Tasks", "Workflow Tasks", "End User Tasks", "Connectivity API Tasks" and the token equivalents, and the filter names the customer: "The Solution Instance filter... allows you to filter by the available solution instances in that solution, with each listing showing the name of the end-user and the solution instance ID." Per-workspace task caps exist, and entitlement alerts fire at 80% and 100%. The retention window is not the constraint on this row either: the per-customer view needs Embedded, Embedded needs Enterprise, and Enterprise insights run 180 days. What Deb cannot do at quarter close is put those numbers anywhere. Tray states it plainly: "It is not currently possible to build Tray workflows which monitor and report on usage", with access "limited to users with Admin or Owner roles". So the controller reads a dashboard, under a role that also carries write access to the estate, rather than her billing system receiving a feed she can reconcile against invoices. Where AI work meets the invoice, the conversion is support-mediated: "Token-to-task conversion ratios are available from customer support, and we may add UI support for viewing these conversions in the future", with their own worked example showing the multiplier ("total_tokens": 2167, "tray_tasks": 108.35). On the Connectivity API side, "Can I get a view on the number of billable calls we are making? Not yet - your CSM will assist you in providing regular reports." For two disputed invoices in the middle of a reconciliation, that is a support thread on the critical path.

45Support works inside an account without passwords

Support sees what the customer sees and fixes it there, without ever asking for a password. On Tray.ai, the runs are visible in your own workspace; the per-customer view and the scoped support role are not documented.

Open the scenario

Support asking customers for passwords is both a security problem and a delay.

50 · Operating inside a customer account without their credentials

The scenarioRowanbridge: 640 dental practices, and support still asks for logins

Rowanbridge: 640 dental practices, and support still asks for logins

Rowanbridge, a practice-management SaaS in Toronto, serves 640 dental practices. At 08:15 a practice manager in Calgary calls: recall reminders stopped going out on Friday and she has 90 patients unconfirmed for this week's chairs. Nadia, the head of support, knows the current playbook is to ask the manager to share her login or wait two days for an engineer, and the security policy Rowanbridge sells against forbids the former. Each day the clinic runs on unconfirmed appointments costs it chair time it cannot recover.

The AI switches into the Calgary account's context with its own audited access, sees what the practice manager sees, and fixes the recall automation there. Nadia's team switches in the same way, and no password is ever requested.

Concede the control Tray publishes, because it is the right one to have. "Tray's Support Access feature allows you to determine when our support team can access your workflows", with organisation-level options "User Controlled / Always On / Disabled", a recommended time limit, and sessions attributable in the audit payload through impersonatedBy. No password changes hands. Concede the visibility too, because their structure gives it. In Embedded the end customer holds no Tray account and the solution instances run in the partner's own organisation, so a Rowanbridge engineer opens the workspace logs and Friday's runs for that practice are there, filterable per workflow and searchable inside the payload: "Clicking on the search box for runs and steps will bring up a list of filters", and "Searching logs can be very useful in cases where you are trying to find the exact location of a piece of data within a complex payload." What is not published is the shape that makes it a support workflow rather than an expedition. Tray.ai does not document a per-customer view across workflows, or a role narrow enough to give a support engineer that view without workspace-wide rights. We searched the support-access-controls page, users/roles, the Embedded key-concepts pages on end users and solution instances, and Insights. Their own environment guide states the role limit, "Unable to assign different roles to users per project", next to "Cannot limit auth access per project within an environment." On that basis, assembling one customer's picture at 08:15 is manual work rather than a platform behaviour. What their documentation offers for acting on the customer's behalf is configuration rather than diagnosis: "you can run the upgrade on behalf of End Users by: Running the Config Wizard on their behalf, and just selecting the same auth on the appropriate screen", through a shareable link that is "valid for 5 minutes".

admin_switch_account

At scale, this means

Support stops being the silent tax on your margin. The question every vendor dreads, "what happened for this one customer three weeks ago," has a fixed cost of minutes, answered by one person, with the evidence still there.

Act 7 of 8

What your end customer actually touches.

Your customer sees your product on your domain here; Tray's white-labelling swaps your name into wildcards Tray allocates, and where a vendor accepts a single redirect URL their own page keeps the OAuth callback on auth.tray.io.

Your customer never sees the engine. They see a setup screen, a connect button, a status page, and increasingly, a tool their own AI can call. Whether those surfaces feel like your product or like someone else's is a brand decision you are making when you pick the platform.

46Setup screens that live inside your product

Customers set up the integration inside your product, on your domain, with no second settings screen to build. On Tray.ai, the wizard is a page Tray hosts, and iframing it needs your subdomain allowlisted by support.

Open the scenario
1
Capability 46

Customers were being sent to a third-party integration UI that broke the product experience and advertised the vendor's supplier.

FormApps: platform settings become a customer-facing interface, embedded in your own product, fully white-label

The settings that drive the integration are the interface the customer configures it with. No translation layer, no second UI to build and keep in sync. Your customers never see the platform. They think it is you.

The scenario Lumen's practice managers must connect accounting without ever seeing another company's name.

Lumen's practice managers must connect accounting without ever seeing another company's name.

Lumen, a veterinary-practice SaaS, is shipping a bookkeeping integration inside their product. The bar: a practice manager clicks "Connect accounting" in Lumen's settings, authorizes, maps two fields, done, without ever leaving Lumen, seeing another company's name, or touching a URL that is not lumen-branded. Because the practice manager is not buying an integration platform. She is trusting Lumen.

Swipe to see the whole diagram ON APIANT app.lumen.vet/settings Connect accounting Lumen's brand, Lumen's domain, settings ARE the UI ON TRAY.AI app.lumen.vet/settings iframe · embedded.tray.io their page inside yours, allowlisted by support and the hostnames are wildcards Tray allocates
On APIANT
  1. Lumen's product lead asks the AI for the connect screen and it builds one: the integration's settings become the customer-facing form, assembled from the element catalog, validation and conditional logic in place, embed code returned. Or she opens the designer and does it herself.
  2. The form and the automation are one artifact, so there is no separate UI project and no mapping layer to drift. It embeds with Lumen's styling and runs on Lumen's own domain from the entry paid tier: the setup flow, the endpoints the integration answers on, all of it.
  3. Fields refresh from the customer's live systems. The practice manager finishes in minutes. The customer's takeaway: "Lumen's integrations are great." Which is the entire point.

The customer's takeaway: "Lumen's integrations are great." Which is the entire point.

On Tray.ai

The screen your customer configures the integration on is a page Tray hosts, and getting it inside your product is a support request. Their key-concepts page gives the wizard's address as https://embedded.tray.io/external/solutions/${embeddedId}/configure/${solutionInstanceId}?code=${authorizationCode}, and the documented way to hide that address is an iframe with your hostname registered by Tray, one specific subdomain at a time.

If you wish to present the Config Wizard in an iframe, your domain will need to be added to our allowlist. Please contact us at support to arrange this. Your domain will then need to be passed in the Referrer Request Header... Wildcard domains are not supported. You need to specify / use specific subdomains.tray.ai/documentation, Embedded key concepts: Config Wizard

Concede the substance, because it is real: "This can all be done in a properly 'white-labelled' sense - i.e. the fact that you are using Tray Embedded to automate these integrations is invisible to your End Users." The practice manager needs no Tray account and no second login; she arrives on a one-time authorization code. What Tray hands you is a component rather than your own screen, and the theming ceilings are published: "It is recommended that you only make simple styling changes to the Config Wizard. Changing the layout and positioning of items may break the display and may also be subject to being overwritten by product updates." The CSS file is global across solutions, changes take "up to an hour... to fully propagate to your applications globally", and in popup mode their docs warn that the end user "is presented with a combination of the Tray loading spinner and your own branded loading spinner."

The third route is to build the screen yourself against the Embedded GraphQL API, documented as the delivery method for cases "that our config wizard is not designed for", and it costs you the wizard's own features: "you won't be able to use core Tray features like Data Mapping or Custom JS as they can only be used with the config wizard." All of it sits behind the Embedded bundle, "available to Enterprise customers as an optional add-on". Their use-case page markets the outcome as "No third-party logo, no second login, no hand-off to a vendor's portal", which holds for the logo and the login, and describes a wizard their own documentation hosts at embedded.tray.io.

Built for this, in the live inventory:/build-formform design tools
Test 01 what does your customer see, and whose name is on the URL
47Your integrations as tools your customers' AI can call

Your customers' AI assistants can drive multi-system work through your product, with an approval gate before anything destructive and a record afterwards. Your domain, every tier. On Tray.ai, every person whose AI calls a tool needs an account in your Tray organisation.

Open the scenario
2
Capability 47

Customers now want their own AI agents to reach these systems, and hand-building an interface per client does not scale.

Integrations exposed as callable tools for your customers' AI clients

The scenario A customer's operations director expects her AI assistant to reschedule bookings and notify members.

A customer's operations director expects her AI assistant to reschedule bookings and notify members.

An operations director at one of your customers types into her AI assistant: "Move every Thursday booking at the Riverside location to Friday and notify the affected members." For that sentence to become action, her AI needs a tool: a governed, authenticated, rate-limited operation that does the multi-system work and reports back. Your customers will judge your product on whether their AI can drive it.

On APIANT
  1. Ask the AI to expose the rescheduling work as a callable tool and it publishes one: any automation, at any depth, a thin pass-through or a multi-step operation spanning several systems, transforming data and enforcing business rules before returning a clean result. Your team can publish it from the editor instead.
  2. Either way the tool inherits what the platform enforces: authentication, throttling, error handling, full request logging, and where you want it, a human approval gate before anything destructive. Served white-label, on your domain, at every tier. Her AI is calling your product's tools.
  3. The bookings move, the members get notified, and the run history shows what her agent did.

The Thursday bookings move, the members get notified, and the audit trail shows exactly what her agent did.

On Tray.ai

Your customer's AI can call these tools, and every person behind that AI needs a seat in your Tray organisation. Concede the capability cleanly, because Agent Gateway is squarely this: "Agent Gateway enables you to expose Tray workflows and connector operations as tools that AI agents can use to securely execute actions across your systems", with workflows as composite tools, individual connector operations as tools, and dynamic auth shipped in June 2026 so that "MCP tools run using end-user credentials rather than shared service accounts."

MCP users must have a Tray account within your organisation. All users who execute MCP tools must have an active Tray account within your organisation. Support for users outside of Tray is on the roadmap.tray.ai/documentation, Agent Gateway troubleshooting and limitations

The requirement is on their own limitations page, and for an operations director at one of your customers it means an account inside your vendor's tenant rather than a tool your product exposes. Two further published bounds sit beside it: "OAuth2 authentication currently supports Claude Desktop", and "Detailed step-level execution logs are not currently available for connector tools", so the surface a customer's AI drives carries the thinner audit trail.

Composition has hard caps and a blunt failure mode: "Maximum callable depth | 5 levels" and "Maximum total callables across all levels | 20 (cumulative)", where on breach "Tool execution fails immediately" and "The error does not indicate which callable or which depth level caused the failure." Entitlement is a conversation rather than a setting. Agent Gateway is sold inside the Agent Development add-on, and "Agent Gateway access must be enabled at the organization level. Contact your Customer Success representative or account team to enable Agent Gateway for your organization."

Built for this, in the live inventory:pattern-mcp-tool
Test 02 judge the automation behind the tool, not the tool listing
48Form building blocks, validation and live data choices

The AI assembles the setup screen, so there is no front-end project: validated input, live choices from the customer's systems, embed code returned. On Tray.ai, wizard validation needs a support flag, and past 100 fields you build the form yourself.

Open the scenario

Configuration UIs were bespoke front-end projects, every time.

53 · Form depth: an element catalog, reusable patterns, validation, live field refresh, embed codes

The scenarioPalletworks: a carrier setup screen promised against a nine-week front-end backlog

Palletworks: a carrier setup screen promised against a nine-week front-end backlog

Palletworks, a freight-brokerage SaaS in Rotterdam, is rolling a carrier-billing integration out to its 260 broker customers. The setup screen has to pull each broker's live carrier list, validate SCAC codes before anything saves, and hide half its fields unless the broker uses a factoring company. Their two front-end engineers are nine weeks deep in an unrelated backlog, and the head of product promised the screen to the three largest brokers, whose renewals all land in the same week.

The AI assembles the setup screen from an element catalog and saved patterns: input validated before it saves, choices pulled live from the customer's systems, embed code returned. Adjust it in the designer yourself; the same form either way.

The wizard covers an ordinary configuration screen well, and the two things this scenario turns on, validation before anything saves and a screen that stays usable at scale, are the two Tray routes elsewhere. Grant the building blocks: auth slots, config slots, screen elements, and dropdowns backed by DDL lookups that read the broker's live carrier list with the broker's own credential. Validation is the thin part. Field-level logic in the wizard is Custom JS, and Custom JS is a ticket: "If you wish to use Custom JS please contact support to arrange turning on the feature flag." Where a lookup does not exist, the documented fallback opens the field rather than constraining it: "Allow custom values: If checked, the end user can write a custom value in the dropdown list", with Tray's own note that it is "turned off by default as, with some service operations, it can cause errors by allowing users to enter invalid values." We searched their config-wizard, config-slots, auth-slots, delivery-method and Custom JS pages and found no published declarative validation rule set on a config slot. Scale has a published ceiling and a published answer, and the answer is a front-end project. Tray uses 100 mapped fields as the worked case, and the route from there is "build your own form experience, leveraging our API's". Taking it drops the mapping surface with it: "you won't be able to use core Tray features like Data Mapping or Custom JS as they can only be used with the config wizard."

49Chat agents that actually do the work

The assistant you ship resolves requests instead of deflecting them: real lookups, real writes, an approval gate before anything destructive, full logs. On Tray.ai, the in-product chat surface is an endpoint on a Tray host that you wrap yourself.

Open the scenario

A chatbot that cannot act is a deflection tool, not an integration.

55 · Conversational agents with goals and tools, the whole platform behind them

The scenarioAldergate: a resident agent that answers at 11pm but cannot act

Aldergate: a resident agent that answers at 11pm but cannot act

Aldergate, a property-management SaaS in Toronto, ships a resident chat agent to 1,900 building managers. Last month it handled 6,400 conversations and 2,100 ended as after-hours callbacks: when a tenant asks at 11pm to move Thursday's plumbing visit, the agent can offer a help article and an on-call number, and that is the end of what it can do. The head of support is now being asked why an agent the company markets as an assistant still wakes a superintendent up.

The AI builds the agent you ship: explicit goals, scoped tools, each tool an automation you can open and read. Or you wire the goals yourself. It acts through the same governed engine as everything else: real writes, approval gates, full logging.

An agent that takes action exists on Tray, and the part this scenario turns on, a resident chat surface inside your product with your name on it, is code you write against an endpoint on a Tray host. Grant the acting part: Merlin Agent Builder gives agents workflows as tools, which is the distinction that matters, and their docs put it plainly, "Let your agent perform tasks by running chosen workflows, everything from running data queries to creating tickets to sending notifications." The published channels are Slack, Microsoft Teams and an HTTP endpoint, and the endpoint is what a branded widget would have to be built on. We searched Agent Builder's interaction-channels, getting-started, configuration, tools, testing and logs pages, plus the platform, developer and help documentation bundles, for a drop-in brandable web chat widget, and found no published statement. Access and diagnostics are both narrow. Every page of the section carries the same gate, "If you're interested in this feature, please reach out to your Customer Success Manager or Account Executive", and it is sold inside the Agent Development add-on. Agent logs are an "Early Access Feature" that is "currently available to a limited set of users and may change before general release", and in testing there is "No persistent history, each test session is independent." For 1,900 building managers whose tenants type at 11pm, the operating record is the part that has to be there.

50Your brand and domain on every surface

Every surface a customer's IT team inspects, screens, addresses, callbacks, carries your name on every plan. On Tray.ai, the de-branded hostnames are wildcards on apexes Tray allocates.

Open the scenario

An integration layer that shows a supplier's name tells your customer who really built it.

56 · Full white-label: your brand on the interface, your domain on the endpoints

The scenarioFenmark: a 1.4M insurer deal meets question 41's hostname list

Fenmark: a 1.4M insurer deal meets question 41's hostname list

Fenmark, a claims-management SaaS in Des Moines, sells to 130 regional insurers and is 48 hours from signing a 22-state carrier worth 1.4 million dollars a year. Question 41 of the carrier's security questionnaire asks the IT director to list every hostname claim data touches, and Fenmark's VP of engineering knows the webhook receiver and the authorization callback both answer on a domain carrying someone else's name. The claims supervisor who championed Fenmark internally is about to be asked who that other company is.

Ask the AI which hostnames the integration answers on and it lists them off the connectors and the embed code. Every surface a customer's IT team inspects, the screens, the webhook URLs, the authorization callbacks, carries your name, at every tier.

You can take Tray's name off most of what your customer sees. What no published mechanism gives you is question 41 answered with hostnames you own. Concede the white-labelling, because it is genuine: the end customer holds no Tray account, no Tray-branded email reaches their inbox, and no tray.io hostname needs to appear in your own application's API calls, since "The Tray GraphQL API is a backend API only and calls must be invoked server-side. Client-side Javascript calls to the API should not be made as they will be blocked by CORS." What is on offer is de-branding on domains Tray controls. The wizard and auth dialog default to embedded.tray.io and move into a slot in a wildcard, and webhook receivers work the same way with the verb left in Tray's hands: "If you wish to remove the trayapp.io suffix it is possible to use the de-branded *.integration-hook.com suffix instead... You can then confirm before you are allocated an integration hook url." There is no CNAME, no DNS verification and no domain-add flow in the Embedded documentation. The Whitelabelling section runs to five pages, and none of the five documents a domain you own; two of them document substituting Tray's own wildcard apexes for Tray's default hostnames. The OAuth callback is the surface most likely to keep the vendor's name in the address bar, and Tray publishes the condition: "If the service does not support the entry of multiple redirect urls for custom apps in the US, it will be more difficult to use custom whitelabelled url domains. This is because Tray will only authorize apps which use the default https://auth.tray.io/oauth2/token redirect url." Where that applies, their documented fallback is "an alternative (but not 100% whitelabelled workaround)" that sends the browser back to auth.tray.io. API management is explicit: "It is not currently possible to whitelabel the base url for your API management projects." Their use-case page promises "No third-party logo, no second login, no hand-off to a vendor's portal", and even that page claims no customer-owned domain. So the list the IT director hands the carrier reads: your domain for your app, plus a configuration host, an authentication host and a webhook host on three apexes Tray allocates.

At scale, this means

The integration experience compounds into your brand instead of your supplier's. Every setup flow, every status page, every AI tool call is a moment your product looks finished, in your customer's language, on your domain.

Act 8 of 8

The layer that operates all of the above.

Day two is the AI's job here; Tray's documentation groups Headless as workflows, projects, connectors, authentication, validation, and run and debug, their product page as "Build, Connect, Validate, Configure", and neither grouping covers a run already in flight, or one fix shipped to a fleet.

Everything on this page is exposed to AI, but "AI-powered" is the emptiest phrase in the category. The question with teeth: which phases of the integration lifecycle does the AI have real tooling for? Building is one phase. There are seven more.

51AI runbooks for the whole integration lifecycle

One person and the AI cover an integration's whole life, launch through incidents. Elsewhere the AI diagnoses, then a developer does the fixing. On Tray.ai, the published agent groups end at run and debug: no group covers a run already in flight or a fleet push.

Open the scenario
2
Capability 51

An AI with raw API access improvises. An AI with encoded procedures repeats what works.

A skill set where every skill encodes a procedure a senior integration engineer would follow, spanning setup, build, edit, test, deploy, monitor, support, and incident response

The scenario Day two, live integration: a complaint, a rate limit, a fix to ship.

Day two, live integration: a complaint, a rate limit, a fix to ship.

Day two. The integration is built and live; both platforms' AI tooling got you here, and both did it well. Now the real career of an integration begins: a customer reports a discrepancy, an API starts rate-limiting, an alert needs tuning, a fix needs to reach the fleet. The question for the AI is no longer "can you build it." It is "how much of what happens next can you handle?"

Swipe to see the whole diagram SETUPBUILDEDITTESTDEPLOYMONITORSUPPORTINCIDENT APIANT TRAY.AI no tool for a run in flight, and none for a fleet push
On APIANT
  1. Ask for it in words and the AI runs the encoded procedure, the same one a senior APIANT engineer follows, with verification steps rather than improvisation. Find the customer's run by searching execution history on her email, read the failing step's data, throttle the carrier connection, map the error at step level and log the suppression, then deploy the fix to the affected accounts.
  2. Deploys and the group kill switch return a plan and write on confirmation. Or do any of it yourself in the console. Either way the change lands on the same artifact, and version history lists what changed and compares it against the version before, which is also how a reversal happens: redeploying a version you kept, on purpose. Build is one procedure out of 42.
  3. Day two has its own: diagnose, alert hygiene, kill switch, fleet upgrade. One person and the AI cover the lifecycle.

One person and the AI cover the lifecycle. Day two looks like day one.

On Tray.ai

Concede this one plainly, because it is the strongest agent surface in the comparison set. Tray Headless is on their pricing page under "Included in all plans", it does not stop at build, and its debug loop is purpose-built: list_workflow_executions, get_workflow_execution and get_workflow_step_detail, with get_workflow_execution written to catch the case where a parent reports success while a child callable failed silently. Their documentation groups the surface as build and edit workflows, projects, connectors, authentication, validation, and run and debug. Their product page groups it as "Build, Connect, Validate, Configure". One operate-adjacent lever belongs in the concession too: update_workflow_metadata accepts an enabled flag, so an agent can turn a workflow off for future runs, except on shared logic where their plugin notes "Tray prevents update_workflow_metadata({enabled: false}) on a callable."

Run and debug: fire a workflow against the live workspace, list its executions, read an execution, and drill into a step's input and output.Tray documentation, Tray Headless for Claude Code, the last of the six capability groups their docs list (seen 2026-08-20)

What neither grouping reaches is the run that is already moving, the version you want back, and the fleet. Stopping a job in flight is a button in the Tray UI: "All running executions of the workflow will be stopped once the current step for each execution is completed", with no endpoint in either published OpenAPI spec and no agent tool. Version work is a builder feature bounded at "up to 30 days prior to your current changes", with no version tool on the agent surface. Keeping a connector current is deliberate manual work per workflow: "When a new connector version is available and you are using it in a workflow, you will need to manually update it yourself. We do not allow automatic version updates because there is a risk that it may break your workflow." And reading what the platform cost you is outside what Tray automates at all: "It is not currently possible to build Tray workflows which monitor and report on usage."

Shipping one corrected integration to an installed base has two published paths and neither is a single action. A non-breaking change propagates as a "lazy update, with a delay of approx 2 minutes from release", and "If a source workflow runs on a scheduled trigger it won't happen until the next scheduled run." A breaking one is your application code: "Query all the instances of the solution using Get Solution Instances", then "Loop and upgrade each one using the upgradeSolutionInstance mutation", a mutation that takes one solutionInstanceId per call, ending with "Notify the end users of these instances to run the config wizard." The multi-tenant layer that path lives in is a separate purchase: "The Tray Embedded bundle is available to Enterprise customers as an optional add-on."

Built for this, in the live inventory:all 42 skills · 10 workflowsall 138 tools · 10 toolsets
Test 02 ask which lifecycle phases have tools, never how many tools
52Only the tools the current job needs

Give an AI forty similar-looking tools and it picks the wrong one. Here it sees only the handful this job needs. On Tray.ai, focus comes from splitting servers up front and disabling tools by hand.

Open the scenario

Depth and focus are in tension: an AI drowning in tool definitions gets worse, not better.

58 · A deep tool surface, activated on demand

The scenarioHalvard Logistiek: one integration lead retuning load tenders before a 3,400-load weekend

Halvard Logistiek: one integration lead retuning load tenders before a 3,400-load weekend

Halvard Logistiek, a Rotterdam freight brokerage moving 3,400 loads a week, runs 61 automations across nine carrier APIs with a single integration lead, Sanne de Vries. At 16:40 on a Friday she asks the AI to retune a load-tender mapping before the weekend peak, and that one session has to touch the connector, the automation, a test run, and the alert rules. Every irrelevant tool put in front of the AI is another way for it to reach for the wrong one on a change 40 dispatchers depend on by 05:00 Monday.

Sanne asks for the retune and the session loads that procedure with the tools it needs, the connector and mapping edits, a test run against real data, the alert rules, not all 138. The rest stay one request away when the job widens. Or she makes the same edits in the editor herself, on the same automation either way.

Tray publishes the problem and hands the remedy to the operator as a design decision made up front. On the same page they put a figure on it: beyond 15 to 20 tools per MCP server they say clients take longer to select the correct tool, selection accuracy decreases, and the risk of incorrect invocation rises. That page covers the MCP servers a Tray customer publishes for their own agents, which is the Agent Gateway add-on, and it is the clearest published statement Tray makes about tool crowding. Where an operator wants a narrower catalog, Agent Builder's control is a switch someone throws: "When a tool is disabled, the agent won't see it or consider it when selecting tools to complete a task." On the Headless surface itself, 24 tools is a compact catalog and the skill routing is real: "The plugin loads the right skill automatically based on what you ask." What that routing changes is the instructions the model reads. The tool surface behind it stays as it is, because the plugin "Adds no tools of its own" and "These are the same tools Tray Headless MCP exposes." So the crowding question is answered by how many servers you decided to stand up, and by which tools a person switched off, rather than by what the current job needs.

53AI checks the manual before it acts

The AI grounds itself in documented behavior before it acts, rather than in its best guess. Elsewhere the reference is shipped once and ages in place. On Tray.ai, the manual is a corpus the client fetches and a guide file you keep current.

Open the scenario

An agent that guesses at platform behaviour produces plausible nonsense.

59 · The documentation as a corpus the AI consults before acting

The scenarioKentmere College: a waitlist branch added mid-enrollment, 900 enrollments an hour riding on it

Kentmere College: a waitlist branch added mid-enrollment, 900 enrollments an hour riding on it

Kentmere Community College in Ohio enrolls 11,400 students through a two-week window every August, and its student-information integrations are maintained by a single registrar's-office analyst, Dana Ruiz. On day two of the window she asks the AI to add a waitlist branch, which requires knowing exactly how the platform treats a scheduled trigger that fires while a run is still in flight. A confident guess about platform behaviour, applied at 900 enrollments an hour, is not the kind of thing she gets to discover quietly.

Dana asks how a scheduled trigger behaves while a run is still in flight. The AI queries the documentation corpus as a step in the procedure, answers from what is documented, and builds the waitlist branch on that. Or she searches the same corpus herself. Either way the branch rests on the platform's behaviour today, not on a guess.

Grounding on Tray is genuine and should be said before anything else. They publish a machine-readable corpus of their whole documentation set, 184 platform pages, 60 developer pages, 10 help pages and the release notes, all fetchable as clean markdown. The plugin also ships reference skills whose job is exactly this: tray-connectors carries connector names and versions, the property type-wrapper format and common jsonpath shapes, and tray-gotchas is a "Debugging guide for known edge cases and tricky surfaces." What is not published is a documentation lookup the platform answers while the agent is working. The corpus is something the client fetches, the skills are Tray-authored files that ship with the plugin, and for CDK work the reference is a file the developer downloads and keeps current: "The TRAY_CDK_GUIDE.md file is versioned alongside the CDK documentation." Tray does build run-time docs tools, which is the fair way to state this: their Helix CLI ships a tray_get_documentation tool. The published Headless tool list is workflows, projects, connectors, authentication, validation, run and debug. Currency is therefore the reader's problem, and it is checkable today. The Tray Headless product page still answers "What are the six built-in skills for Claude Code and Codex?" with a list including set-workspace, which the shipped plugin removed. An agent grounding itself on the corpus reads whatever the page currently says.

/docs · docs_chat

54The AI reports platform bugs it hits

The AI files the platform defect it hits, so it gets fixed instead of papered over by an undocumented workaround. On Tray.ai, the documented route is a support portal and a Slack message.

Open the scenario

Agents silently working around platform bugs means the bugs never get fixed.

60 · A toolchain that reports its own defects

The scenarioTessellate Mutual: silent AI workarounds becoming next hail season's undocumented 2am problem

Tessellate Mutual: silent AI workarounds becoming next hail season's undocumented 2am problem

Tessellate Mutual, a Kansas crop insurer, pushes 14,000 hail claims through its adjuster platform in the six weeks after storm season, and a two-person automation team rebuilds the intake flow every spring. When the AI hits something in the platform layer that behaves differently than documented, the cheap move is to route around it and keep shipping, and that detour becomes permanent, undocumented, and somebody's 2am problem next hail season. Claims supervisor Marla Boyd has already inherited three such detours and cannot tell which were deliberate.

The AI files the defect itself: a structured report to engineering, autonomously, instead of routing around it and shipping. Or Marla files one from the same session. Either way the detour becomes a record with the defect attached, not an undocumented workaround somebody inherits. The tools get better because the agent using them is also their reviewer.

When the agent hits something in the platform rather than in the integration, the route Tray documents is a person writing it up and assembling the evidence by hand: the server URL, the tool name, the error text and the execution IDs pulled out of the workflow logs. Support ticket creation has its own documented page and its own human steps. For their build copilot the published channel is product feedback rather than a defect record: "Don't hesitate to share your thoughts using the in-app feedback form or reach out to us directly on Slack", and Tray describes the loop as "analyzing user feedback data via the thumbs up and thumbs down responses." Both are useful. Neither produces a tracked item an operator can point at next week. The knowledge that flows the other way is Tray's to author. tray-patterns and tray-gotchas are Tray-written reference files shipped in their public plugin repository, at v2.0.1 on 2026-08-19, which is a real institutional memory and an actively maintained one. They install into your own plugin directory, so an agent can append a quirk to them locally; what Tray publishes is the repository the shipped versions come from, so carrying a local note through a plugin update is your team's housekeeping rather than a platform behaviour. And no tool in the published surface files the platform defect itself: the documented channels are the in-app thumbs, Slack and the support portal.

/report-mcp-issue

At scale, this means

The AI is not a build accelerator bolted to the front of the lifecycle. It is a colleague with a runbook for all of it, which is why one person can run what used to take a team.

What you just read

Fifty-four capabilities. One pattern.

Every row on this page reduced to the same fork. On APIANT the job was a walkthrough: ask for it, watch it get built at whatever depth the API allows, prove it, ship it, and change it later without a rebuild. On Tray.ai the same job was reachable when someone had already built the piece you needed, at the depth they chose to build it, and priced by how many records moved through it. Not because their product is careless. It is the most widely used automation tool in the world and it is genuinely fast to a first result. But its integrations are assembled from operations that people hand-authored one at a time, so what you can automate is bounded by what someone else already decided to expose, and what it costs grows with the volume you push through it. On APIANT the connector is generated from the API's own documentation and stored as data, which is why depth is not a roadmap request, a missing operation is a working session, and the thing you end up owning is an asset your team can read rather than a subscription to someone else's catalogue.

The two questions a sharp CTO asks next

Good questions. Better answers.

"What happens when your data model doesn't express something I need?"

Then you write code, in the one place code belongs: a scripting escape hatch that slots in as a single node of the structured document. Code is an optional leaf inside a data document, never the foundation. The loop, the branches, the mappings, the tests around that leaf all remain visible, machine-editable, and compiler-checked; the custom logic is contained to the one spot that genuinely needed it.

Compare the shape of the same answer elsewhere: when the model runs out, the escape hatch is more code on a foundation that is already code. The exception and the rule are indistinguishable. Here, the exception stays the exception, and a decade of production has kept it rare.

"What if I'd rather own the code?"

Own the outcome, and be precise about what owning the artifact costs. A code integration is cheap on day one and priced like a liability thereafter: it is reviewed by whoever has time, it carries a dependency tree that ages, every API drift re-opens it, and its real documentation is the memory of whoever wrote it. Multiply by every integration you will ever ship, then by the years you will run them, then subtract the engineers who will have moved on. That is the asset you would own.

What you own on APIANT is the thing you actually wanted: integrations that run, on your domain, inspectable by your team, provable before they ship, and operable by AI for as long as you run them. The buildings your company works in are owned this way too: you own the use of something built and maintained by people whose whole business is that it never falls down.

The next step is smaller than a sales cycle

Bring us the integration you think can't be done.

The API with no catalog entry, the forty custom fields, the sync that loops, the customer report from three weeks ago. One working session, on your systems, and you watch it built, tested on every branch, and running. Judge the architecture with your own scenario, which is what this page has been asking you to do all along.

Book a working session See the AI operate the platform

Sources for Tray.ai statements

Scenario companies on this page are composite illustrations drawn from real deployment shapes. Company names are fictional and are not customer references. Where a figure comes from a live APIANT deployment it is identified as such and the customer is not named. Every statement about Tray.ai on this page derives from Tray.ai's public documentation, help centre, developer platform docs and pricing page as reviewed in August 2026. Direct quotes are reproduced verbatim for comparison purposes. Tray.ai is a trademark of Tray.ai, Inc.; all product names belong to their owners. Platform capabilities evolve; verify anything decision-critical against the current versions of the linked pages.