A guide to Zapier's ceiling and what sits past it

Zapier workflow automation ends where the public API ends. There is a three-line spec for picking up the rest.

Zapier is excellent at one job: moving structured data between SaaS apps that publish a REST API. The moment a workflow has to touch SAP GUI on a Windows desktop, a Jack Henry green-screen at a community bank, or a clinical screen in Epic that nobody has ever exposed through FHIR, Zapier has nothing to plug into. This page walks the shape of that ceiling, the three-variant trigger union in Mediar's executor that defines the hand-off, and the concrete pattern teams use to compose the two so the Zap fires the desktop step it could not run itself.

M
Matthew Diakonov
13 min

Direct answer (verified 2026-05-01)

Zapier connects apps via REST APIs and does not directly automate Windows desktop apps like SAP GUI, Jack Henry, Fiserv, Epic, or Oracle EBS, because those systems do not publish a public REST endpoint for the screens an operator actually fills in. The standard pattern is to use Zapier for the SaaS-to-SaaS half and fire a Webhooks by Zapier POST to a desktop runtime that does the desktop half. Mediar exposes webhook as one of three first-class trigger types (cron, manual, webhook); the union is defined in the open-source desktop agent at github.com/mediar-ai/terminator.

The shape of the ceiling

Every Zapier integration is a connector, and every connector is a REST or RPC client wrapping someone else's public API. The Salesforce connector talks to api.salesforce.com. The HubSpot connector talks to api.hubspot.com. The Google Sheets connector talks to sheets.googleapis.com. When the connector exists, the Zap is one form away from working. When the connector does not exist, the Zap is, structurally, not the tool.

The places connectors do not exist are not random. They cluster around systems that predate the public REST era and around proprietary desktop clients that never were re-platformed. A non-exhaustive list of where Zapier hits its ceiling on enterprise workflows we see:

  • SAP GUI on Windows, including SAP Business One and the green-screen flows in S/4HANA that ops teams actually use day to day. The data eventually gets to SAP servers, but the path through the GUI is what an operator drives, and there is no equivalent public REST.
  • Jack Henry, Fiserv (Premier, DNA), and FIS core banking platforms. The screens that open accounts, post wires, and run end-of-day are Windows desktop terminals reached through private host protocols that banks do not expose to a SaaS orchestrator.
  • Epic, Cerner, eClinicalWorks. FHIR covers some patient data; it does not cover the order-entry, charge-capture, and check-in screens that a medical assistant actually fills out twenty times a shift.
  • Oracle EBS, JDE, PeopleSoft forms-based clients on Windows. Some have a SOAP face; the day-to-day clerk-facing screens are not on it.
  • Mainframe terminals (3270/5250 emulators), insurance carrier policy admin clients, and the long tail of homegrown internal tools that were written in Delphi or VB6 and have not changed since. No public API. No connector. No Zap.

A workflow whose only desktop hop is one of those is the workflow that stalls on Zapier and gets quoted at $500K by an enterprise RPA vendor. The reason it stalls on Zapier is structural; the reason it costs $500K elsewhere is not.

The three-line trigger spec

The hand-off point that turns a desktop runtime into something a Zap can talk to is a webhook trigger. In Mediar's desktop agent, webhook is a literal type, defined alongside cron and manual as a TypeScript discriminated union. There is no fourth case. The full definition fits on a screen and is what every workflow author writes against.

apps/desktop/src/lib/typescript-workflow-parser.ts

The same union is what the desktop scheduler dialog reads at apps/desktop/src/components/ui/scheduler-dialog.tsx:13 when it renders the cron builder, the manual run button, and the webhook URL panel. Two facts follow from this being a discriminated union and not a feature flag. First, the executor branches on the discriminator; a workflow with trigger: { type: "webhook" } gets a stable URL provisioned automatically, no extra SKU. Second, an author can switch a workflow from cron to webhook by changing one field in src/terminator.ts; the runtime, the queue, the source loader, the per-execution timeout, and everything else stays the same. The union is the contract a Zap (or any other orchestrator) signs.

The bridge, on the wire

The composition is one HTTP POST. The Zap does whatever Zapier does best: trigger on a SaaS event, reshape the payload, route it to the right downstream. Then, instead of trying to drive SAP itself, it calls the desktop runtime and lets the runtime drive SAP. The wire trace looks like this:

ZAP -> MEDIAR -> SAP

SaaS sourceZapierMediar webhookMediar agentSAP GUINew row eventFormat payloadPOST webhook /runLease executionopen SAP, type, clickok200 + execution_idexecution_idwrite back to row

