Documentation

Proposal Templates

Build reusable proposal documents visually — stack blocks, pick a theme, and drop in variables that automatically populate project data, equipment lists, and cost summaries.

Overview

The visual proposal builder lets you assemble professional proposal documents from blocks:

  • Cover page, executive summary, and rich text sections
  • Equipment blocks for individual rooms or all rooms combined (cards or table layout)
  • Investment summary with customizable splits and tax lines
  • Images and side-by-side column layouts
  • Terms & acceptance with optional signature, print name and title lines

Getting Started

  1. Go to Settings > Proposal Templates
  2. Click New for a blank template, or New from gallery to start from a themed design
  3. In the builder, click blocks in the Add Block palette to stack them, and drag to reorder
  4. Select a block to configure it; long text (Rich Text, Terms, Executive Summary fallback) opens in the wide content workspace below the block stack
  5. Insert variables from the searchable browser next to the editor — the live preview fills them with sample data
  6. Design the cover page (hero image, headline, logos) back on the Proposal Templates page
  7. Save, then choose the template when generating a proposal from a project
Templates made with the old HTML editor

They keep generating proposals exactly as before — they just can't be edited anymore. Rebuild them in the block builder when you need to make changes.

Variable Reference

Variables are placeholders that get replaced with actual project data. Insert them from the variable browser in the content workspace, or type them directly using the {'{'}variable.name{'}'} syntax inside Rich Text, Terms, and Executive Summary blocks.

Project Variables

VariableDescriptionExample Output
{'{'}project.name{'}'}Project nameCorporate HQ AV System
{'{'}project.jobNumber{'}'}Job/reference number2026-0108
{'{'}project.status{'}'}Current statusIn Progress
{'{'}project.total{'}'}Project total cost$125,450.00
{'{'}project.equipmentTotal{'}'}Equipment total$98,500.00
{'{'}project.laborTotal{'}'}Labor total$26,950.00

Client Variables

VariableDescription
{'{'}client.company{'}'}Bill-to company name
{'{'}client.contact{'}'}Bill-to contact name
{'{'}client.address{'}'}Full bill-to address
{'{'}client.email{'}'}Bill-to email
{'{'}client.phone{'}'}Bill-to phone

Date Variables

VariableDescriptionExample Output
{'{'}date.today{'}'}Current dateFebruary 4, 2026
{'{'}date.proposal{'}'}Proposal dateFebruary 4, 2026
{'{'}date.year{'}'}Current year2026

Equipment Tables

Equipment tables display product information for rooms. You can use default columns or specify custom columns.

All Equipment (All Rooms)

VariableDescription
{'{'}all.equipment{'}'}Equipment table for all rooms with default columns (Room, Item, Qty, Price)
{'{'}all.equipment:columns{'}'}Custom columns. Example: {'{'}all.equipment:Description,Qty,Extended{'}'}
{'{'}all.equipment.addalt{'}'}Equipment table for Add Alt rooms only
{'{'}all.equipment.addalt:columns{'}'}Add Alt equipment with custom columns

Available Equipment Columns

  • Description - Product description
  • Make - Manufacturer name
  • Model - Product model number
  • Notes - Line item notes
  • Qty - Quantity
  • Rate - Unit sell price
  • Extended - Extended price (Qty x Rate)

Combined Cost Tables

Combined cost tables provide a room-by-room financial summary, showing equipment costs, non-equipment costs, taxes, and totals.

New Feature

Combined cost tables give you a professional cost summary similar to what you'd find on a formal proposal or invoice.

Combined Cost Variables

