Automate TurboDocx API and TurboSign digital signatures in your n8n workflows. Send signature requests, track document status, and download signed PDFs—all without writing code.
n8n is a fair-code licensed workflow automation platform.
🚀 Zero-Code Signature Automation - Build complete document signing workflows with drag-and-drop simplicity. No API knowledge required.
✍️ Full TurboSign Integration - Access all TurboSign capabilities: prepare documents for review, send signature requests, track status, download signed PDFs, void requests, and resend emails.
⚡ Lightning Fast - Pure TypeScript implementation with zero runtime dependencies. Built for n8n Cloud compatibility and instant deployment.
🔄 Production Ready - Built with n8n's best practices, comprehensive error handling, and full TypeScript support for reliable automation.
🛠️ Developer Friendly - Clean API design, comprehensive documentation, and detailed examples to get you automating in minutes.
- In your n8n instance, go to Settings → Community Nodes
- Click Install and enter:
@turbodocx/n8n-nodes-turbodocx - Click Install to add the node to your instance
Follow the installation guide in the n8n community nodes documentation.
# From your n8n installation directory
npm install @turbodocx/n8n-nodes-turbodocx
# Restart n8n- Sign up for a TurboDocx account at https://turbodocx.com
- Log in to your TurboDocx dashboard
- Navigate to your account settings or API section
- Generate an API key
- Copy the API key
- In n8n, create a new TurboDocx API credential
- Paste your API key
- Set the Base URL:
https://api.turbodocx.com(default) - Save the credential
| Operation | What It Does | Use Case |
|---|---|---|
| Prepare for Review | Upload a document with signature fields and get a preview URL. No emails sent. | Preview field placement before sending to clients |
| Prepare for Signing | Upload a document and automatically send signature requests to all recipients | Send employment agreements, contracts, NDAs for signature |
| Get Document Status | Check the document-level status (draft, under_review, completed, voided, expired) | Verify all parties have signed before next step |
| Get Recipients | Every recipient with their signing status, email history, and who sent the document | Chase the exact people you're still waiting on, not the whole list |
| Download Document | Download the final signed PDF | Archive to cloud storage or send to accounting |
| Void Document | Cancel a signature request and invalidate all links | Deal falls through, need to cancel request |
| Resend Email | Resend the signature request to recipients who haven't signed | Recipient lost or never received the original signing email |
| Send Reminder | Nudge a document's outstanding signers — a standalone reminder that ignores the automatic cadence and cap | Chase signers outside the normal reminder rhythm |
| Get Audit Trail | Fetch the full signing audit trail for a document | Compliance evidence of who viewed/signed and when |
Reminder & Expiration Schedule: Prepare for Signing and Prepare for Review both accept an optional Reminder & Expiration Schedule — the automatic reminder cadence (delay, interval, and cap) and document expiration (expire-after plus warning cadence), set per document at send time. Leave any field out to inherit your organization's defaults. Matches the schedule options in the TurboDocx SDK.
Supported File Types: PDF, DOCX, PPTX, or URLs to hosted files (S3, Google Drive, etc.)
Generate documents from TurboDocx templates with variable substitution, then list, fetch, update, delete, or download them (PDF or original DOCX/PPTX source).
| Operation | What It Does |
|---|---|
| Generate | Create a document from a template with variables |
| Get / Get Many | Fetch one deliverable, or list with search + pagination |
| Update | Change name, description, or tags |
| Delete | Soft-delete a deliverable |
| Download PDF / Download Source File | Get the generated PDF or original DOCX/PPTX as binary |
Full CPQ surface, modelled as several resources for an intuitive UX:
| Resource | Operations |
|---|---|
| Quote | Get Many, Create, Get, Update, Delete, Duplicate, Apply/Remove Price Book, Download PDF, Send, Send With Deliverable, Decline, Void, Handle Expired, Create and Send (one-step macro) |
| Quote Line Item | Get Many, Add, Add Bundle, Update, Remove |
| Quote Number Config | Get, Update (org-wide quote numbering format) |
| Product | Get Many, Bulk Create, Create, Get, Update, Delete, Duplicate, Primary Images (supports binary image upload) |
| Price Book | Get Many, Bulk Create, Create, Get, Update, Delete, Duplicate, List Products |
| Bundle | Get Many, Bulk Create, Create, Get, Update, Delete, Duplicate |
| Company | Get Many, Bulk Create, Create, Get, Update, Delete, List Contacts |
| Contact | Get Many, Bulk Create, Create, Update, Delete |
| Quote Template | Get Many, Get Default, Get, Create, Update, Delete |
| Quote Type | Get Many, Bulk Create, Create, Update, Delete |
Reminder & Expiration Schedule (quote Send / Send With Deliverable / Create and Send): these send operations accept an optional Reminder & Expiration Schedule — the automatic reminder cadence (delay, interval, cap) plus per-quote expiration and its warning cadence. Leave any field out to inherit your organization's defaults. Quote constraint: expiry is pinned to the quote's Valid Until (so Expire After is ignored while expiration is on), and the reminder/warning cadence must fit inside Valid Until or the send is rejected.
| Resource / Node | What It Does |
|---|---|
| Webhook (action) | Manage the org signature webhook: Create, Get, Update, Delete, Test, Notify, Regenerate Secret, List Deliveries, Replay Delivery, Get Stats |
| TurboDocx Trigger (trigger node) | Starts a workflow on signature.document.completed / signature.document.voided. Auto-registers the webhook on activation, verifies the HMAC signature on every delivery, and cleans up on deactivation. |
Provision and manage customer organizations from a partner account — including each tenant's TurboSign display preferences, so signature appearance can be set per org without logging into its settings UI. Requires the separate "TurboDocx Partner API" credential (a TDXP- partner key + partner ID).
| Resource | Operations |
|---|---|
| Partner Organization | Create, Get Many, Get, Update, Delete, Update Entitlements, Get Preferences, Update Preferences |
| Partner Org User | Get Many, Add, Update Role, Remove, Resend Invite |
| Partner Org API Key | Get Many, Create, Update, Revoke |
| Partner API Key | Get Many, Create, Update, Revoke |
| Partner User | Get Many, Add, Update Permissions, Remove, Resend Invite |
| Partner Audit Log | Get Many (with filtering) |
Credentials: TurboSign, Deliverable, TurboQuote, and Webhook resources use the TurboDocx API credential (API key + Organization ID). The TurboPartner resources use the TurboDocx Partner API credential. The node shows the right credential automatically based on the selected resource.
[Webhook Trigger] → [HTTP Request: Get Document] → [TurboDocx: Prepare for Signing] → [Slack: Notify Team]
Step-by-step:
- Add a Webhook node to receive contract data
- Add HTTP Request node to download document from your storage (supports PDF, DOCX, PPTX)
- Add TurboDocx node with operation TurboSign: Prepare for Signing
- File: Select binary data from previous node (or provide URL to hosted file)
- Recipients:
[ {"name":"{{$json.customerName}}","email":"{{$json.customerEmail}}","order":1}, {"name":"Company Rep","email":"legal@company.com","order":2} ] - Fields:
[ {"type":"signature","page":1,"x":100,"y":500,"width":200,"height":50,"recipientOrder":1}, {"type":"date","page":1,"x":320,"y":500,"width":100,"height":30,"recipientOrder":1}, {"type":"signature","page":1,"x":100,"y":600,"width":200,"height":50,"recipientOrder":2}, {"type":"date","page":1,"x":320,"y":600,"width":100,"height":30,"recipientOrder":2} ]
- Add Slack node to notify team when sent
[Schedule Trigger] → [TurboDocx: Get Status] → [IF: Status=Completed] → [TurboDocx: Download] → [Google Drive: Upload]
Step-by-step:
- Schedule: Run every hour
- TurboDocx: Get Status: Check document
{{$json.documentId}} - IF: Only continue if status is "completed"
- TurboDocx: Download: Get signed PDF
- Google Drive: Upload to contracts folder
[Schedule Trigger] → [TurboDocx: Get Status] → [IF: Pending > 3 Days] → [TurboDocx: Resend Email]
[Webhook] → [TurboDocx: Generate Document] → [TurboSign: Prepare for Signing] → [Email: Notify Sender]
Step-by-step:
- Webhook: Receive customer data and contract details
- TurboDocx: Generate Document: Create personalized contract from template
- Returns
deliverableIdin output
- Returns
- TurboSign: Prepare for Signing:
- File Input Method: Select "Deliverable"
- Deliverable ID:
{{$json.deliverableId}}(from previous TurboDocx node) - Recipients:
[ {"name":"{{$json.customerName}}","email":"{{$json.customerEmail}}","order":1}, {"name":"Sales Rep","email":"sales@company.com","order":2} ] - Fields: Use template anchors or coordinates
- Email: Notify sender that signature request was sent
Why use this workflow: Seamlessly generate personalized documents and send them for signature in one automation. The deliverable ID links the generated document directly to the signature request.
TurboSign supports two methods for placing signature fields on documents:
| Property | Type | Required | Description | Example |
|---|---|---|---|---|
type |
string | ✅ | Field type | "signature", "date", "text" |
page |
number | ✅ | PDF page number (1-indexed) | 1 |
x |
number | ✅ | Horizontal position in pixels | 100 |
y |
number | ✅ | Vertical position in pixels | 500 |
width |
number | ✅ | Field width in pixels | 200 |
height |
number | ✅ | Field height in pixels | 50 |
recipientOrder |
number | ✅ | Which recipient fills this field | 1 |
Example:
{
"type": "signature",
"page": 1,
"x": 100,
"y": 500,
"width": 200,
"height": 50,
"recipientOrder": 1
}Best for: Documents with consistent layouts where you know exact field positions.
| Property | Type | Required | Description | Example |
|---|---|---|---|---|
type |
string | ✅ | Field type | "signature", "date", "text" |
recipientOrder |
number | ✅ | Which recipient fills this field | 1 |
template.anchor |
string | ✅ | Text pattern to find in document | "{sig}", "{client_signature}" |
template.placement |
string | ✅ | Where to place field relative to anchor | "replace", "after", "below" |
template.width |
number | ✅ | Field width in pixels | 200 |
template.height |
number | ✅ | Field height in pixels | 50 |
Placement Options:
| Placement | Description |
|---|---|
replace |
Replace the anchor text with the field |
after |
Place field to the right of anchor |
before |
Place field to the left of anchor |
above |
Place field above anchor |
below |
Place field below anchor |
Example:
{
"type": "signature",
"recipientOrder": 1,
"template": {
"anchor": "{client_sig}",
"placement": "replace",
"width": 180,
"height": 50
}
}Complete Template Anchor Example:
Document with anchors:
Client Signature: {client_sig} Date: {client_date}
Company Rep: {company_sig} Date: {company_date}
Fields configuration:
[
{"type": "signature", "recipientOrder": 1, "template": {"anchor": "{client_sig}", "placement": "replace", "width": 180, "height": 50}},
{"type": "date", "recipientOrder": 1, "template": {"anchor": "{client_date}", "placement": "replace", "width": 100, "height": 30}},
{"type": "signature", "recipientOrder": 2, "template": {"anchor": "{company_sig}", "placement": "replace", "width": 180, "height": 50}},
{"type": "date", "recipientOrder": 2, "template": {"anchor": "{company_date}", "placement": "replace", "width": 100, "height": 30}}
]Best for: Document templates with variable content where exact positions may shift.
| Type | Description | Use Case |
|---|---|---|
signature |
Full signature field | Primary signature area |
initial |
Initial field (smaller) | Initial each page or clause |
date |
Date picker field | Signature date, start date, etc. |
full_name |
Recipient's full name | Auto-filled from the recipient |
first_name |
Recipient's first name | Auto-filled from the recipient |
last_name |
Recipient's last name | Auto-filled from the recipient |
email |
Recipient's email | Auto-filled from the recipient |
title |
Recipient's job title | Auto-filled from the recipient |
company |
Recipient's company | Auto-filled from the recipient |
text |
Text input field | Enter names, titles, or custom text |
checkbox |
Checkbox field | Agree to terms, opt-in selections |
Any field may carry an optional defaultValue to pre-fill it (max 600 characters). It is a pure
passthrough — forwarded verbatim to the backend, which owns validation.
- Date fields fill with the signing date by default. To pin a specific date instead, set
defaultValueto that date inMM/DD/YYYY(e.g."12/31/2026"); omit it (or send"") to keep the signing-date behaviour. The value must be a real calendar date — a non-existent date such as"02/31/2026"is rejected. signatureandinitialfields cannot carry adefaultValue, and adatefield cannot beisReadonly.
[
{"recipientEmail": "client@example.com", "type": "date", "template": {"anchor": "{effective_date}", "placement": "replace", "width": 120, "height": 20}, "defaultValue": "12/31/2026"}
]Any field may carry an optional metadata object that turns a checkbox into a controller
for one or more dependent fields. When the checkbox's state matches the rule, the dependent
field is shown (or unlocked) to the signer. This is a pure passthrough — the metadata object
is forwarded verbatim to the backend, which owns the behaviour.
On the controlling checkbox — give it a stable fieldKey so dependents can reference it:
| Property | Type | Required | Description | Example |
|---|---|---|---|---|
metadata.fieldKey |
string | ✅ (to be referenced) | Stable id for this checkbox | "agree_terms" |
The controlling field must be type: "checkbox".
On a dependent field — add a conditional rule that points at the checkbox's fieldKey:
| Property | Type | Required | Description | Example |
|---|---|---|---|---|
metadata.conditional.controllingFieldKey |
string | ✅ | Must equal the controlling checkbox's metadata.fieldKey |
"agree_terms" |
metadata.conditional.operator |
string | ✅ | "is_checked" or "is_not_checked" |
"is_checked" |
metadata.conditional.action |
string | ✅ | "show" (hidden until the rule is met) or "unlock" (visible-but-read-only until the rule is met) |
"show" |
Notes:
- The node validates the shape of each rule (
operator,action, and a non-emptycontrollingFieldKey) and fails fast with a clear error before sending — matching the backend's 400. AcontrollingFieldKeythat names no existing checkbox (a dangling reference) is allowed: the backend fails open by design and simply ignores the rule. metadatais entirely optional. Fields without it behave exactly as before.
Worked example — a checkbox controls a text field (is_checked → show):
The "Other reason" text field stays hidden until the signer checks the "I have a different reason" box.
[
{
"recipientEmail": "client@example.com",
"type": "checkbox",
"template": {
"anchor": "{OtherReasonToggle}",
"placement": "replace",
"size": { "width": 20, "height": 20 }
},
"metadata": { "fieldKey": "other_reason_toggle" }
},
{
"recipientEmail": "client@example.com",
"type": "text",
"template": {
"anchor": "{OtherReason}",
"placement": "replace",
"size": { "width": 240, "height": 30 }
},
"metadata": {
"conditional": {
"controllingFieldKey": "other_reason_toggle",
"operator": "is_checked",
"action": "show"
}
}
}
]Full IF/THEN workflow (Prepare for Signing):
{
"nodes": [
{
"parameters": {
"resource": "turboSign",
"operation": "prepareForSigning",
"fileInputMethod": "url",
"fileLink": "https://my-bucket.s3.amazonaws.com/agreement.pdf",
"recipients": "[{\"name\":\"Client Name\",\"email\":\"client@example.com\",\"signingOrder\":1}]",
"fields": "[{\"recipientEmail\":\"client@example.com\",\"type\":\"checkbox\",\"template\":{\"anchor\":\"{OtherReasonToggle}\",\"placement\":\"replace\",\"size\":{\"width\":20,\"height\":20}},\"metadata\":{\"fieldKey\":\"other_reason_toggle\"}},{\"recipientEmail\":\"client@example.com\",\"type\":\"text\",\"template\":{\"anchor\":\"{OtherReason}\",\"placement\":\"replace\",\"size\":{\"width\":240,\"height\":30}},\"metadata\":{\"conditional\":{\"controllingFieldKey\":\"other_reason_toggle\",\"operator\":\"is_checked\",\"action\":\"show\"}}}]",
"additionalFields": {
"senderEmail": "sales@yourcompany.com",
"documentName": "Service Agreement"
}
},
"name": "TurboSign: Send Signature",
"type": "n8n-nodes-turbodocx.turboDocx",
"typeVersion": 1,
"position": [640, 300]
}
]
}[
{
"name": "John Doe",
"email": "john@example.com",
"order": 1
},
{
"name": "Jane Smith",
"email": "jane@example.com",
"order": 2
}
]Signing Order:
- Recipients sign in order (order 1, then order 2, etc.)
- Use the same order number for parallel signing (both can sign at the same time)
TurboSign supports 4 different ways to provide documents for signature requests:
| Method | What It Does | When to Use | Example |
|---|---|---|---|
| Upload File | Upload PDF, DOCX, or PPTX directly from workflow | Files from triggers, HTTP requests, or local storage | Binary data from previous node |
| File URL | Download from external URL (S3, Google Drive, Dropbox, etc.) | Documents hosted on cloud storage or CDN | https://bucket.s3.amazonaws.com/contract.pdf |
| Deliverable | Reference existing TurboDocx deliverable by UUID | Generated a document and want to send for signature | 550e8400-e29b-41d4-a716-446655440000 |
| Template | Use TurboDocx template by UUID (static, no data merge) | Pre-configured templates ready to send as-is | 660e8400-e29b-41d4-a716-446655440001 |
| Format | Extension | Auto-Convert to PDF |
|---|---|---|
.pdf |
No (already PDF) | |
| Microsoft Word | .docx |
✅ Yes |
| Microsoft PowerPoint | .pptx |
✅ Yes |
Generate + Sign:
[TurboDocx: Generate] → [TurboSign: Prepare for Signing with Deliverable ID]
Download + Sign:
[HTTP Request: Get File] → [TurboSign: Prepare for Signing with Binary Upload]
Cloud Storage + Sign:
[TurboSign: Prepare for Signing with File URL from S3/Drive/Dropbox]
- n8n 1.60.0 or later
- Compatible with n8n Cloud (zero runtime dependencies)
- Works with self-hosted n8n instances
Pull requests are welcome! For major changes, please open an issue first to discuss what you would like to change.
For issues or questions:
- GitHub Issues: https://github.com/turbodocx/n8n-nodes-turbodocx/issues
- Discord: Join our community
| Package | Description |
|---|---|
| @turbodocx/html-to-docx | Convert HTML to Word documents |

