No code required. This tutorial uses Zapier’s point-and-click builder. No programming experience needed.

What you’ll build
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
API endpoints
Prerequisites
- A GC AI API key (get one from Settings > API in the app)
- A Zapier account (the free plan works for testing; a paid plan is needed for multi-step Zaps to run automatically)
- Admin access to a Slack workspace
Part 1: The basic Zap
1
Create a Slack channel
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-requestschannel - 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


4
Send a 'working on it' reply
Add a new step: Slack → Send Channel Message.


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.



5
Classify with GC AI
Add a new step: Webhooks by Zapier → POST.The 


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):?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
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).

Path B: Timed out
Add a Slack → Edit Message step inside this path (same first option):







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.

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
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.
Part 2: Handling long-running queries
The basic Zap works well 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.How it works
The sub-Zap receives ajob_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
Build the polling sub-Zap
1
Create a new Zap with a webhook trigger
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.
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
Add a Slack → Edit Message step (the first option):
Path B: Max attempts reachedWithout this path, a job that never completes would recurse forever. This is the safety valve: after 4 attempts, stop and tell the user.
Add a Slack → Edit Message step (the first option):
Path C: Try again (recurse)
First, add a Formatter by Zapier → Numbers step:
Then add a Webhooks by Zapier → GET step that calls the sub-Zap’s own webhook URL:







Wire the sub-Zap into the main Zap
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):

Customizing the prompt
The classification prompt in Step 4 is fully customizable. Here are some ideas:- Add your team’s categories: replace the generic list with your actual practice areas
- Include routing rules: tell the model which attorney or team handles which category
- Reference your playbooks by name: if you know your GC AI playbooks, list them in the prompt so the model suggests a specific one
- Change the output format: ask for a numbered priority score, a deadline estimate, or a link to the relevant GC AI playbook page
Going further
Add file analysis
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.