VariableDescription
{'{'}project.combinedCost{'}'}Default combined cost table for all rooms (shows #, Room, Qty, Sys. Cost, Total w/Tax)
{'{'}project.combinedCost:columns{'}'}Custom columns version
{'{'}project.addAlt.combinedCost{'}'}Combined cost table for Add Alt rooms only
{'{'}project.addAlt.combinedCost:columns{'}'}Add Alt combined cost with custom columns

Available Combined Cost Columns

Column NameHeaderDescription
Item#Row number
RoomNameRoomRoom name
EquipmentSellEaEquip. SellEquipment sell price per room
NonEquipmentSellEaNon-Equip.Non-equipment sell (labor, etc.) per room
TaxesTaxTaxes per room
TaxesExtTax Ext.Taxes extended (Tax x Qty)
CostPerRoomCost/RoomTotal cost per room (before tax)
QtyQtyRoom quantity
SystemCostSys. CostSystem cost (Cost/Room x Qty)
SystemCostWithTaxTotal w/TaxSystem cost with tax (includes tax x Qty)

Example Usage

<h3>Cost Summary</h3>
<div style="font-size: 14px;">
{'{'}project.combinedCost:RoomName,Qty,SystemCost,SystemCostWithTax{'}'}
</div>

Add Alt Total Variables

Display totals for Add Alt (optional/alternative) rooms as simple values (not tables). These follow the same naming convention as the project totals:

VariableDescription
{'{'}project.addAlt.total{'}'}Total of all Add Alt rooms (before tax)
{'{'}project.addAlt.tax{'}'}Total tax for all Add Alt rooms
{'{'}project.addAlt.totalWithTax{'}'}Total of all Add Alt rooms including tax
{'{'}project.addAlt.equipmentTotal{'}'}Total equipment sell for all Add Alt rooms
{'{'}project.addAlt.laborTotal{'}'}Total non-equipment (labor, services) for all Add Alt rooms

Example Usage

<h3>Optional Items</h3>
{'{'}project.addAlt.combinedCost:RoomName,Qty,SystemCostWithTax{'}'}
<p><strong>Add Alt Total:</strong> {'{'}project.addAlt.totalWithTax{'}'}</p>

Text Wrapping Control

Control how text wraps in table columns by adding :wrap or :nowrap after any column name.

Syntax

ModifierDescriptionExample
:wrapForce text to wrap onto multiple linesRoomName:wrap
:nowrapPrevent text from wrapping (single line)Description:nowrap

Smart Defaults

Most columns have sensible defaults, so you only need to add modifiers when overriding:

Default BehaviorColumns
Wrap (text columns)Description, Notes, RoomName
No wrap (short/numeric)Make, Model, Qty, Rate, Extended, all cost columns

Examples

<!-- Equipment table with Description that doesn't wrap -->
{'{'}room.equipment:Description:nowrap,Make,Model,Qty{'}'}

<!-- Cost table with RoomName that wraps -->
{'{'}project.combinedCost:RoomName:wrap,Qty,SystemCost,SystemCostWithTax{'}'}

Room Loops

Use loops to repeat content for each room in the project.

Regular Room Loop

{'{'}#foreach room{'}'}
<h3>{'{'}room.name{'}'}</h3>
<p>Quantity: {'{'}room.quantity{'}'}</p>
<p>Room Total: {'{'}room.total{'}'}</p>
{'{'}room.equipment{'}'}
{'{'}room.summary{'}'}
{'{'}'/'}foreach{'}'}

Add Alt Room Loop

Use {'{'}#foreach addalt{'}'} to loop through Add Alt (optional/alternative) rooms only:

{'{'}#foreach addalt{'}'}
<h3>Optional: {'{'}room.name{'}'}</h3>
{'{'}room.equipment:Description,Qty,Extended{'}'}
{'{'}'/'}foreach{'}'}

Room Loop Variables

VariableDescription
{'{'}room.name{'}'}Current room name
{'{'}room.index{'}'}1-based room index
{'{'}room.quantity{'}'}Room quantity
{'{'}room.total{'}'}Room total cost
{'{'}room.equipment{'}'}Equipment table with default columns
{'{'}room.equipment:columns{'}'}Equipment table with custom columns
{'{'}room.summary{'}'}Room executive summary (if uploaded)

Best Practices

Important Tips for Template Authors
  • Use <div> not <span> when wrapping table variables. Tables are block elements and cannot be inside inline elements like spans.
  • Don't place tables inside heading tags (h1-h6). Put the heading first, then the table variable on the next line.
  • Use the variable browser to insert variables - they're inserted as protected chips that survive editor formatting.
  • Use Code View (the </> button) in a Rich Text block to inspect HTML structure if tables aren't rendering correctly.

Correct Table Wrapper

<!-- CORRECT: Use div for table variables -->
<div style="font-size: 14px;">
{'{'}project.combinedCost:RoomName,Qty,SystemCost,SystemCostWithTax{'}'}
</div>

<!-- WRONG: Don't use span -->
<span style="font-size: 14px;">{'{'}project.combinedCost{'}'}</span>

Correct Heading Usage

<!-- CORRECT: Heading separate from table -->
<h3>Equipment List</h3>
{'{'}room.equipment{'}'}

<!-- WRONG: Table inside heading -->
<h3>{'{'}room.equipment{'}'}</h3>

Other Variables

Room Lists

VariableDescription
{'{'}all.rooms{'}'}Comma-separated list of all room names
{'{'}all.addalts{'}'}Comma-separated list of Add Alt room names
{'{'}all.summary{'}'}Full executive summary (all rooms)

Specific Room Access

Access a specific room by name (remove spaces from room name):

VariableDescription
{'{'}room.ConferenceRoomA.equipment{'}'}Equipment table for a specific room
{'{'}room.ConferenceRoomA.total{'}'}Total for a specific room
{'{'}room.ConferenceRoomA.summary{'}'}Summary for a specific room
Tips
  • The builder's live preview shows the whole proposal with sample data and updates as you edit
  • Variables that don't match any data (like {{project.addAlt.combinedCost}} when there are no Add Alt rooms) render as empty, not as literal text
  • Create multiple templates for different proposal styles (detailed, summary, etc.)