documenso-core-workflow-a
Automates the Documenso document creation process, including file uploads and recipient management.
Install
mkdir -p .claude/skills/documenso-core-workflow-a && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8160" && unzip -o skill.zip -d .claude/skills/documenso-core-workflow-a && rm skill.zipInstalls to .claude/skills/documenso-core-workflow-a
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Implement Documenso document creation and recipient management workflows.Key capabilities
- →Create document shells
- →Upload PDF files for signing
- →Assign recipient roles including Signer and Approver
- →Define sequential signing orders
- →Position signature and data fields using percentage coordinates
How it works
The workflow uses the Documenso SDK to initialize a document, attach a PDF, and programmatically place fields for specific recipients.
Inputs & outputs
When to use documenso-core-workflow-a
- →Creating document shells
- →Uploading PDFs for signing
- →Defining recipient roles
- →Positioning signature fields
About this skill
Documenso Core Workflow A: Document Creation & Recipients
Overview
Complete workflow for creating documents, managing recipients with different roles, positioning fields, and controlling signing order. Covers both the SDK and v1 REST API for document-centric operations.
Prerequisites
- Completed
documenso-install-authsetup - Understanding of
documenso-sdk-patterns - PDF file ready for signing
Instructions
Step 1: Create a Document with the SDK
import { Documenso } from "@documenso/sdk-typescript";
import { readFileSync } from "fs";
const client = new Documenso({ apiKey: process.env.DOCUMENSO_API_KEY! });
// Create document shell
const doc = await client.documents.createV0({
title: "Service Agreement — Q1 2026",
});
// Upload PDF
const pdf = readFileSync("./contracts/service-agreement.pdf");
await client.documents.setFileV0(doc.documentId, {
file: new Blob([pdf], { type: "application/pdf" }),
});
Step 2: Recipient Roles
Documenso supports these recipient roles:
| Role | Behavior |
|---|---|
SIGNER | Must complete all assigned fields to finish |
VIEWER | Receives a copy but takes no action |
APPROVER | Must approve before signers can proceed |
CC | Receives a completed copy after all signatures |
// Add multiple recipients with roles
const signer = await client.documentsRecipients.createV0(doc.documentId, {
email: "[email protected]",
name: "Alice CEO",
role: "SIGNER",
});
const approver = await client.documentsRecipients.createV0(doc.documentId, {
email: "[email protected]",
name: "Legal Team",
role: "APPROVER",
});
const cc = await client.documentsRecipients.createV0(doc.documentId, {
email: "[email protected]",
name: "Records",
role: "CC",
});
Step 3: Signing Order
Control the sequence in which recipients act. Lower numbers go first.
// Sequential signing: legal approves, then CEO signs
await client.documentsRecipients.createV0(doc.documentId, {
email: "[email protected]",
name: "Legal",
role: "APPROVER",
signingOrder: 1, // Goes first
});
await client.documentsRecipients.createV0(doc.documentId, {
email: "[email protected]",
name: "CEO",
role: "SIGNER",
signingOrder: 2, // Goes after legal approves
});
Step 4: Add Fields to Document
Field coordinates use percentage-based positioning (0-100 for both X and Y axes). The origin is the top-left corner of the page.
// Signature field — bottom of page 1
await client.documentsFields.createV0(doc.documentId, {
recipientId: signer.recipientId,
type: "SIGNATURE",
pageNumber: 1,
pageX: 10, // 10% from left
pageY: 85, // 85% from top
pageWidth: 30, // 30% of page width
pageHeight: 5, // 5% of page height
});
// Date field — next to signature
await client.documentsFields.createV0(doc.documentId, {
recipientId: signer.recipientId,
type: "DATE",
pageNumber: 1,
pageX: 60,
pageY: 85,
pageWidth: 20,
pageHeight: 3,
});
// Name field — auto-filled from recipient
await client.documentsFields.createV0(doc.documentId, {
recipientId: signer.recipientId,
type: "NAME",
pageNumber: 1,
pageX: 10,
pageY: 78,
pageWidth: 30,
pageHeight: 3,
});
// Text field — custom input (e.g., title/position)
await client.documentsFields.createV0(doc.documentId, {
recipientId: signer.recipientId,
type: "TEXT",
pageNumber: 1,
pageX: 60,
pageY: 78,
pageWidth: 30,
pageHeight: 3,
});
Step 5: Multi-Page Document with Multiple Signers
async function createMultiSignerContract(
pdfPath: string,
signers: Array<{ email: string; name: string; signPage: number }>
) {
const client = new Documenso({ apiKey: process.env.DOCUMENSO_API_KEY! });
const doc = await client.documents.createV0({ title: "Multi-Party Agreement" });
const pdf = readFileSync(pdfPath);
await client.documents.setFileV0(doc.documentId, {
file: new Blob([pdf], { type: "application/pdf" }),
});
for (let i = 0; i < signers.length; i++) {
const s = signers[i];
const recip = await client.documentsRecipients.createV0(doc.documentId, {
email: s.email,
name: s.name,
role: "SIGNER",
signingOrder: i + 1,
});
// Each signer gets signature + date on their assigned page
await client.documentsFields.createV0(doc.documentId, {
recipientId: recip.recipientId,
type: "SIGNATURE",
pageNumber: s.signPage,
pageX: 10, pageY: 80, pageWidth: 30, pageHeight: 5,
});
await client.documentsFields.createV0(doc.documentId, {
recipientId: recip.recipientId,
type: "DATE",
pageNumber: s.signPage,
pageX: 60, pageY: 80, pageWidth: 20, pageHeight: 3,
});
}
await client.documents.sendV0(doc.documentId);
return doc.documentId;
}
Step 6: Document Metadata and Settings
// v1 REST API: create document with metadata
const res = await fetch("https://app.documenso.com/api/v1/documents", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DOCUMENSO_API_KEY}`,
},
body: (() => {
const form = new FormData();
form.append("title", "NDA — Confidential");
form.append("file", new Blob([pdf], { type: "application/pdf" }));
return form;
})(),
});
const document = await res.json();
Step 7: Query and Filter Documents
// List documents with pagination
const { documents } = await client.documents.findV0({
page: 1,
perPage: 20,
orderByColumn: "createdAt",
orderByDirection: "desc",
});
// Get single document with all details
const detail = await client.documents.getV0(documentId);
console.log(`Status: ${detail.status}`); // DRAFT | PENDING | COMPLETED
console.log(`Recipients: ${detail.recipients.length}`);
console.log(`Fields: ${detail.fields.length}`);
Document Status Flow
DRAFT ──send()──→ PENDING ──all sign──→ COMPLETED
│
├──reject()──→ REJECTED
└──cancel()──→ CANCELLED
Only DRAFT documents can be modified (add recipients, fields, change PDF).
Error Handling
| Error | HTTP | Cause | Solution |
|---|---|---|---|
| Document not found | 404 | Invalid document ID | Verify ID with findV0() |
| Recipient exists | 400 | Duplicate email on same doc | Update existing with updateV0() |
| Invalid field position | 400 | pageX/pageY > 100 or < 0 | Use percentage values 0-100 |
| Cannot modify sent doc | 400 | Document status is PENDING | Create new document or cancel first |
| File too large | 413 | PDF exceeds plan limit | Compress PDF (plan limits vary) |
Resources
Next Steps
For template-based workflows and direct signing links, see documenso-core-workflow-b.
When not to use it
- →Creating documents from reusable templates
- →Implementing direct public signing links
Prerequisites
Limitations
- →Only DRAFT documents can be modified
- →Field coordinates must be percentage-based values between 0 and 100
How it compares
This method allows for precise, programmatic field placement and role assignment compared to manual document preparation.
Compared to similar skills
documenso-core-workflow-a side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| documenso-core-workflow-a (this skill) | 0 | 27d | Review | Intermediate |
| mcp-builder | 136 | 3mo | Review | Advanced |
| telegram-mini-app | 62 | 6mo | Review | Advanced |
| stripe-integration | 48 | 2mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
mcp-builder
anthropics
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
telegram-mini-app
davila7
Expert in building Telegram Mini Apps (TWA) - web apps that run inside Telegram with native-like experience. Covers the TON ecosystem, Telegram Web App API, payments, user authentication, and building viral mini apps that monetize. Use when: telegram mini app, TWA, telegram web app, TON app, mini app.
stripe-integration
wshobson
Implement Stripe payment processing for robust, PCI-compliant payment flows including checkout, subscriptions, and webhooks. Use when integrating Stripe payments, building subscription systems, or implementing secure checkout flows.
copilot-sdk
github
Build agentic applications with GitHub Copilot SDK. Use when embedding AI agents in apps, creating custom tools, implementing streaming responses, managing sessions, connecting to MCP servers, or creating custom agents. Triggers on Copilot SDK, GitHub SDK, agentic app, embed Copilot, programmable agent, MCP server, custom agent.
nodejs-backend-patterns
wshobson
Build production-ready Node.js backend services with Express/Fastify, implementing middleware patterns, error handling, authentication, database integration, and API design best practices. Use when creating Node.js servers, REST APIs, GraphQL backends, or microservices architectures.
chatgpt-app-builder
mcp-use
Build ChatGPT apps with interactive widgets using mcp-use and OpenAI Apps SDK. Use when creating ChatGPT apps, building MCP servers with widgets, defining React widgets, working with Apps SDK, or when user mentions ChatGPT widgets, mcp-use widgets, or Apps SDK development.