Three of the four shipped connectors offer some way to accept inbound collaboration requests without an agent, and the fourth deliberately does not. They disagree completely about when that is a good idea — and the disagreement is worth understanding, because accepting a case is not a routing step. It is a promise to another company.
The reframe
It is tempting to read /approval as "route this to my team". It is not. Accepting a collaboration request tells the partner that an engineer is engaged on their problem, and it satisfies the response SLA at the same moment. Those two effects pull in opposite directions, and that tension is the whole subject of this page.
| Accepting does this | Which means |
|---|---|
Sets responded to true | The platform stops tracking respondBy. Your SLA obligation is met — the clock is off. |
| Records an engineer against the case | The partner sees a named contact and a case number, and reasonably expects work to be happening. |
| Moves the case out of OPEN | Reject and Request-information are no longer offered by the shipped connectors once a case is accepted. The triage decision has been made. (Connector behaviour — the API page does not state this rule itself.) |
So automatic acceptance buys guaranteed SLA compliance and spends credibility. If your rule accepts something nobody is going to work, the clock stops and the partner waits — which is a worse outcome for them than an honest breach, because a breach is visible and a false acceptance is not.
The spectrum
Every inbound case is accepted the moment it arrives. No condition, no lookup, no check that the request is one you can act on. Ships as a built-in setting, off by default.
Buys: the SLA can never be breached. Spends: every case is a promise, including the ones that turn out not to be yours.
Look for a case that already exists for the partner's case number; fall back to the customer name. On a match, create and relate the local case and accept.
Buys: re-collaboration on a known issue attaches to the right place instead of opening a duplicate. Spends: says nothing about entitlement.
Resolve the request to an asset you actually have a record of. On a match, create the case and accept. On no match, ask the partner for more information instead of accepting.
Buys: acceptance means something checkable. Spends: needs clean asset data, and an unmatched request waits on the partner's answer while the clock runs.
Automation drafts and proposes; a person accepts, declines or asks for more information. The commitment stays with a human even when the answer is machine-generated.
Buys: no promise is made that nobody chose to make. Spends: the SLA clock runs until someone acts.
Implementations
Since app v1.0.69 there are two paths, split by policy. Accepting everything is a built-in app setting — Auto-accept inbound requests, off by default — that accepts each inbound case the moment its ticket is created, with your ticket number as the case reference. It is deliberately unconditional, and toggling it takes effect only after a bundle redeploy. Accepting conditionally stays with a Zendesk trigger on the TSANet Action field, which rides the optional field-actions feature: fire on ticket creation, condition on the inbound tag, action sets TSANet Action to Accept. Both run server-side, so no agent needs to be logged in, and both are verified end to end — the partner sees the case accepted roughly fifteen seconds after submitting it.
Crucially, trigger conditions are the scoping mechanism. A condition on the partner field turns "accept everything" into "accept everything from this partner" — which moves you along the spectrum without writing anything. Cases that do not match simply stay open for normal triage.
The shipped template, Trigger Handler (Asset), is the most opinionated of the four. It ships deactivated, for you to clone and activate. It fires on TSANet Case creation where direction is inbound and no local case is linked:
Get Asset as shipped, Asset Name = the case's email field
└─ no match → send the partner an information request
└─ match → continue
Create the Salesforce Case
Link it to the TSANet Case
Approve the collaboration request
Notify the case owner
Asking on no match is the entitlement check in its softer form. A partner escalating about something you have no record of does not become a case your team owns. It gets a question back straight away instead of a silent wait.
Release-v2.13 and 2.14: the no-match branch calls the Request Information automation. If rejection is your policy, it is a one-element change in your clone. Replace the lookup while you are there, because matching an Asset Name against an email field is a placeholder. Details on the Salesforce page.Auto-routing is a feature toggle rather than a flow to activate, and it solves a different problem: not "should we take this" but "where does this belong". It searches for an existing case by the partner's case number, falls back to a customer-name lookup, and on a match creates and relates the local case before approving.
Matching on the partner's own case number first is what makes re-collaboration on a continuing issue attach to the same case rather than opening a duplicate. That is worth having even if you never intend to auto-accept.
The gateway-class connector takes the opposite position and states the reasoning explicitly: accepting, declining and requesting information are contractual commitments to another vendor, made under a service-level clock. Automation composes the answer; a person makes the commitment.
There is a second reason specific to AI-assisted flows. Partner escalations carry end-customer logs and text pasted in verbatim — untrusted content arriving at a system that would then reply under your company's name. Keeping a human on the commitment is also a containment boundary.
Designing yours
The Salesforce flow is the useful template even on other platforms, because its shape generalises: resolve an identifier, branch on whether you found it, and decide what no match means. What varies is the identifier.
| Match on | Asserts | Fails when |
|---|---|---|
| Asset or serial number | We support this specific thing | Asset records are stale or the partner quotes a different identifier |
| Entitlement or contract | This customer is covered right now | Coverage lives in a system the connector cannot reach |
| Partner identity | We have an arrangement with this company | Says nothing about the specific request |
| Existing case number | We are already working this issue | First contact on a new issue never matches |
| Product or component | This is a thing our team owns | Field is free text and partners fill it inconsistently |
Two design rules worth adopting whichever identifier you pick:
Failure modes