ContractPilot
A DocuSign-lite we shipped over a long weekend.
Startup tooling · Bootstrapped · 3 engineers
The build
Replaced DocuSign for simple B2B contracts. 200 envelopes/month, $725/mo DocuSign bill → $79/mo SnapPDF + $0 SignBolt (base tier).
Stack
- · Remix
- · PlanetScale
- · SignBolt
- · SnapPDF
Architecture
Ops used: /merge → /fill-form → /sign → /protect → /metadata
How they use SnapPDF
ContractPilot builds internal tooling for startups. Their own contract flow — SOWs, NDAs, MSAs with early customers — ran on DocuSign Business Pro at $65/user × 5 = $325/month, plus envelope overages of ~$400/month on their 200-envelope volume.
The team loved DocuSign's UI for counterparties but resented the cost and the template-editing experience (which required specific DocuSign training and lived entirely inside DocuSign's UI, not in version control).
Over a long weekend, the three engineers shipped a replacement using SnapPDF + SignBolt. Templates live as PDFs in their git repo, reviewable by counsel as GitHub PRs. The flow:
1. SnapPDF merge: cover + body + exhibits into a single PDF. 2. SnapPDF fill-form: pre-populate client name, deal value, dates from their CRM. 3. Hand off to SignBolt for counterparty signing (retains the polished signing UX that DocuSign offers). 4. On signature completion (SignBolt webhook), SnapPDF sign with their CFO's typed signature, SnapPDF protect with AES-256, archive to S3 with metadata-tagged contract ID.
Result: $646/month saved, templates now reviewable in PRs (counsel gets a diff instead of a DocuSign admin login), and contracts close 22% faster on average (no waiting for DocuSign's UI to render envelope flows).
The hardest part was deciding not to over-engineer it. The first draft had an in-house signing UI; they deleted it and went with SignBolt for the counterparty side. That decision — combine SnapPDF for prep + SignBolt for signing — is now their standard recommendation to other startups.
Outcomes
Integration pattern
A simplified excerpt showing the core SnapPDF calls.
// apps/contracts/src/flows/send-sow.ts
import { SnapPDF } from '@snappdf/sdk';
const snap = new SnapPDF({ apiKey: process.env.SNAPPDF_KEY! });
export async function sendSOW(deal: Deal) {
// 1. assemble
const { pdf: merged } = await snap.pdf.merge({
files: [COVER_TEMPLATE, SOW_TEMPLATE, deal.exhibits.map(e => e.url)].flat(),
});
// 2. pre-fill from CRM
const { pdf: filled } = await snap.pdf.fillForm({
file: merged,
values: {
client_name: deal.company,
deal_value: formatUSD(deal.amount),
effective_date: deal.startDate.toISOString().slice(0, 10),
project_description: deal.scope,
},
flatten: false,
});
// 3. hand off to SignBolt
const envelope = await fetch('https://api.snappdf.dev/api/v1/signbolt/handoff', {
method: 'POST',
headers: { Authorization: 'Bearer ' + process.env.SNAPPDF_KEY },
body: JSON.stringify({
file: filled,
recipients: [{ email: deal.contactEmail, name: deal.contactName, role: 'signer' }],
subject: `SOW — ${deal.company}`,
}),
}).then(r => r.json());
await db.deals.update(deal.id, { envelopeId: envelope.id, status: 'sent-for-signature' });
}Start building like this
Free tier gives you 100 ops/month — enough to prototype any of the flows on this page. No card required.