DocuSeal: Self-Hosted Document Signing That Replaces DocuSign
Every business signs documents. Contracts, NDAs, onboarding forms, vendor agreements. DocuSign charges $10-60/month per user for the privilege of putting a signature on a PDF. For a small business or self-hoster, that cost adds up fast -- especially when you only send a few documents per month.
Photo by Patrick Konior on Unsplash
DocuSeal is an open-source document signing platform that you host yourself. Upload a PDF, define signature fields, send it to signers, and get back a completed document with legally valid electronic signatures. No per-document fees, no per-user pricing, and your documents never leave your server.
What DocuSeal Offers
- PDF and DOCX templates -- Upload documents and define fields with a drag-and-drop editor
- Electronic signatures -- Draw, type, or upload signature images
- Multi-party signing -- Send documents to multiple signers in sequence or parallel
- Email delivery -- Automatic email notifications to signers with signing links
- Audit trail -- Timestamped log of every action on each document
- API access -- Full REST API for programmatic document creation and signing
- Webhook notifications -- Get notified when documents are viewed, signed, or completed
- Self-hosted -- Your documents, your server, your data
Docker Deployment
# docker-compose.yml
services:
docuseal:
image: docuseal/docuseal:latest
ports:
- "3000:3000"
volumes:
- docuseal_data:/data
environment:
- DATABASE_URL=postgresql://docuseal:docusealpass@db:5432/docuseal
- SECRET_KEY_BASE=your-random-secret-key-here
depends_on:
- db
restart: unless-stopped
db:
image: postgres:16
volumes:
- docuseal_db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=docuseal
- POSTGRES_USER=docuseal
- POSTGRES_PASSWORD=docusealpass
restart: unless-stopped
volumes:
docuseal_data:
docuseal_db:
docker compose up -d
Access DocuSeal at http://your-server:3000 and create an admin account on the first visit.
Important configuration notes:
- Generate
SECRET_KEY_BASEwithopenssl rand -hex 64. This encrypts session data -- losing it invalidates all active sessions - PostgreSQL is recommended for production. DocuSeal also supports SQLite for simpler setups (remove the
DATABASE_URLline and thedbservice) - For production use, put DocuSeal behind a reverse proxy (Caddy, Traefik, Nginx) with HTTPS. Signers will receive links to your domain, and those links must be secure
S3-Compatible Storage
By default, DocuSeal stores documents on the local filesystem. For better durability, configure S3-compatible storage:
environment:
- AWS_ACCESS_KEY_ID=your-access-key
- AWS_SECRET_ACCESS_KEY=your-secret-key
- AWS_REGION=us-east-1
- AWS_S3_BUCKET=docuseal-documents
- AWS_S3_ENDPOINT=https://s3.your-minio.com # For MinIO or other S3-compatible
This works with AWS S3, MinIO, Backblaze B2, or any S3-compatible storage.
Creating Templates
Templates are reusable document forms with predefined fields.
Template Editor
- Go to Templates and click New Template
- Upload a PDF or DOCX file
- The drag-and-drop editor opens. Add fields:
- Signature -- Where signers place their signature
- Initials -- For initialing individual pages
- Date -- Auto-filled or manually entered dates
- Text -- Free-text input fields
- Checkbox -- Boolean checkboxes
- Select -- Dropdown selections
- Image -- Upload an image (company logo, photo ID)
- Assign each field to a signer role (e.g., "Client", "Company Representative")
- Save the template
Multi-Party Templates
For documents requiring multiple signers:
- Define signer roles when creating the template (e.g., "Landlord" and "Tenant")
- Assign each field to the appropriate role
- Set the signing order -- sequential (Landlord signs first, then Tenant) or parallel (both can sign simultaneously)
Like what you're reading? Subscribe to Self-Hosted Weekly — free weekly guides in your inbox.
Sending Documents for Signing
- Select a template
- Enter signer details (name, email)
- Click Send
- Each signer receives an email with a unique signing link
- Signers complete their fields and submit
- You receive the completed, signed PDF
The signed document includes a certificate of completion with timestamps, IP addresses, and signer details -- the same audit trail that makes electronic signatures legally valid under the ESIGN Act and eIDAS.
API Integration
DocuSeal's REST API lets you automate document workflows programmatically. This is where it shines for developers.
Create and Send a Document via API
curl -X POST https://docuseal.yourdomain.com/api/submissions \
-H "X-Auth-Token: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"template_id": 1,
"send_email": true,
"submitters": [
{
"role": "Client",
"email": "[email protected]",
"fields": [
{ "name": "Company Name", "default_value": "Acme Corp" },
{ "name": "Contract Date", "default_value": "2026-02-14" }
]
}
]
}'
List Completed Submissions
curl https://docuseal.yourdomain.com/api/submissions \
-H "X-Auth-Token: your-api-token"
Download Signed Documents
curl https://docuseal.yourdomain.com/api/submissions/42/documents \
-H "X-Auth-Token: your-api-token" \
--output signed-contract.pdf
The API is clean and well-documented. Common integrations include:
- CRM workflows -- Auto-send contracts when a deal closes
- Onboarding systems -- Send employment paperwork to new hires
- Lease management -- Generate and send rental agreements
- Invoice approval -- Route invoices for signature before payment
Webhook Support
Configure webhooks to receive real-time notifications:
- Go to Settings > Webhooks
- Add your endpoint URL
- Select the events you want:
submission.created-- Document sent for signingsubmission.completed-- All signers have completedsubmitter.completed-- Individual signer completed their part
Example webhook payload:
{
"event_type": "submission.completed",
"timestamp": "2026-02-14T10:30:00Z",
"data": {
"id": 42,
"template_id": 1,
"status": "completed",
"submitters": [
{
"email": "[email protected]",
"completed_at": "2026-02-14T10:30:00Z"
}
]
}
}
Webhooks integrate naturally with n8n, Windmill, or any automation platform -- sign a document and trigger downstream workflows automatically.
DocuSeal vs DocuSign
| Feature | DocuSeal | DocuSign |
|---|---|---|
| Pricing | Free (self-hosted) | $10-60/user/month |
| Document storage | Your server | DocuSign cloud |
| Templates | Unlimited | Plan-dependent |
| API access | Included | Business plan ($40+/mo) |
| Webhooks | Included | Business plan |
| Audit trail | Yes | Yes |
| Legal validity | ESIGN/eIDAS | ESIGN/eIDAS |
| Mobile signing | Yes (responsive) | Yes (native apps) |
| Advanced workflows | Basic sequencing | Complex routing |
| Integrations | API + webhooks | 400+ native |
| Branding | Full customization | Plan-dependent |
| Support | Community | Paid support |
When to Choose DocuSeal
- You send fewer than 100 documents per month and don't want per-user fees
- You need API access without paying for an enterprise plan
- You want documents stored on your own infrastructure
- You're integrating signing into a custom application
- You care about data sovereignty
When DocuSign Still Makes Sense
- You need complex approval routing with conditional logic
- Your counterparties expect DocuSign specifically (brand recognition)
- You need native integrations with Salesforce, HubSpot, or other enterprise CRM
- You need advanced identity verification (KBA, phone authentication)
Production Tips
Email Configuration
DocuSeal needs to send emails to signers. Configure SMTP:
environment:
- SMTP_ADDRESS=smtp.yourdomain.com
- SMTP_PORT=587
- [email protected]
- SMTP_PASSWORD=your-smtp-password
- [email protected]
Use a dedicated sending domain to keep your signature emails out of spam folders.
Backups
Back up two things:
- PostgreSQL database -- Contains templates, submissions, and audit trails
- Document storage -- The actual PDF files (local volume or S3)
# Database backup
docker exec docuseal-db-1 pg_dump -U docuseal docuseal > docuseal-backup.sql
# Volume backup (if using local storage)
docker run --rm -v docuseal_data:/data -v $(pwd):/backup alpine \
tar czf /backup/docuseal-data.tar.gz /data
Custom Branding
DocuSeal supports white-labeling in the settings panel -- custom logo, colors, and email templates. Your signers see your brand, not DocuSeal's.
The Bottom Line
DocuSeal handles the core document signing workflow -- templates, multi-party signing, email delivery, audit trails -- without the SaaS pricing model. The API is particularly strong, making it easy to embed signing into your own applications. If your signing needs are straightforward (send document, collect signatures, get signed PDF), DocuSeal does exactly that for zero recurring cost. Deploy it in Docker, configure your SMTP, and stop paying per-signature fees.
