Guides · HubSpot

BulkRender for HubSpot.

Fills a DOCX template with properties from a HubSpot CRM record and returns a finished document.

Overview

Where generation runs

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.

Setup

Connect your portal

  1. Open Settings, then Integrations.
  2. Select Connect HubSpot.
  3. Sign in to HubSpot and pick the portal to connect.
  4. Review the requested scopes and approve.

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.

Permissions

Scopes we request

Required

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

Optional

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.

Objects

Custom objects

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:

  • Your portal must be on HubSpot Enterprise, which is where custom objects live.
  • You must grant the optional crm.objects.custom.read scope. Without it the schemas still list, but record reads fail.
Mapping

Field mapping

Field mapping tells BulkRender which HubSpot property fills which template variable.

  1. Open the template, then Field mapping.
  2. Pick the HubSpot object type. Custom objects appear in the same list.
  3. Match each template variable to a HubSpot property.
  4. Save.

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.

Available

Generate inside HubSpot: the workflow action

This is the live path. You build it in HubSpot, and it runs in HubSpot. Nobody opens BulkRender to generate a document.

  1. In HubSpot, open or create a workflow on a mapped object type.
  2. Add an action, then pick BulkRender, then Generate document.
  3. Choose the template and the output format.
  4. Turn the workflow on.

Behaviour to know:

  • Enrolment is blocking. The action waits for the document before the record moves to the next step.
  • Repeat protection. BulkRender skips a record that the same template already generated for in the last 7 days.
  • Failures continue. If generation fails, the record continues down the workflow rather than stalling. The reason is recorded on the action.
  • Credits. A failed generation refunds its credits.

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.

In the app

Search records and generate from the BulkRender app

Open BulkRender, go to Generate, and choose the HubSpot tab.

  1. Pick an object: contacts, companies, deals, or a custom object.
  2. Search your CRM records by name or keyword, and select the ones you want. Up to 100 per run.
  3. Choose a template and an output format, then generate.

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

Put the document link on the record

Writeback puts a link to the finished document into a HubSpot property on the record.

  1. In Field mapping, set Writeback property to a single line text property on the object.
  2. Grant the matching write scope for that object.

Two limits to plan around:

  • The link is a public URL. Anyone holding it can download the document until it expires.
  • The document is retained for your organization's retention window, 3 days by default. You can raise this in Settings up to your plan's limit (Pro 30 days, Business 60, Enterprise 90). Past the window the link stops working and the property holds a dead URL.
Limits

What the integration does not do

  • One HubSpot portal per BulkRender organization.
  • Output formats: DOCX and PDF. XLSX is not generated.
  • No charts and no computed values. The engine fills placeholders, it does not calculate.
  • Number and currency values are inserted as stored, not formatted. Pre format them in HubSpot.
  • Generating from the app formats dates to a long date and resolves owner and dropdown fields to their labels. The HubSpot workflow action inserts those fields as stored.
  • Documents are stored in encrypted object storage on Railway and retained for 3 days.
  • API requests are rate limited.
Troubleshooting

Common problems

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

Ready to start?

Create an account, upload your first template, and generate your first document in under five minutes.