Every sales team I've worked with has the same problem.
All the client data lives in HubSpot or Airtable.
But generating a proposal still means:
- Open Word
- Copy client name from CRM
- Copy deal value
- Fix formatting that broke
- Export PDF
- Attach back to the deal
20 minutes. Every. Single. Time.
The Architecture
Here's the pattern that actually works:
1. Data source → Variables
Connect HubSpot, Airtable, or Google Sheets as a data source.
Map CRM fields to template variables: {contact.name}, {deal.amount}, {company.website}
2. Template → Document
Build a template once in a visual editor.
Variables get replaced with real data on generation.
3. Trigger → Output
Three ways to trigger generation:
- Manual (UI button)
- Bulk (select 100 records → generate 100 docs)
- On-demand via REST API:
POST /api/generatewith record ID → PDF returned
What I Built
I ran into this problem building internal tools for agencies and ended up creating GJSDocs (gjsdocs.com) — a document generation engine with native connectors for HubSpot, Airtable, Google Sheets, and a REST API. Supports Claude, ChatGPT, and Gemini with your own API key.
The Trickiest Part
Variable mapping when CRM field names are inconsistent across teams.
Solution: normalize field names at the integration layer, not the template layer. Map once, reuse everywhere.
Happy to go deeper on any part — especially the webhook + bulk generation pattern. Drop a comment 👇
Top comments (0)