<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gaurav Rathore</title>
    <description>The latest articles on DEV Community by Gaurav Rathore (@gauravrathore2u).</description>
    <link>https://dev.to/gauravrathore2u</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3857181%2F1b2b50f7-0e59-4315-bc39-8ee37eaa7c94.jpg</url>
      <title>DEV Community: Gaurav Rathore</title>
      <link>https://dev.to/gauravrathore2u</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gauravrathore2u"/>
    <language>en</language>
    <item>
      <title>Building a Robust E-Signature Workflow: Lessons from an HRMS Implementation.</title>
      <dc:creator>Gaurav Rathore</dc:creator>
      <pubDate>Thu, 02 Apr 2026 09:30:57 +0000</pubDate>
      <link>https://dev.to/gauravrathore2u/building-a-robust-e-signature-workflow-lessons-from-an-hrms-implementation-1pb2</link>
      <guid>https://dev.to/gauravrathore2u/building-a-robust-e-signature-workflow-lessons-from-an-hrms-implementation-1pb2</guid>
      <description>&lt;p&gt;If your product handles offer &lt;strong&gt;letters, contracts, onboarding forms, NDAs, or approval workflows&lt;/strong&gt;, document signing eventually becomes a core feature, not just a nice-to-have.&lt;/p&gt;

&lt;p&gt;I recently implemented &lt;strong&gt;e-sign documents in an HRMS platform using DocuSeal&lt;/strong&gt;, with both frontend and backend support. The goal was simple: users should be able to &lt;strong&gt;open a document inside the app, sign it, and let the system automatically store the final signed copy and audit log&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post breaks down the architecture I used and turns it into a** reusable implementation pattern** you can apply in almost any project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why DocuSeal worked well for this use case
&lt;/h2&gt;

&lt;p&gt;When adding document signing to a product, I needed a setup that could support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Template-based signing&lt;/li&gt;
&lt;li&gt;Multiple signers&lt;/li&gt;
&lt;li&gt;Embedded signing inside the app&lt;/li&gt;
&lt;li&gt;Prefilled user data&lt;/li&gt;
&lt;li&gt;Webhook/callback support&lt;/li&gt;
&lt;li&gt;Final signed document retrieval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DocuSeal fits this flow well. It lets you create templates, generate submissions, embed the signing UI, and receive completion callbacks.&lt;/p&gt;

&lt;p&gt;That means your app can own the &lt;strong&gt;business logic and workflow state&lt;/strong&gt;, while DocuSeal handles the actual signing experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture at a glance
&lt;/h2&gt;

&lt;p&gt;A clean document-signing flow usually looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a document and create a DocuSeal template&lt;/li&gt;
&lt;li&gt;Define signer roles and fields&lt;/li&gt;
&lt;li&gt;Create a submission for a specific user&lt;/li&gt;
&lt;li&gt;Prefill known values like name, email, and address&lt;/li&gt;
&lt;li&gt;Open the embedded signing UI in the frontend&lt;/li&gt;
&lt;li&gt;Receive a callback when signing is completed&lt;/li&gt;
&lt;li&gt;Download the signed files and audit log&lt;/li&gt;
&lt;li&gt;Store everything in your own system&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s the same flow in a simple developer-friendly view:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqfzipu9mqw269q7hyq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqfzipu9mqw269q7hyq3.png" alt="The architecture at a glance" width="800" height="1156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Frontend -&amp;gt; requests signing URL / slug from Backend Backend -&amp;gt; authenticates user -&amp;gt; fetches DocuSeal submission details -&amp;gt; returns signer slug Frontend -&amp;gt; mounts  DocuSeal -&amp;gt; sends callback/webhook on completion Backend -&amp;gt; verifies callback secret -&amp;gt; queues event processing -&amp;gt; downloads signed PDF + audit log -&amp;gt; stores files -&amp;gt; updates signer/package status in DB&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Keep DocuSeal behind your backend
&lt;/h2&gt;

&lt;p&gt;A critical architectural decision is keeping the DocuSeal API behind your backend.&lt;/p&gt;

&lt;p&gt;Why this matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your API key stays private&lt;/li&gt;
&lt;li&gt;you control submission creation&lt;/li&gt;
&lt;li&gt;you can validate permissions before exposing a signing session&lt;/li&gt;
&lt;li&gt;you can map DocuSeal IDs to your own internal records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my project, the backend used environment-based configuration like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DOCUSEAL_API_KEY&lt;/li&gt;
&lt;li&gt;DOCUSEAL_ADMIN_EMAIL&lt;/li&gt;
&lt;li&gt;DOCUSEAL_BASE_URL&lt;/li&gt;
&lt;li&gt;DOCUSEAL_CALLBACK_EVENT_SECRET_KEY&lt;/li&gt;
&lt;li&gt;DOCUSEAL_CALLBACK_EVENT_SECRET_VALUE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern is much safer than letting the frontend talk directly to DocuSeal.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Create templates from uploaded files
&lt;/h2&gt;