The Zap is the orchestrator; Mediar's desktop agent is the worker. Read the diagram bottom-up and the responsibilities split cleanly: Zapier owns identity, retries, and the SaaS-to-SaaS half; Mediar owns the desktop session, the legacy app, and the half that required a Windows machine in the first place. Neither side is doing the other's job, which is why the seam is small enough to fit on a wire diagram.

The same bridge, walked step by step

1

Zap fires on a SaaS event

Standard Zapier territory. The Zap's trigger is whatever Zapier already integrates with: a new Salesforce opportunity, a new HubSpot deal, a new row in a Google Sheet, an inbound email parsed by Email Parser, a Stripe invoice paid. Zapier handles the API auth, the polling, and the dedupe.

2

Zap formats the payload

A Formatter step shapes the SaaS event into the inputs your desktop workflow expects. This is where you map { Account_Name, Invoice_PDF__c } onto { vendor_id, invoice_pdf }. Done in Zapier's Code by Zapier or Formatter steps, no custom hosting required.

3

Zap calls Webhooks by Zapier (POST)

Zapier's built-in Webhooks app posts JSON to your Mediar workflow's run endpoint. The endpoint is keyed by the workflow's uuid; the bearer token is an MCP_SERVICE_TOKEN you generated once in the Mediar dashboard. Zapier retries on transient 5xx, so this leg is durable.

4

Mediar's queue picks up the row

The desktop agent's QueueProcessor sees a new execution row whose trigger discriminator is webhook. It leases the row to one machine via the hostname-{uuid} identity, pulls the workflow source from a pinned GitHub release, starts a 600-second tokio::time::timeout around the dispatch, and hands the inputs to the executor.

5

The executor drives the desktop

Every step (open_application, type_into_element, click_element) goes through MCP at http://localhost:3000 to the Windows accessibility API. SAP GUI, Jack Henry, Epic, Oracle EBS: nothing about the trip from Zap to vendor field cared whether the destination app had a REST API. It did not.

6

Result returns; Zap continues

The webhook response carries { ok, output, execution_id }. A subsequent Zap step writes the execution_id back to the source row, posts to Slack on failure, and updates a status column. The Zap is the orchestrator; Mediar is the worker for the half Zapier could not reach.

What the two sides actually look like in code

The Zapier side is a Zap whose action is Webhooks by Zapier with a POST to the Mediar workflow's run URL. The Mediar side is a workflow file in source control whose trigger is the webhook variant of the union above. Toggle between them; the things to notice are how thin the Zapier side is and how unaware the Mediar side is of who called it.

ONE WEBHOOK, TWO HALVES

// A Zapier "zap" that fires a Mediar workflow
// Trigger: New row in Google Sheets (Zapier connector)
// Action:  POST webhook (Zapier's built-in "Webhooks by Zapier")

POST https://<your-mediar-host>/runs/<workflow-uuid>
Authorization: Bearer <MCP_SERVICE_TOKEN>
Content-Type: application/json

{
  "inputs": {
    "vendor_id":    "{{spreadsheet_row.vendor_id}}",
    "invoice_pdf":  "{{spreadsheet_row.invoice_pdf_url}}",
    "post_to_sap":  true
  }
}
-53% halves of the same composition

The Mediar workflow does not import a Zapier SDK, does not check a Zapier signing secret, and does not branch on whether the call came from Zapier, Make, n8n, or curl. Its only contract is the trigger discriminator and the input schema. That is what makes the bridge orchestrator-agnostic in practice; the same desktop workflow can be driven by a Zap on Monday and by a Postgres pg_net POST on Tuesday.

$0.75/min

Mediar runtime is billed at $0.75 per minute of execution. A 30-second SAP post triggered by a Zap costs about 38 cents on the Mediar side, regardless of how many users kicked the Zap off. There is no per-bot license and no per-process license; the webhook URL is part of the workflow, not a separately priced SKU.

Mediar pricing, current as of 2026-05-01

Three patterns this composition keeps showing up in

The shapes below are not hypothetical. They are the three Zap-to-desk shapes we keep seeing across F&B, insurance, and community banking. None of them require a Zapier connector that does not exist. All of them require something Zapier does not ship: a desktop agent that can drive a Windows app.

1. Sheet to SAP B1 invoice post

A regional F&B chain's AP team logs incoming vendor invoices in a Google Sheet. The Zap watches the sheet for a new row, formats the row into { vendor_id, invoice_pdf, amount }, and POSTs it to a Mediar workflow. The Mediar workflow opens saplogon.exe, navigates to the AP module, types the fields, attaches the PDF, posts the invoice, and returns the SAP document number. A second Zap step writes the document number back to the sheet. We moved an LG-customer chain from UiPath to this exact pattern; their CFO told the board they are now saving 70% on costs.

