SEC Data Automation with Zapier
Zapier connects thousands of apps with no-code automations called Zaps. In this tutorial you will build a Zap that receives OMNI Datastream webhook events for new insider trades (Form 4 filings), logs each trade to a Google Sheets spreadsheet, and sends a Slack notification.Prerequisites
- An Omni Datastream API key (set as
OMNI_DATASTREAM_API_KEY) - A Zapier account (free tier supports single-step Zaps; multi-step requires a paid plan)
- A Google account with Google Sheets access
- A Slack workspace where you can post messages
- (Optional) Familiarity with the Analyze Insider Trading tutorial
Architecture overview
Step 1 --- Create the Zapier webhook trigger
- Log in to Zapier and click Create Zap.
- For the trigger app, search for Webhooks by Zapier.
- Select Catch Hook as the trigger event.
- Click Continue. Zapier generates a unique webhook URL:
- Copy this URL --- you will register it with OMNI Datastream next.
- Click Test trigger and leave the page open. Zapier is now listening for a test event.
Step 2 --- Register the webhook with OMNI Datastream
Create a webhook endpoint
Create an insider trade monitor
we_abc123 with the endpoint ID from the previous response.
Send a test event to Zapier
While Zapier is listening, send a sample payload so it can detect the data structure:Step 3 --- Prepare the Google Sheet
Create a Google Sheet named Insider Trade Tracker with the following column headers in Row 1:| A | B | C | D | E | F | G | H | I |
|---|---|---|---|---|---|---|---|---|
| Date | Ticker | Company | Insider | Title | Type | Shares | Price | Value |
Step 4 --- Add a Google Sheets action
- Click + to add an action step.
- Search for Google Sheets and select it.
- Choose Create Spreadsheet Row as the action event.
- Connect your Google account and select the Insider Trade Tracker spreadsheet.
- Map the fields:
| Sheet Column | Zapier Field |
|---|---|
| Date | data__filed_at |
| Ticker | data__ticker |
| Company | data__company_name |
| Insider | data__insider_name |
| Title | data__insider_title |
| Type | data__transaction_type |
| Shares | data__shares |
| Price | data__price |
| Value | data__value |
- Click Test action to verify a row is created in your sheet.
Step 5 --- Add a Slack notification
- Click + to add another action step.
- Search for Slack and select it.
- Choose Send Channel Message as the action event.
- Connect your Slack workspace and select the target channel (e.g.,
#insider-trades). - Set the Message Text to:
- Click Test action to verify the Slack message is sent.
Step 6 --- Turn on the Zap
- Name your Zap (e.g., “OMNI Insider Trade Tracker”).
- Click Publish to activate it.
Zapier step summary
Expected result
Google Sheets row
| Date | Ticker | Company | Insider | Title | Type | Shares | Price | Value |
|---|---|---|---|---|---|---|---|---|
| 2024-12-15 | AAPL | Apple Inc | Tim Cook | Chief Executive Officer | sale | 200000 | 248.50 | 49700000 |
Slack message
Troubleshooting
| Problem | Solution |
|---|---|
| Zapier does not detect test data | Make sure you clicked Test trigger before sending the curl request. Zapier must be in listening mode. |
| Google Sheets columns are misaligned | Verify the column headers match exactly. Zapier maps by header name. |
| Slack message has missing fields | Check that the field names in the message template match the Zapier field names (e.g., data__ticker, not ticker). |
| Zap triggers but no row is created | Check the Google Sheets action error log in Zapier. Common issue: the spreadsheet was moved or renamed. |
| Too many alerts | Add a Filter by Zapier step to only continue for specific transaction types (e.g., data__transaction_type equals purchase). |
Next steps
- Add a Filter step: Only track purchases (insider buys are often more meaningful than sales).
- Add a Formatter step: Convert
valueto a human-readable currency format (e.g.,$49,700,000). - Multi-sheet routing: Use a Paths by Zapier step to log buys and sells to different sheets.
- Enrich with OMNI data: Add a Webhooks by Zapier > GET step to call
/v1/insiders?ticker={ticker}and pull additional context before logging.