&lt;p&gt;The first backend capability you need is template creation.&lt;br&gt;
In my implementation, the backend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reads the uploaded file&lt;/li&gt;
&lt;li&gt;sends it to DocuSeal&lt;/li&gt;
&lt;li&gt;uses /templates/pdf for PDFs&lt;/li&gt;
&lt;li&gt;uses /templates/docx for DOCX files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes any uploaded contract, policy, or agreement reusable as a signing template.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best practice:&lt;/strong&gt; treat templates as reusable infrastructure, not one-off documents.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Use a template builder for field placement
&lt;/h2&gt;

&lt;p&gt;On the frontend, I used @docuseal/react and embedded the &lt;strong&gt;DocusealBuilder&lt;/strong&gt; component.&lt;/p&gt;

&lt;p&gt;That allowed admins to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open a template&lt;/li&gt;
&lt;li&gt;define signer roles&lt;/li&gt;
&lt;li&gt;place fields like text, date, phone, checkbox, and signature&lt;/li&gt;
&lt;li&gt;save the field metadata back into our own system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an important design choice. Document signing is not just “upload and sign.” You also need to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;which field belongs to which signer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;which fields are prefilled&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;how those fields map back to your own domain model&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  4. Create submissions dynamically
&lt;/h2&gt;

&lt;p&gt;Once the template exists, the next step is creating a submission.&lt;br&gt;
In HRMS, a submission is created when a user needs to sign a document package. The backend sends DocuSeal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;template_id&lt;/li&gt;
&lt;li&gt;signer list&lt;/li&gt;
&lt;li&gt;signing order&lt;/li&gt;
&lt;li&gt;delivery preferences&lt;/li&gt;
&lt;li&gt;prefilled field values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each signer, I passed values like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;email&lt;/li&gt;
&lt;li&gt;phone&lt;/li&gt;
&lt;li&gt;external_id&lt;/li&gt;
&lt;li&gt;role&lt;/li&gt;
&lt;li&gt;fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The external_id is especially useful because it links the DocuSeal signer back to your own user record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That one field makes later syncing dramatically easier.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Prefill known user data
&lt;/h2&gt;

&lt;p&gt;This is one of the biggest UX wins in any signing flow.&lt;/p&gt;

&lt;p&gt;Instead of asking users to manually type information your app already knows, I prefilled values such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;first name&lt;/li&gt;
&lt;li&gt;last name&lt;/li&gt;
&lt;li&gt;email&lt;/li&gt;
&lt;li&gt;phone&lt;/li&gt;
&lt;li&gt;city&lt;/li&gt;
&lt;li&gt;province&lt;/li&gt;
&lt;li&gt;postal code&lt;/li&gt;
&lt;li&gt;street address&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simplified example looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;name:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"first_name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;readonly:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;default_value:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;user.firstName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the signing flow focused on review and approval, not repetitive data entry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical tip:&lt;/strong&gt; ensure your template field names match either your database keys directly or a clean mapping object.&lt;br&gt;
For example, fields like employee_city, employee_email, or postal_code should map predictably, otherwise the prefill logic becomes messy very quickly.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Embed the signer directly in your app
&lt;/h2&gt;

&lt;p&gt;For the signing experience, I used DocusealForm from @docuseal/react.&lt;/p&gt;

