Line items and the library
Every quote is built from line items. Each line item is a row with a name, optional description, quantity, unit price, and a kind (one-time, recurring monthly, recurring annual, or surcharge).
The 240-item starter library
Out of the box, your org ships with 240 line items across 24 industries — construction, IT services, legal, consulting, veterinary, accounting, design, marketing, and more. These are picked from common service-business catalogs and tuned to the unit each industry actually bills in.
Open the composer, click Add from library, and filter by industry or search by name. Drop a row in and edit it for the specific quote — the library item is a starting point, not a constraint.
The library is shared across all admins in your org. Edits to a library item update the template for everyone (future quotes only — already-sent quotes are frozen).
Saving your own library items
Anything you build in the composer can be saved to the library via the "Save to library" button on the row menu. Saved items appear alongside the defaults, scoped to your org.
Manage your library at /admin/contracts/templates — there's a tab for line-item templates separate from the full-quote templates.
Line item kinds
Each row has a kind field that controls how it's treated on the quote and afterward:
one_time (default)
A straightforward charge. Counted in the quote subtotal, deposit base, and the resulting invoice.
recurring_monthly
A monthly fee that continues after the project completes. Shown separately on the quote PDF as an ongoing commitment. Not counted in the quote subtotal or deposit base — those are upfront totals only. The actual recurring billing setup happens via Stripe invoices after acceptance.
recurring_annual
Same as monthly but for yearly. Used for things like domain renewals, hosting plans, annual support contracts.
surcharge
A pass-through cost (materials, fuel, third-party fees). Marked separately on the PDF so the client sees it's not part of your labor pricing.
Optional rows
Mark any row as optional to give the client an opt-in checkbox at accept time. Optional rows appear on the quote PDF with a checkbox, and the client picks which ones they want.
When the client accepts, only the rows they checked are included in the invoice. The deposit % is calculated against the final required + opted-in subtotal.
This is the right pattern for upsells — "Standard package $1,000, optional rush delivery +$200, optional white-glove install +$500."
The materials-markup rule
Click the materials-markup button on any row to apply your org's default markup (15%, configurable). The unit price recalculates to include the markup, and a note appears on the PDF explaining the line includes materials.
Use this when you're passing through a vendor cost (lumber, parts, third-party software licenses) and need to clearly show the client there's a markup over your at-cost.
Description vs name
- Name is the row's title — short, what shows up bold on the PDF.
- Description is sub-copy under the name — use this for scope details, materials specs, exclusions, etc. Supports basic line breaks.
For long scope descriptions, use the quote's Notes field instead (free-form markdown, appears above the line items table).
Per-row currency
Default is USD. To send a quote in another currency, change it on each line item's currency field. The quote and resulting invoices all use the line items' currency — mixing currencies on one quote isn't supported.
Quote totals and the subtotal split
The composer shows three running totals as you build:
- Required subtotal — sum of all non-optional one_time + surcharge rows. This is the "quote total" and the base for the deposit %.
- Optional total — sum of all optional rows if all opted in (informational).
- Recurring monthly / annual — sums of the recurring rows (informational).
The deposit % only applies to the required subtotal, not the recurring totals.
