Skip to main content
Veles generates branded proposals, order forms, and contracts directly from quote data. You build templates in Microsoft Word (DOCX) or Google Docs/Slides, insert merge fields that reference quote variables, and Veles renders the final document with live deal data at generation time. Templates are managed by admins and available to reps when generating documents from a quote. The output reflects your brand identity (logo, colors) and can include pricing tables, terms, CRM data, and any content from the quote’s blocks.

Supported formats


Template syntax

Inserting merge fields

  1. Place your cursor where you want the dynamic value.
  2. Press Ctrl+F9 (Windows) or Cmd+F9 (Mac) to create field brackets { }.
  3. Type the MERGEFIELD syntax between the brackets.
  4. Press Cmd+Shift+Option+U to save the merge field.
  5. Use Alt+F9 (Windows) or Option+F9 (Mac) to toggle between field codes and rendered values.
Alternative: Insert → Quick Parts → Field → choose “MergeField” from the list.

Syntax reference


Template variables reference

Every variable below is available in all template formats. Use dot notation to access nested values (e.g., owner.name, line.formatted.price).

Top-level fields

Owner (sales rep)

Access via owner.*.

Title block

Access via title_block.* or when iterating blocks with is_title.

Blocks

The blocks array contains all blocks in the quote, in display order. Since blocks are polymorphic (they can be different types), use the type flags to conditionally render content. Each block also has terms_html (for Terms/Text blocks) and name (for Title/Option blocks).

Options

Access via the options array, primary_option, or when iterating blocks with is_option. Each option contains:

Calculations (periods)

Each option contains a calculations array with one entry per billing period (year, quarter, month). Access via option.calculations.

Formatted totals

Access via calc.formatted.*.

One-time vs. recurring breakout

Access via calc.breakout.*. Both raw numbers and formatted strings are available.

Line items

Access via calc.lines, calc.one_time_lines, or calc.recurring_lines. Each line represents a single product on the quote.

Formatted line values

Access via line.formatted.*. These are pre-formatted for display.

Unit of Measure

Access via line.uom.* (nullable — may not be present on all lines).

Salesforce data

Available when the quote is linked to Salesforce. Always wrap in a conditional since this is null when Salesforce is not connected.

Addresses

Access via salesforce.billing_address.* or salesforce.shipping_address.* (both nullable).

Template examples

Cover page (DOCX)

Iterating through all blocks (DOCX)

Use the type flags to render each block type differently:

Pricing options with year-by-year breakdown (DOCX)

Line items table (DOCX)

Separate one-time and recurring tables (DOCX)

Salesforce customer info with conditional (DOCX)

Full proposal (Google Docs)


Dynamic hash fields

Several variables use dynamic keys (marked as “Hash” in the reference). These include custom_fields, custom_columns, summary, uom_fields, and product_custom_fields. Access dynamic fields with dot notation using the field key:
The available keys depend on what custom fields you’ve configured in the Object Explorer, Display Options, and CRM field mapping.

Tips

Use formatted values for display. Most numeric fields have both a raw value (e.g., line.unit_price = 100.0) and a formatted version (e.g., line.formatted.unit_price = "$100.00"). Use the formatted versions in templates to get proper currency formatting without manual work. Always wrap Salesforce data in conditionals. The salesforce object is null when no CRM is connected. Referencing salesforce.account_name without a conditional will produce an error in the generated document. Use one_time_lines and recurring_lines for split tables. Instead of looping through all lines and checking the one_time flag on each, use the pre-filtered arrays for cleaner templates. Test with a real quote. Generate a document from an actual quote to verify all merge fields resolve correctly. Nullable fields, empty arrays, and missing custom fields are the most common causes of template errors.

What’s next

Account Setup

Configure the logo and brand color that appear in generated documents.

Quote Overview

Understand the quote structure that document generation renders from.

Display Options

Control what pricing detail appears in generated documents.

Web Portal

Share interactive proposals alongside generated documents.