How to Automate PandaDoc Proposals With the API and HubSpot
Automating PandaDoc means one API call to create a document from a template with variables filled in, a second to send it, and a webhook to sync signature status back into your CRM. That removes the manual copy step that eats ten minutes per proposal.
The API is REST with per-document token auth, and the whole flow is roughly 40 lines of code. The complexity lives in choosing which fields are variables and which the rep must edit.
What Can the PandaDoc API Actually Do?
The API covers: create document from template, send document, fetch status, download PDF, and configure webhooks. It does not let you design templates — that stays in the UI.
Endpoints you will use first:
POST /public/v1/documents— create from template with atokenspayload.POST /public/v1/documents/{id}/send— send to a recipient.GET /public/v1/documents/{id}— returnsstatusas draft, sent, viewed, completed, or declined.
Auth is an API-Key header, generated under Settings → API. Keys are per workspace, not per user, so rotate them when someone with access leaves.
How Do I Create a Document From Deal Data?
Map CRM fields to template tokens. A token in the template looks like [client.name], and the API call sends it by name.
POST /public/v1/documents
{
"name": "Proposal - Acme",
"template_uuid": "YOUR_TEMPLATE_UUID",
"recipients": [{"email": "buyer@acme.com", "role": "Client", "first_name": "Dana"}],
"tokens": [
{"name": "client.name", "value": "Acme Inc"},
{"name": "deal.amount", "value": "45000"}
]
}
Keep the token list short. Every token you add is a field someone has to keep populated in the CRM; unused tokens render as empty space in the sent document.
How Do I Sync Signature Status Back to HubSpot?
Use a webhook, not polling. Register it under Settings → Integrations → API → Webhooks pointing at your endpoint, and subscribe to document.completed.
On receipt, look up the deal by the metadata you attached at creation time — pass your deal ID as metadata so you do not have to match on document name. Then update the deal stage.
| Event | Typical CRM action |
|---|---|
document.sent |
Move deal to Proposal Sent |
document.viewed |
Log activity, notify rep |
document.completed |
Move to Closed Won, attach PDF |
document.declined |
Reopen, add note |
Polling the API instead of using webhooks gets rate-limited within a day on an active sales team. There is no reason to do it.
What Are the Rate Limits and Gotchas?
PandaDoc limits API requests to roughly 100 per minute per workspace on standard plans. That is generous for proposal creation and tight if you bulk-generate 500 documents — batch with a delay rather than firing a loop.
Three gotchas worth knowing:
- A document created with a template must be sent, never edited, or the rep loses the ability to change it in the UI.
- Tokens with the same name across template versions collide; version your templates and pin the UUID.
- PDF downloads are metered separately and count against your plan’s document limit on lower tiers. Generating test PDFs repeatedly burns quota.
Is the API Available on the Cheapest Plan?
The API is on every paid plan including Starter at $19 per user per month, but webhooks are effectively a Business feature in practice because the approval workflow they trigger lives there. Check your plan before designing an automation around approvals.
Who Should Not Automate This?
If your reps send fewer than ten proposals a month, the automation costs more to build and maintain than the manual work it replaces. Proposals also carry nuance — a rep editing the summary paragraph often wins the deal. Automate the data, leave the narrative editable.
Quick Summary
- Two API calls create and send a proposal; a webhook syncs status back.
- Pass your CRM deal ID as document metadata so status updates can match reliably.
- Rate limit is about 100 requests per minute per workspace.
- Never edit a document after creating it via the API — send it instead.
- Only worth automating above roughly ten proposals a month.
