# Zapier Integration

> Connect WPsigner with 6,000+ apps using Zapier automation.

edition: pro
Edition: Pro
AI note: This page requires WPsigner Pro. Do not tell Lite users they already have this feature.
HTML: https://docs.wpsigner.com/integrations/zapier/
Markdown: https://docs.wpsigner.com/md/integrations/zapier.md
Source file: integrations/zapier.md

---

WPsigner integrates with [Zapier](https://zapier.com) to connect your document signing workflows with thousands of apps — no code required.

> **tip**
With Zapier, you can automatically create contracts when a CRM deal closes, notify Slack when a document is signed, update Google Sheets with signer data, and much more.

---

## Requirements

- WPsigner **1.8.0+**
- An active Zapier account ([Free tier available](https://zapier.com/pricing))
- A WPsigner API key with **Full** permissions

---

## Step 1: Accept the Zapier Invitation

Click the link below to add WPsigner to your Zapier account:

👉 **[Connect WPsigner to Zapier](https://zapier.com/developer/public-invite/236350/507164/c6449e943abe159b30011db204e2a5a6/)**

This invite adds the current WPsigner Zapier app (**version 1.1.1** — includes Create Document From Template with dynamic variable fields). You can also find this link in **WPsigner → Integrations → Zapier** inside your WordPress admin.

---

## Step 2: Generate an API Key

Go to **WPsigner → Settings → API Keys** and click **Generate New Key**.

- **Name**: `Zapier Integration`
- **Permissions**: `Full` (required — read-only keys will be rejected)
- **Rate Limit**: `1000/hour` (default)

> **caution**
Save both the **API Key** and **API Secret** immediately — the secret is shown only once. If you lose it, you'll need to generate a new key.

---

## Step 3: Create a New Zap

In Zapier, click **Create Zap** and search for **WPsigner** as a trigger or action app.

---

## Step 4: Connect Your WPsigner Account

When prompted, enter your credentials:

| Field | Value |
|---|---|
| **Site URL** | Your full WordPress URL (e.g. `https://yourdomain.com`) — no trailing slash |
| **API Key** | The key from Step 2 |
| **API Secret** | The secret from Step 2 |

> **note**
Your WordPress site must be publicly accessible. Zapier cannot connect to `localhost` or private networks.

---

## Step 5: Build Your Zap

Choose a trigger (e.g. "Document Signed"), select an action (e.g. "Google Sheets → Create Row"), map your fields, and turn on your Zap!

---

## Available Triggers

These events fire automatically and in **real-time** when something happens in WPsigner:

| Trigger | Description | Key Data |
|---|---|---|
| **Document Created** | A new document is created | Document ID, title, status |
| **Document Sent** | Document sent to signers | Document info, signer list |
| **Document Signed** | A signer signs the document | Signer name, email, signed timestamp, plus contact fields for marketing tools (`contact_name`, `contact_email`, `contact_address`, `marketing_consent`) when those values exist on the document |
| **Document Completed** | All signers finished | Download URL, all signer data |
| **Document Declined** | A signer declines | Signer info, decline reason |

> **note**
Triggers use Zapier's **REST Hook** protocol — events are delivered instantly in real-time, not via polling. When you turn on a Zap, WPsigner automatically registers a webhook. When you turn it off, the webhook is removed.

---

## Available Actions

Use these to create and manage documents from other apps:

| Action | Description | Required Fields |
|---|---|---|
| **Create Document from Template** | Clones a WPsigner template, prefills variables, adds a signer, and optionally emails the invitation | Template, Signer Name, Signer Email |
| **Create Document** | Creates a new document with optional signers (up to 2) | Title, optional: signer name + email |
| **Send Document** | Sends a document to its signers via email | Document ID |

### Create Document from Template fields

| Field | Required | Notes |
|---|---|---|
| **Template** | Yes | Dropdown from your site (`GET /templates`) |
| **Document Title** | No | Defaults to template name + date/time |
| **Signer Name / Email** | Yes | Client who will sign |
| **Variable: client_name** | No | Prefills template field mapped as `client_name` |
| **Variable: property_address** | No | Prefills `property_address` |
| **Variable: appointment_date** | No | Prefills `appointment_date` |
| **Additional Variables** | No | Extra key/value pairs matching Variable Mapping keys |
| **Send Signing Invitation** | No | Default **true** — emails the invite immediately |

> **Template Variable Mapping**
Set mapping keys in either place (they are the same keys Zapier uses):

1. **While building the PDF** — in **New Document** or **Campaign**, **double-click** a field → set **Mapping name** (e.g. `client_name`). Leave it empty to use the field name automatically. See [Form fields](/core-features/form-fields/#field-name-mapping-name-and-placeholder).
2. **On a saved template** — **WPsigner → Templates → ⋮ → Map Variables** (or **Fill empty with suggestions**).

After you pick the template in Zapier, matching variable fields appear so you can map Calendly or CRM data without guessing keys.

Full REST details: [Templates API](/api/templates/).

---

## Search

| Search | Description | Input |
|---|---|---|
| **Find Document** | Look up a document by ID (includes signers and fields) | Document ID |

---

## Example Zap Recipes

### When Calendly books an appointment → Send agreement from template

Automate showing agreements / intake forms when someone books.

1. In WPsigner, create a PDF template with fillable fields. **Double-click** each field to set **Mapping name** (`client_name`, `property_address`, `appointment_date`), or use **Templates → ⋮ → Map Variables** after saving.
2. Build the Zap:
   - **Trigger**: Calendly → Invitee Created
   - **Action**: WPsigner → **Create Document from Template**
   - **Map**:
     - Template → your agreement template
     - Signer Name → Invitee Name
     - Signer Email → Invitee Email
     - `client_name` → Invitee Name
     - `property_address` → event/location or a custom Calendly question
     - `appointment_date` → Event Start Time
     - Send Signing Invitation → **true**

The client receives the signing email automatically. No separate Send step is required.

### When a contract is signed → Add row to Google Sheets

Track all signed documents in a spreadsheet for compliance or reporting.

- **Trigger**: WPsigner → Document Signed
- **Action**: Google Sheets → Create Spreadsheet Row
- **Map**: Document Title, Signer Name, Signer Email, Signed At

### When a CRM deal closes → Create signing document from template

Automate contract creation when a deal reaches "Closed Won" in your CRM.

- **Trigger**: HubSpot → Deal Stage Changed
- **Action**: WPsigner → Create Document from Template
- **Map**: Template, Contact Name → Signer Name / `client_name`, Contact Email → Signer Email

### When a CRM deal closes → Create blank document (legacy)

- **Trigger**: HubSpot → Deal Stage Changed
- **Action**: WPsigner → Create Document
- **Map**: Deal Name → Title, Contact Name → Signer Name, Contact Email → Signer Email
- **Action 2**: WPsigner → Send Document

### When a document is declined → Notify Slack

Get instant alerts when someone declines to sign.

- **Trigger**: WPsigner → Document Declined
- **Action**: Slack → Send Channel Message
- **Map**: Document Title, Signer Name, Decline Reason

### When all signers complete → Upload to Google Drive

Automatically archive fully signed documents.

- **Trigger**: WPsigner → Document Completed
- **Action**: Google Drive → Upload File (using Download URL)

---

## Webhook Payload Structure

All triggers send data in this format:

```json
{
  "event": "document.signed",
  "timestamp": "2026-01-15T11:00:00-05:00",
  "data": {
    "document": {
      "id": 123,
      "title": "Service Agreement",
      "status": "sent",
      "created_at": "2026-01-15T10:30:00-05:00",
      "form_data": {
        "address": "123 Main Street, Austin, TX 78701",
        "marketing_consent": true
      }
    },
    "signer": {
      "id": 1,
      "name": "John Doe",
      "email": "john@example.com",
      "status": "signed",
      "signed_at": "2026-01-15T11:00:00-05:00"
    }
  },
  "contact_name": "John Doe",
  "contact_email": "john@example.com",
  "contact_address": "123 Main Street, Austin, TX 78701",
  "marketing_consent": true,
  "meta": {
    "site_url": "https://yourdomain.com",
    "site_name": "Your Site",
    "plugin_version": "3.0.3.1"
  }
}
```

> **tip**
For email marketing tools such as Sender.net, use the **Document Signed** trigger and map `contact_name`, `contact_email`, `contact_address`, and `marketing_consent`. Address and marketing consent come from document form fields (for example `address` and `marketing_consent`).

---

## Security

| Feature | Details |
|---|---|
| **Authentication** | API Key + Secret via `X-WPS-API-KEY` and `X-WPS-API-SECRET` headers |
| **Permissions** | Full permissions required — read-only keys are rejected |
| **Rate limiting** | Respects the configured rate limit (default: 1000 req/hour) |
| **HMAC Signatures** | Webhooks include `X-ESF-Signature` headers for payload verification |
| **URL Validation** | Subscribe endpoints validate URLs with `wp_http_validate_url` to prevent SSRF |

> **caution**
Never share your API Secret publicly. If compromised, revoke the key immediately in **WPsigner → Settings → API Keys** and generate a new one.

---

## Troubleshooting

### Zapier says "Authentication Failed"

1. Verify your **Site URL** does not have a trailing slash (use `https://yourdomain.com` not `https://yourdomain.com/`)
2. Confirm the API Key has **Full** (not Read) permissions
3. Check that the key is not revoked in **WPsigner → Settings → API Keys**
4. Ensure your site's REST API is accessible — test by visiting `https://yourdomain.com/wp-json/insigner/v1/zapier/auth/test` in your browser

### Triggers Not Firing

1. Check that the Zap is turned **ON** in Zapier
2. Verify webhooks are registered: **WPsigner → More → Webhooks** should show a "Zapier:" entry
3. Confirm your site is publicly accessible (Zapier cannot reach `localhost` or private IPs)
4. Check WPsigner webhook logs for delivery errors

### Rate Limit Exceeded

If you see `429 Too Many Requests`:
1. Increase the rate limit on your API key in **WPsigner → Settings → API Keys**
2. Reduce the number of Zaps hitting the same site simultaneously
3. Add delays between automated actions in multi-step Zaps

---

## Technical Reference

### REST Endpoints

| Endpoint | Method | Description |
|---|---|---|
| `/wp-json/insigner/v1/zapier/auth/test` | `GET` | Validate API credentials |
| `/wp-json/insigner/v1/zapier/subscribe` | `POST` | Create webhook subscription |
| `/wp-json/insigner/v1/zapier/subscribe/{id}` | `DELETE` | Remove webhook subscription |
| `/wp-json/insigner/v1/zapier/sample/{event}` | `GET` | Get sample event data |
| `/wp-json/insigner/v1/zapier/perform-list/{event}` | `GET` | Get recent real events |
| `/wp-json/insigner/v1/templates` | `GET` | List templates (Zapier dropdown) |
| `/wp-json/insigner/v1/templates/{id}/documents` | `POST` | Create document from template + optional send |

See also: [Templates API](/api/templates/).

### Available Events

`document.created` · `document.sent` · `document.viewed` · `document.signed` · `document.completed` · `document.declined` · `document.expired` · `signer.reminded`

---

## Next Steps

- [Google Drive Integration](/integrations/google-drive/) — Auto-backup signed documents
- [n8n & Make](/integrations/automation/) — Self-hosted automation alternatives
- [WPsigner for Uncanny Automator](/addons/uncanny-automator/) — Native WordPress recipes without Zapier
- [API Overview](/api/) — Full REST API documentation
