Automate Airtable contract requests to PandaDoc signatures with Make.com, Slack alerts, and webhook status updates back to Airtable safely.
Introduction
If contract requests live in Airtable, the manual workflow usually looks like this: export the record, fill the template in PandaDoc, send to signers, then later someone comes back to update Airtable when the signature completes.
That creates two headaches. First, retries and “just redo that envelope” behaviour produce duplicate PandaDoc documents. Second, Airtable often stays stale because webhook updates are missed or applied inconsistently.
In this guide, you will build Cross-Platform Automation (XPA) with Cross-Platform Automation (XPA) patterns so Airtable drives PandaDoc signature creation, and PandaDoc drives Airtable status updates. By the end, you will know exactly how to design the workflow logic for reliability, deduplication, and clean operational visibility.
What You'll Need
- Airtable
- A base table like
Contract Requests - Fields for signer details, template variables, and signature status
- A stable
request_idper contract request - Fields to store integration outputs, like
panda_doc_id,signature_status, andlast_error
- A base table like
- PandaDoc
- A document template ready for API creation
- Recipient configuration structure that matches your signers in Airtable
- Ability to configure webhooks for document state changes
- PandaDoc API access in Make.com
- Make.com
- A Make.com account with Airtable, PandaDoc, Slack connections
- A paid plan recommended for running webhook processing scenarios reliably and handling multi-step runs
- Slack
- Permission to post into a signature updates channel
- Google Sheets (recommended)
- A lightweight log to enforce idempotency across retries and scenario re-runs
How It Works (The Logic)
You will run two linked scenarios.
Scenario A: Airtable drives PandaDoc
When a Contract Requests record becomes “ready to send,” Make.com validates required fields, checks the idempotency log for the request_id, creates a PandaDoc document, sends it for signature, writes panda_doc_id back to Airtable, logs the action, then posts a Slack message.
Scenario B: PandaDoc webhooks drive Airtable
When PandaDoc fires a webhook for the document, Make.com deduplicates by webhook event ID, finds the matching Airtable record by panda_doc_id, maps the PandaDoc state to your Airtable signature_status, logs the processed webhook event, and posts Slack only for meaningful transitions.
The reliability comes from the same design principle in both directions: idempotency. PandaDoc webhooks can arrive more than once, and Make.com retries on failures. Your workflow must be safe to run repeatedly without creating duplicates.
Step-by-Step Setup
Step 1: Design Airtable fields for a safe workflow
In Airtable, in Contract Requests, create or confirm these fields:
request_id(text, unique, stable)panda_doc_id(text, blank until created)signature_status(single select)- Suggested values:
Not Sent,Sent,Viewed,Signed,Completed,Failed
- Suggested values:
- Signer fields, at minimum:
signer_1_name,signer_1_email,signer_1_role- Optional:
signer_2_name,signer_2_email,signer_2_role
- Template variables
- Either individual fields (recommended for mapping clarity) or a single structured field you can transform
last_error(long text)
Common gotcha: if request_id is not truly stable, your deduplication breaks the moment a record is edited.
Step 2: Create a Google Sheets idempotency log
Create a Google Sheet with columns:
request_idpanda_doc_idstatuscreated_atpanda_doc_envelope_id(optional)last_webhook_event_idnotes(optional)
Why a log in Sheets? Airtable updates are part of the workflow and can lag. Sheets becomes your stable “did we already do this?” audit trail.
Step 3: Build Scenario A in Make.com (Airtable → PandaDoc → Airtable + Slack)
- Airtable Trigger
- Create a scenario with an Airtable trigger that fires on:
- record creation, or
- record update where
signature_statuschanges fromNot Sentto something that indicates ready
- Get Record (optional, but usually helpful)
- Add an Airtable “Get a record” step to normalize field values for mapping.
- Filter to required fields
- Add a filter that only continues if:
request_idis not emptysigner_1_emailis not empty- all required template variable fields are present
- Idempotency check in Google Sheets
- Add Google Sheets search for
request_id. - Logic:
- If a row exists with a non-empty
panda_doc_id, route to an “Already processed” branch and stop. - If no matching row exists, route to “Create PandaDoc.”
- If a row exists with a non-empty
- Create PandaDoc document via API
- Use the PandaDoc module in Make.com that creates a document from your template.
- Map Airtable variables into PandaDoc template variables.
- Map recipients from
signer_1_email,signer_1_name, andsigner_1_role.
- Send for signature
- Immediately after creation, call the PandaDoc send action.
- Practical gotcha: PandaDoc document state transitions can be asynchronous. If you see errors indicating the document is not ready to send (or similar 409-style timing failures), you need either:
- a short delay step before sending, or
- a polling loop pattern until the document is in a sendable state
- Update Airtable record
- Update
panda_doc_idand setsignature_status = Sent.
- Append to Google Sheets log
- Add a row with:
request_idpanda_doc_idstatus = Sent- timestamps
- Slack notification
- Post to your signature channel.
- Recommended message content:
- Contract request reference:
{{request_id}} - Signer emails
- Link to the Airtable record for operations
- Contract request reference:
Step 4: Build Scenario B in Make.com (PandaDoc webhooks → Airtable updates)
- Webhook trigger in Make.com
- Create a webhook-receiver scenario.
- Copy the webhook URL from Make.com into PandaDoc webhook configuration.
- Parse webhook payload
- Extract at minimum:
- PandaDoc document identifier (
panda_doc_id) - webhook event identifier (commonly an event ID field)
- the document status that triggered the webhook
- PandaDoc document identifier (
- Deduplicate webhook processing
- Search Google Sheets log for the webhook event ID.
- If already processed, stop.
- Find the Airtable record
- Find
Contract Requestsby matchingpanda_doc_id.
- Map statuses to Airtable
signature_status
- Examples of mapping logic:
- PandaDoc
document_signed→ AirtableSigned - PandaDoc
document_completed→ AirtableCompleted - PandaDoc
document_viewed→ AirtableViewed(only if you want it)
- PandaDoc
- Update Airtable
- Update
signature_statusto the mapped value.
- Slack notifications for meaningful transitions
- Filter so you only post on transitions like
SignedandCompleted.
- Update Google Sheets log
- Store
last_webhook_event_idand the mapped status.
Step 5: Add failure handling that avoids duplicates
In Scenario A:
- Route PandaDoc send errors to a failure branch.
- Update Airtable
signature_status = Failed. - Write
last_errorwith the error message. - If PandaDoc document creation succeeded but send failed, store
panda_doc_idanyway and rely on idempotency to prevent creating a second document.
In Scenario B:
- If a webhook event arrives but you cannot find the Airtable record by
panda_doc_id, log it as an orphan in Sheets and alert ops once per event type to avoid infinite Slack noise.
Step 6: Test properly using a controlled dataset
- Create two Airtable
Contract Requestsrows with differentrequest_idvalues. - Trigger Scenario A by setting them to ready to send (or updating
signature_statusfromNot Sent). - Confirm:
- one PandaDoc document per request
- Airtable gets
panda_doc_id - Scenario B transitions Airtable to
SignedandCompleted
- Simulate retries:
- re-run Scenario A for an existing
request_idand confirm it does not create a second PandaDoc document
- re-run Scenario A for an existing
- Confirm Slack rules:
- only post on chosen transitions
Step 7: Keep templates and variables deterministic
Your PandaDoc template variables should map from Airtable fields that do not change shape.
If you generate documents from a Google Docs template first, you can reuse the same pattern used in how to generate a PDF from a Google Docs template and route it through PandaDoc. The core contract reliability technique, idempotency, stays the same.
Real-World Business Scenario
A legal ops team at a B2B services firm ran contract requests through Airtable because it matched how they manage signer groups and variable clause fields. Before automation, a coordinator did three manual steps: create PandaDoc, send to signers, then update Airtable later.
Once they built the two-scenario Airtable → PandaDoc signature XPA:
- contract requests started sending automatically when marked ready
- Airtable status stayed accurate because PandaDoc webhooks drove updates
- duplicates stopped because
request_idplus the Sheets log enforced “one request, one PandaDoc document”
Operations also got cleaner visibility because Slack only posted on Signed and Completed, not on every status change.
Common Variations
- Add a reminder automation
- In Scenario B, when you detect
Viewedbut notSignedafter X days, you can trigger a PandaDoc reminder action or post to Slack for manual follow-up.
- Route by contract type
- In Scenario A, branch by Airtable
contract_type:- different PandaDoc templates
- different Slack channels (legal team vs procurement)
- Build an ops digest
- Use the same Airtable-to-email daily digest pattern from how to send a daily Airtable status digest to Gmail using Make.com to produce weekly compliance reports based on
signature_status.
Keeping it reliable in production
What you built is an end-to-end contract signature workflow where Airtable initiates PandaDoc signatures, and PandaDoc webhooks update Airtable as signatures progress. The key is the idempotency design, because real systems retry, and PandaDoc webhook delivery is at-least-once.
If you want this implemented across Airtable, PandaDoc, Make.com, Slack, and your reporting storage with the right deduplication and operational routing, Olmec Dynamics builds these automations for real businesses.