Automate legal request triage in Slack with a Zapier workflow — no code required.
No code required — this tutorial uses Zapier’s point-and-click builder. No programming experience needed.
Set up a Zapier automation that watches a Slack channel for legal requests, sends them to GC AI for classification, and replies in-thread with a structured triage report.
A Zapier “Zap” that monitors a Slack channel (e.g. #legal-requests). When someone posts a message describing a legal need, the automation:
Sends the message to GC AI for classification
Replies in the same Slack thread with a structured triage: category, risk level, urgency, a summary, recommended next steps, and which playbook to use in GC AI
Create a dedicated channel for incoming legal requests — something like #legal-requests. This is the channel the bot will watch.If your team already has a channel for this purpose, you can use that instead.
2
Create a new Zap
Go to zapier.com and click Create → New Zap. You’ll see an empty canvas with a trigger step.
3
Set up the Slack trigger
Click the trigger step and configure it:
App: Search for Slack and select it
Event: Choose New Message Posted to Channel
Account: Connect your Slack workspace (Zapier will walk you through the OAuth flow)
Channel: Select your #legal-requests channel
Trigger on bot messages: Set to No (this prevents the bot from responding to its own replies)
Click Test trigger to pull in a sample message
Post a test message in the channel before testing the trigger so Zapier has sample data to work with.
4
Send a 'working on it' reply
Add a new step: Slack → Send Channel Message.
Field
Value
Channel
Select #legal-requests (or map the Channel ID from the trigger)
Message Text
Working on it...
Thread
Map the Ts field from the Slack trigger (this makes the reply appear in-thread)
Bot Name
GC AI Triage (optional)
This gives the requester instant feedback while the API processes their request. We’ll update this message with the actual result in a later step.
For the Data value, paste the following prompt. Replace {{insert Message Text}} with the mapped field from your Slack trigger (click the + button in the value field, then select Message Text from the Slack trigger data):
You are a legal operations triage assistant. A team member posted the following request in Slack:"{{insert Message Text}}"Classify this request and respond with:Category: [Contract Review, Employment, IP, Compliance, Litigation, Corporate, or Other]Risk Level: [Low, Medium, High, or Critical]Urgency: [Routine, Expedited, or Urgent]Summary: [One sentence describing the request]Recommended Next Steps:1. [First step]2. [Second step]3. [Third step]Suggested GC AI Playbook: [Which playbook type to use]Keep the response concise. Use bold (*text*) for labels.
The ?wait=30 on the URL tells the API to hold the connection for up to 30 seconds while it works — comfortably inside Zapier’s 30-second limit for action steps, so the step returns cleanly instead of erroring out. (The API reads wait from the query string or a Prefer: wait=30 header, not the JSON body, so it must live on the URL here.) Click Test step — quick classifications come back with status: "succeeded" and the text inside result → result. If the request needs longer than 30 seconds, the call returns with a non-succeeded status and a job_id; the next step handles that case (and Part 2 polls the job to completion).
6
Branch on the result
Add a new step: Paths by Zapier.The API usually finishes within the wait window, but longer queries can time out. This step handles both cases.Path A — Classification ready:
Field
Value
Condition
Status (from the Webhooks step) exactly matches succeeded
Add a Slack → Edit Message step inside this path. When searching for the action, choose the first “Edit Message” option (the one with just “Edits a message.” as the description).
Field
Value
Conversation ID
Your #legal-requests channel
Message TS (ID)
Map the Ts from the “Working on it…” step (this identifies which message to update)
Message Content
Map the Result Result field from the Webhooks step (the AI’s classification text, found under result → result)
Content Type
Markdown
Path B — Timed out:
Field
Value
Condition
Status (from the Webhooks step) does not exactly match succeeded
Add a Slack → Edit Message step inside this path (same first option):
Field
Value
Conversation ID
Your #legal-requests channel
Message TS (ID)
Map the Ts from the “Working on it…” step
Message Content
This request timed out — it may be too complex for the bot. Try asking in GC AI directly.
Content Type
Markdown
7
Test and publish
Post a test message in #legal-requests:
We just signed a new vendor and need their MSA reviewed before onboarding. It’s a 3-year SaaS agreement with auto-renewal and an uncapped indemnification clause. Timeline is end of week.
Click Test on each step to run the Zap manually, or click Publish and post the message to see it run automatically.
You should see a threaded reply with the structured triage.
Once it’s working, click Publish to turn the Zap on. Every new message in the channel will now be triaged automatically.
Exercise: trigger the bot only on certain messages
Right now the bot triages every message posted in the channel. How would you configure it so the bot only runs when someone specifically addresses it — for example, by starting their message with “hey legalbot”?
Hint
Add a Filter by Zapier step between the Slack trigger and the Webhooks POST. Set the condition to only continue if Message Text contains hey legalbot. Every other message in the channel will be ignored.
The basic Zap works great for quick classifications, but some queries — especially those involving large documents or complex analysis — can take longer than the API’s wait window. When that happens, Path B fires and the user sees “Your request is taking longer than expected.”To actually follow up with the result, we’ll build a second Zap that polls for the completed job. The main Zap calls this sub-Zap when a query times out, and the sub-Zap keeps checking until the result is ready.
The sub-Zap receives a job_url, an attempt_number, and the Slack context needed to update the “Working on it…” message. It waits, checks the job status, and then:
Job succeeded → updates the “Working on it…” message with the result
Max attempts reached → updates the message with an error
Still running → calls itself again with attempt_number + 1
This is recursion — the sub-Zap calls itself with an incremented counter until it either gets a result or hits the retry limit.
Create a second Zap. For the trigger, choose Webhooks by Zapier → Catch Hook.In the Configure tab, leave Pick off a Child Key empty and click Continue.
Zapier will give you a unique webhook URL (something like https://hooks.zapier.com/hooks/catch/123456/abcdef/). Copy this URL — the main Zap will call it.In the Test tab, click Test trigger. Zapier will wait for a request. To send test data, you’ll need a real Job Id — go to your main Zap, open the Webhooks POST step, and copy the Job Id from its test results.Then paste both values below and click Send test request:Go back to Zapier — it should pick up the request and show the four fields: job_url, attempt_number, channel, and message-ts. Once the request appears, select the record and click Continue with selected record.
2
Check the job status
Add a step: Webhooks by Zapier → GET.
Field
Value
URL
Map job_url from the Catch Hook trigger
Send As JSON
Yes
Unflatten
Yes
Query String Params
Key: wait / Value: 30
Headers
Key: Authorization / Value: YOUR_API_KEY
The wait parameter makes this GET long-poll the job for up to 30 seconds, so each attempt gives GC AI real processing time before the path branches. It also paces the recursion — there’s no need for a separate Delay step, since every loop spends up to 30 seconds here before deciding whether to try again.
3
Branch on the result
Add a step: Paths by Zapier with three paths.Path A — Job succeeded:
Field
Value
Condition
Status (from the GET step) equals succeeded
Add a Slack → Edit Message step (the first option):
Field
Value
Conversation ID
Map channel from the Catch Hook trigger
Message TS (ID)
Map message-ts from the Catch Hook trigger
Message Content
Map Result Result from the GET step
Content Type
Markdown
Path B — Max attempts reached:Without this path, a job that never completes would recurse forever. This is the safety valve — after 4 attempts, stop and tell the user.
Field
Value
Condition 1
Status (from the GET step) does not equal succeeded
Condition 2
Attempt Number (from the Catch Hook trigger) is greater than or equal to 4
Add a Slack → Edit Message step (the first option):
Field
Value
Conversation ID
Map channel from the Catch Hook trigger
Message TS (ID)
Map message-ts from the Catch Hook trigger
Message Content
Sorry, this request is taking too long to process. Please try again in GC AI directly.
Content Type
Markdown
Path C — Try again (recurse):
Field
Value
Condition 1
Status (from the GET step) does not equal succeeded
Condition 2
Attempt Number (from the Catch Hook trigger) is less than 4
First, add a Formatter by Zapier → Numbers step:
Field
Value
Transform
Perform Math Operation
Operation
Add
Values
1 and map attempt_number from the Catch Hook trigger
Then add a Webhooks by Zapier → GET step that calls the sub-Zap’s own webhook URL:
Field
Value
URL
Your sub-Zap’s Catch Hook URL (the one from Step 1)
Query String Params
job_url: map from Catch Hook trigger
attempt_number: map the Output from the Formatter step
Go back to your main Zap and update Path B (the timed-out branch). Replace the Edit Message step with a Webhooks by Zapier → GET step (keep the Edit Message that says “This request timed out…” — the sub-Zap will update it again when the result is ready):
Field
Value
URL
Your sub-Zap’s Catch Hook URL
Query String Params
job_url: type https://app.gc.ai/api/external/v1/jobs/ then map Job Id from the main Zap’s Webhooks step (it appends to the URL)
attempt_number: 1
channel: map Channel ID from the Slack trigger
message-ts: map Ts from the “Working on it…” step
Now when a classification times out, the main Zap updates the message to say it’s still working and kicks off the polling sub-Zap. The sub-Zap polls (up to 4 times) and updates the same message with the result when it’s ready.
Upload attachments from Slack to GC AI using the file upload endpoint, wait for processing, then include the file in the classification prompt via file_ids. Reuse the polling sub-Zap pattern to wait for file processing.
Run a playbook automatically
After classification, use the run playbook endpoint to execute a full playbook review against the attached document. Post the check results back to Slack.
Route to the right person
Add a lookup table in Zapier that maps categories to Slack users. After classification, @mention the right attorney in the thread reply so they know to pick it up.
Log to a spreadsheet
Add a Google Sheets step to log every triage (timestamp, requester, category, risk, urgency) for reporting and SLA tracking.