The Data-First Principle
Most agreement platforms start with a document. You upload a PDF, drag fields onto it, and write backend code to fill in values from your application. SignStack starts with your data.
Your application already has structured business objects — employees, deals, clients, invoices. SignStack treats these as the source of truth. Documents are just one possible rendering of that data.
The Traditional Approach
Here's what document-first looks like:
- Upload a PDF of your offer letter
- Manually place 20+ fields at pixel coordinates (name at x:150 y:280, salary at x:150 y:340...)
- Write backend code that maps your
employeeobject to those field positions - Hope the mapping doesn't break when someone updates the PDF layout
- Repeat for every new document type
The document is the center of gravity. Your data is secondary — something you shoehorn into a pre-existing layout.
The SignStack Approach
Data-first flips this entirely:
- Define your data — a JSON Schema for
employee,company,position - Keep your existing PDF — the same one you'd upload to a traditional tool
- Create a Template primitive — declare inputs, then attach a
valueexpression to each PDF field that pulls from entity data - Data flows in, documents flow out — change the schema, the document adapts
# The Template connects data to PDF fields
spec:
type: pdf
content: offer_letter_pdf@1.0.0
inputs:
- key: employee
schema: employee@1.0.0
- key: position
schema: position@1.0.0
fields:
- key: employee_name
type: text_field
value:
expr: "$.employee.firstName & ' ' & $.employee.lastName"
- key: salary
type: text_field
value:
expr: "'