&lt;p&gt;The frontend fetches the signer slug from the backend, then mounts the signing form inside a modal/dialog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;DocusealForm&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`https://docuseal.com/s/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;submitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;submitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onComplete&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleComplete&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the flow feel &lt;strong&gt;native to your product&lt;/strong&gt;, instead of bouncing users to a disconnected external page.&lt;/p&gt;

&lt;p&gt;That small UX detail makes a big difference in onboarding and HR workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Webhook verification is non-negotiable
&lt;/h2&gt;

&lt;p&gt;This is one area where backend discipline matters.&lt;/p&gt;

&lt;p&gt;The frontend onComplete callback is useful for updating the UI, but it should not be your source of truth. The real source of truth should be the backend callback/webhook from DocuSeal.&lt;/p&gt;

&lt;p&gt;In my implementation, the backend validates a &lt;strong&gt;shared secret header&lt;/strong&gt; before processing the callback. That ensures the request is actually coming from the signing provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At minimum, verify a shared secret header.&lt;/strong&gt;&lt;br&gt;
If your signing provider supports HMAC-signed webhook verification, that adds an even stronger layer of protection.&lt;/p&gt;

&lt;p&gt;Either way, callback verification is not optional.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Process callbacks asynchronously
&lt;/h2&gt;

&lt;p&gt;Another important decision was to avoid doing all the heavy work directly inside the callback request.&lt;/p&gt;

&lt;p&gt;Instead, the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accepts the callback&lt;/li&gt;
&lt;li&gt;pushes it into a queue&lt;/li&gt;
&lt;li&gt;processes the event in the background&lt;/li&gt;
&lt;li&gt;updates signer state&lt;/li&gt;
&lt;li&gt;fetches final submission details&lt;/li&gt;
&lt;li&gt;downloads signed files&lt;/li&gt;
&lt;li&gt;stores the audit log&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern is much more reliable, especially when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documents are large&lt;/li&gt;
&lt;li&gt;multiple signers complete at the same time&lt;/li&gt;
&lt;li&gt;storage uploads take time&lt;/li&gt;
&lt;li&gt;external API calls are slow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;Queues turn webhook handling from fragile to production-ready.&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0v4jw4uhs8p93j0hlb0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0v4jw4uhs8p93j0hlb0.png" alt="Process callbacks flow" width="800" height="1116"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Download and store signed files yourself
&lt;/h2&gt;

&lt;p&gt;Once a submission is completed, the backend fetches the final DocuSeal submission and downloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the signed documents&lt;/li&gt;
&lt;li&gt;the audit log PDF&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then those files are uploaded into the application’s own storage layer and attached to internal records.&lt;/p&gt;

&lt;p&gt;This is a very important design principle:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;DocuSeal should power the signing workflow, but your application should own the final business record.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
That makes it easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;show signed files later&lt;/li&gt;
&lt;li&gt;attach documents to employee records&lt;/li&gt;
&lt;li&gt;support audits and compliance&lt;/li&gt;
&lt;li&gt;reduce long-term coupling to the provider&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Track signer state in your own database
&lt;/h2&gt;

&lt;p&gt;In addition to DocuSeal’s status, I also stored signer state in our own database:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pending&lt;/li&gt;
&lt;li&gt;signed&lt;/li&gt;
&lt;li&gt;declined&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That allowed the product to answer workflow questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which package is still waiting for signature?&lt;/li&gt;
&lt;li&gt;which signer has completed?&lt;/li&gt;
&lt;li&gt;should the signing button still be shown?&lt;/li&gt;
&lt;li&gt;is onboarding ready to move to the next step?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the key mindset:&lt;br&gt;
&lt;strong&gt;DocuSeal is the signing engine. Your database is the workflow engine.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical lessons
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Use external_id everywhere.&lt;/strong&gt; It is the cleanest way to connect DocuSeal events back to your own users.&lt;br&gt;
&lt;strong&gt;Prefill aggressively.&lt;/strong&gt; If your system already knows the data, don’t ask the user to type it again.&lt;br&gt;
&lt;strong&gt;Do not trust only the frontend completion event.&lt;/strong&gt; UI callbacks are for UX; backend callbacks are for correctness.&lt;br&gt;
&lt;strong&gt;Store final signed documents in your own system.&lt;/strong&gt; Do not make the provider your only source of truth.&lt;br&gt;
&lt;strong&gt;Separate template management from submission generation.&lt;/strong&gt; Templates are reusable assets; submissions are workflow instances.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A reusable implementation pattern
&lt;/h2&gt;

&lt;p&gt;If I had to summarise the best implementation pattern for any project, it would be this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use DocuSeal for template creation and embedded signing&lt;/li&gt;
&lt;li&gt;Keep all provider communication in the backend&lt;/li&gt;
&lt;li&gt;Store template metadata in your own DB&lt;/li&gt;
&lt;li&gt;Create submissions per workflow or transaction&lt;/li&gt;
&lt;li&gt;Prefill signer fields from your own user data&lt;/li&gt;
&lt;li&gt;Embed the signer inside your frontend&lt;/li&gt;
&lt;li&gt;Verify callbacks before processing them&lt;/li&gt;
&lt;li&gt;Use a queue for callback handling&lt;/li&gt;
&lt;li&gt;Download and store signed files yourself&lt;/li&gt;
&lt;li&gt;Track signer status in your own database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrkqe3a7d29u0vkoukza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrkqe3a7d29u0vkoukza.png" alt="reusable implementation pattern" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This pattern works well not only for HRMS, but also for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hiring platforms&lt;/li&gt;
&lt;li&gt;CRMs&lt;/li&gt;
&lt;li&gt;vendor onboarding systems&lt;/li&gt;
&lt;li&gt;finance workflows&lt;/li&gt;
&lt;li&gt;legal tools&lt;/li&gt;
&lt;li&gt;procurement platforms&lt;/li&gt;
&lt;li&gt;internal approval systems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Document signing often looks like a small feature at first, but in practice it touches templates, users, storage, security, callbacks, workflow state, and permissions.&lt;/p&gt;

&lt;p&gt;What worked especially well for me was treating DocuSeal as the signing layer, while keeping the actual product logic inside my own backend and frontend.&lt;/p&gt;

&lt;p&gt;That gave me the best of both worlds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a fast signing integration&lt;/li&gt;
&lt;li&gt;full control over the user experience&lt;/li&gt;
&lt;li&gt;reliable backend processing&lt;/li&gt;
&lt;li&gt;ownership of the final signed records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re planning to add document signing to your product, this architecture is a strong place to start.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
