Fills a DOCX template with properties from a HubSpot CRM record and returns a finished document.
BulkRender turns a HubSpot record into a finished document. You build a Word template once and tell BulkRender which HubSpot property fills each placeholder. From then on, every document comes out populated with the right names, dates, and figures, in your layout, ready to send.
There are two ways to generate, and both are live today. You can generate inside HubSpot, where a workflow action creates the document automatically as a step in a workflow, so a closed deal or a new ticket produces its paperwork without anyone opening BulkRender. Or you can generate inside the BulkRender app, where the Generate screen lets you search your CRM, pick the records you want, and produce documents on the spot.
Either way, the setup is the same and you do it once: connect your portal, then map your template's placeholders to HubSpot properties. One BulkRender organization connects to one HubSpot portal.
HubSpot returns you to BulkRender with the connection listed. BulkRender stores the tokens encrypted and refreshes them automatically.
To disconnect, select Disconnect on the same screen. Disconnecting stops all HubSpot generation, including workflow actions.
| Scope | Why |
|---|---|
crm.objects.contacts.read | Read contact records and properties |
crm.objects.companies.read | Read company records and properties |
crm.objects.deals.read | Read deal records and properties |
tickets | Read ticket records and properties |
crm.schemas.contacts.read | Read property definitions so field mapping can list them |
crm.schemas.custom.read | Read custom object definitions so they appear in the object list |
crm.objects.owners.read | Turn owner IDs into owner names |
Grant these only if you need the feature.
| Scope | Unlocks |
|---|---|
crm.objects.custom.read | Reading records on custom objects. Requires a HubSpot Enterprise portal |
crm.objects.contacts.write, crm.objects.companies.write, crm.objects.deals.write | Writeback of the document link to the record |
automation | The BulkRender workflow action |
BulkRender never requests marketing, CMS, or email scopes.
Custom objects work the same way as standard objects. BulkRender reads your portal's schemas and lists them alongside contacts, companies, deals, and tickets in both the object picker and the field mapping editor.
Two conditions apply:
crm.objects.custom.read scope. Without it the schemas still list, but record reads fail.Field mapping tells BulkRender which HubSpot property fills which template variable.
Auto match. BulkRender suggests a property for each variable by comparing names. Check every suggestion before saving.
What maps. BulkRender maps flat, single-value properties: single line text, multi line text, number, boolean, date, dropdown, and owner. Associations, line items, and property history do not map.
What BulkRender tidies for you. When you generate from the app, a few fields are made human-readable automatically. A date becomes a long date, so 2024-03-04 reads as March 4, 2024. An owner becomes a name, so hubspot_owner_id = 12345678 reads as Jane Smith. A dropdown shows its label rather than its internal value. Owner names need the crm.objects.owners.read scope. Note that the HubSpot workflow action inserts these three fields exactly as stored, so if your documents come from a workflow, pre format them in HubSpot.
What stays as stored. Numbers and currency are never reformatted, and totals are never calculated. Store money and any computed value the way you want it to read, for example $1,240.00 rather than 1240, then map that property.
This is the live path. You build it in HubSpot, and it runs in HubSpot. Nobody opens BulkRender to generate a document.
Behaviour to know:
Common failure reasons: no field mapping saved for that object type, the record is missing a mapped property, credits exhausted, or the connection needs reauthorising.
Open BulkRender, go to Generate, and choose the HubSpot tab.
It uses the same field mapping as the workflow action, so a template set up once works in both places. If writeback is configured, the document link is written back to each record.
Prefer to stay inside HubSpot? Use the workflow action instead.
Writeback puts a link to the finished document into a HubSpot property on the record.
Two limits to plan around:
| Symptom | Cause | Fix |
|---|---|---|
| Object type missing from the list | Scope for that object was not granted | Reconnect and approve the scope |
| Custom objects missing | Portal is not Enterprise, or crm.objects.custom.read was not granted | Check the plan, then reconnect and grant the scope |
| Owner shows as a number | crm.objects.owners.read not granted | Reconnect and approve the scope |
| Workflow action greyed out | automation scope not granted | Reconnect and approve the scope |
| Writeback property stays empty | Write scope missing, or no writeback property set | Grant the write scope and set the property |
| Writeback link 404s | Document passed its retention window | Regenerate, or raise the retention window in Settings |
| Placeholder left unfilled | Property empty on the record, or mapping missing | Fill the property or fix the mapping |
| Every request fails after a while | Connection needs reauthorising | Disconnect, then reconnect |
Create an account, upload your first template, and generate your first document in under five minutes.