2. Inbound email to Jack Henry account open

A community bank's onboarding email lands in a shared inbox. A Zap parses the email with Email Parser, validates the customer record against a CRM step, then POSTs the parsed fields to a Mediar workflow. The Mediar workflow drives the Jack Henry teller terminal, opens the account, sets the right product code, prints the welcome packet, and returns the new account number. The Zap routes the account number back to the CRM and to a Slack channel. Onboarding at one regional core went from 8 weeks to 2 weeks on this pattern.

3. PDF claim to insurance carrier desktop intake

A mid-market carrier receives FNOL PDFs by email. A Zap routes the PDF's URL to a Mediar workflow. The Mediar workflow extracts the fields directly from the PDF, opens the carrier's policy admin desktop client, types the fields into the claim screen, attaches the PDF, and assigns the claim by line of business. Claims intake went from 30 minutes per claim to 2 minutes. That is $750K per year on AP-team headcount math, not press-release math.

What unifies the three is that the Zap is short, the Mediar workflow is the part that does the work no SaaS-to-SaaS connector could have done, and the seam between them is a single POST. Adding a fourth shape (HubSpot deal-won to Oracle EBS, Stripe invoice paid to a regional ERP, a webhook from a vendor portal to a homegrown desktop tool) is the same composition with the SaaS connector swapped.

Honest limits

