Clients can't sign contracts immediately — you lose deals. Signing documents right in the browser cuts the deal cycle by 3–4 times and eliminates document loss. Unlike ready-made services, our solution is fully customizable to your workflow. It integrates with your existing infrastructure and provides the required level of legal validity. A custom solution costs 3 times less at 1000 signatures per month — no monthly per-user subscriptions. Typical services often fail to handle complex workflows: approval chains, parallel signing, 1C integration. We solve these challenges based on 10+ years of experience in document flow development. Contact us — we will evaluate your project within one business day.
Why Browser Signing Is Better Than Ready-Made Services?
Ready-made services (DocuSign and others) offer standard functionality but fall short in three key areas: cost, customization, and legal compliance.
| Criteria | Ready-Made Service | Our Custom Solution |
|---|---|---|
| Design customization | Limited (branding, not full UX) | Full — embedded in your interface without redirects |
| CRM/ERP integration | Via paid API or ready-made connectors | REST API adapted to your stack in 1–2 days |
| Signing workflow | Linear, vendor-defined | Any: sequential, parallel, hierarchical |
| Legal validity | Suitable for international documents, but local requirements may not be met | Full compliance with Russian legislation (Federal Law No. 63-FZ) with audit log |
How Electronic Signature Levels Work?
Electronic signatures differ in legal weight. We implement all three levels — from simple to qualified.
| Level | Confirmation Method | Legal Effect | Typical Scenarios |
|---|---|---|---|
| Simple ES | Login/password, SMS code | Weak, suitable for internal EDI | Consent to offer, internal documents |
| Enhanced non-qualified | Drawn signature, cryptographic hash | Medium, requires mutual agreement | B2B contracts, commercial proposals |
| Enhanced qualified (QES) | Certified cryptographic protection | Full, equivalent to handwritten signature | Government contracts, banks |
Most 'browser signing' scenarios are covered by simple or enhanced non-qualified ES. QES requires an additional plugin or token, but we integrate it as well.
How We Implement Signing: Tech Stack and Steps
The signing process consists of several steps:
- The user opens the document in the browser. We use the
react-pdf-viewerlibrary with custom logic that requires viewing all pages. This blocks signing until the entire document is reviewed. - After viewing, the user enters their signature — drawn with the mouse or typed text. If SMS verification is needed, they enter the code from the message.
- The browser sends data to the server: signature image and metadata (IP, user-agent, time). The server computes the document hash, embeds the signature using
pdf-lib, and saves the signed version. - The server generates an audit log and sends notifications to the parties. The document status changes to 'signed'.
Example of signature embedding in PDF
// Backend: processing signed document async function processDocumentSignature(documentId, userId, signatureDataUrl, metadata) { const document = await db.documents.findByPk(documentId); // 1. Load original PDF const originalPdf = await s3.getObject({ Bucket: BUCKET, Key: document.s3Key }).promise(); // 2. Compute hash of original for audit log const originalHash = crypto.createHash('sha256').update(originalPdf.Body).digest('hex'); // 3. Embed signature const { PDFDocument, rgb } = require('pdf-lib'); const pdfDoc = await PDFDocument.load(originalPdf.Body); const lastPage = pdfDoc.getPages().at(-1); // Add signature image const signatureImage = await pdfDoc.embedPng( Buffer.from(signatureDataUrl.replace(/^data:image\/png;base64,/, ''), 'base64') ); lastPage.drawImage(signatureImage, { x: 60, y: 50, width: 150, height: 50 }); // Add text stamp const font = await pdfDoc.embedFont('Helvetica'); lastPage.drawText( `Signed: ${metadata.signerName}\n${metadata.signedAt.toISOString()}\nIP: ${metadata.ip}`, { x: 60, y: 30, size: 8, font, color: rgb(0.4, 0.4, 0.4) } ); const signedPdfBytes = await pdfDoc.save(); // 4. Save signed version const signedKey = `signed/${documentId}/${userId}.pdf`; await s3.putObject({ Bucket: BUCKET, Key: signedKey, Body: signedPdfBytes }).promise(); // 5. Record in DB await db.documentSignatures.create({ documentId, signerId: userId, signatureImageUrl: signatureDataUrl, originalHash, signedDocumentKey: signedKey, metadata: { ip: metadata.ip, userAgent: metadata.userAgent, signedAt: new Date() }, }); return signedKey; } SMS Confirmation as Simple ES
For legally significant consents, we use SMS confirmation. The code hash is stored in Redis with a TTL of 5 minutes. The code is sent to the phone, the user enters it on the site. After verification, the signature is recorded. This approach reduces costs by 40% compared to QES.
// Generate and send code async function initiateSmsSigning(documentId, userId, phone) { const code = Math.random().toString(36).substring(2, 8).toUpperCase(); const codeHash = bcrypt.hashSync(code, 10); await redis.setex( `sms_sign:${documentId}:${userId}`, 300, // 5 minutes JSON.stringify({ codeHash, phone, attempts: 0 }) ); await smsService.send(phone, `Document signing code: ${code}. Valid for 5 minutes.`); } // Verify code and record signature async function confirmSmsSigning(documentId, userId, code) { const stored = JSON.parse(await redis.get(`sms_sign:${documentId}:${userId}`)); if (!stored || !bcrypt.compareSync(code, stored.codeHash)) { throw new Error('Invalid code'); } await redis.del(`sms_sign:${documentId}:${userId}`); await createSignatureRecord(documentId, userId, 'sms', { phone: stored.phone }); } Multi-Party Signing: Workflow for Multiple Parties
Often a document requires signatures from several participants (e.g., contract between client and contractor). We implement a sequential workflow: Party A signs → document gets status partially_signed → system sends notification to Party B with a signing link → Party B signs → status fully_signed. Both parties receive the final PDF by email. 95% of users sign the document on the first attempt, and the approval time shrinks from 3 days to 1 hour. If needed, we add parallel signing or notifications via Telegram/WhatsApp. The workflow supports up to 10 signers.
What's Included
- Analysis of your business process and legal requirements
- Designing the signing workflow (single, multi, hierarchical)
- Frontend component development (PDF viewer, signature input)
- Backend logic (signature embedding, audit log generation, storage)
- Integration with SMS gateway or cryptographic protection (if needed)
- Integration with your CRM/ERP via REST API
- API and administration documentation
- Testing (load, legal)
- Deployment and one month of post-launch support
Timelines and How to Order
Estimated timelines:
- Basic implementation (viewing + drawn signature) — from 5 business days.
- SMS confirmation — additional 1–2 days.
- Multi-party signing with workflow — 3–4 days.
Get a consultation — we'll choose the optimal architecture for your project. Order document signing implementation today.