The composition is not free. The seams that earn most of the support tickets are predictable, and a buyer who is honest about them in design beats a buyer who is honest about them in production.

  • Identity on the desktop side. The Mediar agent runs as a real Windows user with a real session. That user has to be logged in to whatever the desktop app needs: SAP, the banking core, the EHR. A locked screen at 2 AM kills the run. Plan for a dedicated unattended-bot user with the right role and a screen-lock policy that does not blank the session out.
  • Modal dialogs that only appear once. Many legacy apps show a one-time-per-day dialog (legal disclaimer, login warning, license reminder) that the recorder did not see on the day it captured the workflow. The fix is a recorder pass on a real machine and a fallback step in the workflow; it is not a Zap problem and not a Zapier-side fix.
  • Payload size on Webhooks by Zapier. Zapier caps payloads on the webhooks action. For invoice PDFs, do not send the bytes; send a URL the Mediar agent can fetch. The Mediar workflow does the download server-side, then drives the desktop with the local file path.
  • Latency budgets. The webhook POST is synchronous up to the per-execution timeout (600 seconds in the queue processor's tokio::time::timeout). For workflows that take longer, the right shape is a queued webhook that returns immediately with an execution_id, followed by a poll step in the Zap. The runtime exposes both shapes; picking one is a workflow design question, not a runtime question.
  • Compliance and audit. Two systems mean two audit logs. Zapier's task history covers the Zap; Mediar's execution history covers the desktop run. A real audit query crosses the seam. Mediar is SOC 2 Type II certified and HIPAA compliant on its side; Zapier publishes its own posture. For a regulated workload, plan for the seam in the audit story up front.

Bring the Zap that stops at SAP

If you have a Zap that already works for the SaaS half and a desktop step that has stalled, we will wire the webhook and run it end-to-end on a 30 minute call.

Frequently asked questions

Does Zapier work with desktop apps like SAP GUI, Jack Henry, or Epic?

No, not directly. Zapier connects apps that publish a REST or RPC API, and it connects them through API connectors hosted on Zapier's servers. SAP GUI is a Windows desktop client that talks to the SAP server over its own SAP RFC protocol; there is no public REST API for SAP GUI. Jack Henry, FIS, and Fiserv core banking systems are Windows desktop terminals that talk to a private host; same situation. Epic and Cerner expose FHIR for some patient data but not for the in-clinic desktop screens an MA actually fills out. The standard pattern when one end of a workflow is a desktop app is to fire a webhook from a Zap to a desktop runtime that does the desktop work, and let the Zap handle the SaaS half.

Is Mediar a Zapier alternative or a Zapier complement?

Complement, mostly. Zapier is the right tool for SaaS-to-SaaS workflows where both ends have public APIs; Mediar is the right tool when one end is a Windows desktop app the user has to drive by hand today. Many teams run both: Zapier owns the trigger and the orchestration across SaaS systems, and Mediar owns the desktop step at the point in the workflow where the data has to land in SAP, an EHR, a banking core, or a homegrown ERP. Mediar exposes webhook as one of three first-class trigger types (cron, manual, webhook) precisely so it can sit on the receiving end of a Zap or any other orchestrator.

What concretely is a Mediar webhook trigger, in code?

It is one branch of a TypeScript discriminated union defined in apps/desktop/src/lib/typescript-workflow-parser.ts at lines 23-40. The full union is CronTrigger | ManualTrigger | WebhookTrigger. The webhook variant has a literal type field of "webhook" and an optional path string. A workflow author writes trigger: { type: "webhook" } in src/terminator.ts; the parser picks up the discriminator; the queue processor honors it. The same union is what the desktop scheduler dialog reads at apps/desktop/src/components/ui/scheduler-dialog.tsx line 13. There is no separate "Zapier integration" SKU; the webhook trigger is the integration surface, and any HTTP client (Zapier, Make, n8n, a curl in cron, your own backend) can use it.

What is the difference between Zapier's Webhooks by Zapier and Mediar's webhook trigger?

Direction. Webhooks by Zapier is a Zapier action that lets a Zap make an outgoing HTTP call to a URL you control, or a Zapier trigger that lets a Zap fire when an external service POSTs to a Zapier-issued URL. Mediar's webhook trigger is the URL on the receiving end: a stable per-workflow endpoint provisioned for the workflow's uuid that, when POSTed to, enqueues an execution. The two compose: Zapier Webhooks (action) -> Mediar webhook trigger -> desktop run. They are not substitutes for each other.

Why not just have Zapier drive the desktop directly?

Zapier runs in Zapier's cloud. To click a button in SAP GUI on your machine, something has to be running on a Windows host that has SAP GUI installed and is logged in as a user with the right SAP role. That something is a desktop agent. Zapier does not ship a Windows desktop agent, because that is not the company they are. UiPath, Power Automate, and Automation Anywhere ship one each, and Mediar ships one. The Zap calls the agent; the agent does the desktop work. There is no shortcut around the agent that a SaaS-only orchestrator can take.

What does it cost to run this composition?

Two line items. Zapier charges per task (their term for a step) on a tiered plan; the Webhooks by Zapier action and the Formatter step each count as a task. Mediar charges $0.75 per minute of executor runtime; a 30-second SAP post costs about 38 cents in Mediar regardless of how many users kicked the Zap off. There is no per-seat license, no per-bot license, and no per-process license on the Mediar side. The $10K turn-key program fee at Mediar converts to credits and is effectively prepaid usage covering the first pilot, including the porting of any existing Zapier-plus-RPA wiring you already have.

Does the Zap know whether the desktop step succeeded?

Yes. The webhook response is synchronous up to the configured timeout, and it carries a boolean ok plus an execution_id. The execution_id is what the rest of the Zap can write to a status column or post to Slack. If the desktop step exceeds the per-execution wall clock (600 seconds in the queue processor's tokio::time::timeout), the response carries the timeout state and the Zap can branch on it. If the desktop machine is offline, the request returns immediately with a queued state and the execution runs when a worker comes back; the Zap can either treat queued as success and poll for completion later, or block on a follow-up step that calls the same /executions/<id> endpoint until it terminates.

What about Make, n8n, Workato, or a homegrown backend? Same pattern?

Same pattern. The webhook trigger does not care which orchestrator called it. Make's HTTP module hits the same /run endpoint; n8n's Webhook node does the same; a Workato recipe with a generic REST connector does the same; a Postgres trigger calling pg_net to POST a JSON does the same. The only thing that changes is which side handles the SaaS-to-SaaS half. Zapier is the most common because it has the most off-the-shelf app connectors, but the choice of orchestrator is independent of Mediar's side.

Is this open source?

The runtime is. The desktop agent's executor crate, the queue processor, the workflow parser whose trigger union this page quotes, and the MCP transport all live under github.com/mediar-ai/terminator. The hosted dashboard at app.mediar.ai/web (the no-code recorder, the workflow library, the run history) is the proprietary surface. A team that wants to run the executor on their own infrastructure and skip the hosted dashboard can do that; the webhook URL in that deployment is whatever host the team puts in front of the runtime, and the trigger union is the same.

What goes wrong, honestly?

Three things, in roughly this order. First, modal dialogs in legacy desktop apps that only appear on the first run of the day; the workflow has to acknowledge them before the second run will work, and that means a recorder pass on a real machine, not just a Zap config. Second, identity: the desktop agent runs as a real Windows user, and that user has to be logged in to whatever the desktop app needs (SAP, the banking core, the EHR). A locked screen at 2 AM kills the run; we recommend a dedicated unattended-bot user with the right role and a screensaver policy that does not lock the session. Third, payload size: Webhooks by Zapier caps payloads, so for invoice PDFs you typically pass a URL, not the bytes. None of these are deal-breakers; they are the operational surface that exists in any composition where a SaaS orchestrator hands work to a desktop agent.