Quotes generated from a Google Docs template

Gsheet CRM generates quotes from Google Docs: you design one quote template as a Google Doc in your own Drive, and every quote is a filled copy of that Doc, numbered by your own rule and exported to PDF, with its lines recorded in your Google Sheet.

The template is a Google Doc you own

When you create a template, the app makes a Google Doc in your Drive and fills it with a finished quote: a company line, a title, a bill-to block, an item table, a total and a terms line. It is a document somebody could send today, and you change only the parts you care about — the fonts, the colours, the wording, the layout of the header. Put your logo in the Doc the way you would in any Google Doc; there is no separate logo uploader, because the Doc is the design.

The parts that change per quote are placeholders: a token in double braces such as {{lead.name}}, {{quote.number}}, {{company.taxNumber}} or {{totals.grand}}. Every column in your sheet is available as one — a “Site address” column becomes {{lead.site_address}} with no work from you — and so are the columns of a linked lookup table, your named terms blocks ({{terms.standard}}), and the grand total written out in words. Placeholders work in the header and footer, which is where a quote keeps its company block. The template screen lists which placeholders it found in your Doc and names any it does not recognise, and it re-reads the Doc whenever Drive reports you edited it.

Because you are free to write a token that has no value for a given lead, a blank cell renders as nothing rather than leaving {{lead.email}} printed on a quote you already sent. For whole sections that should appear only sometimes — a discount line, a notes paragraph — wrap them in {{?discount}} … {{/discount}} and the block is removed when there is nothing to say.

How the line-item table works

Google Docs has no loop syntax, so the item table is handled the honest way: one row of your table holds the item tokens — {{item.index}}, {{item.name}}, {{item.qty}}, {{item.rate}}, {{item.amount}}, plus description, discount and tax if you want them — and when a quote is generated that row is duplicated once per line, inheriting its borders and shading. A cell that says {{item.qty}} pcs says “3 pcs” on every row. You style one row; the app fills as many as the quote needs, up to a hundred lines.

The arithmetic is a settings decision, not a guess: per-line or quote-level discounts as a percentage or an amount; tax-inclusive or tax-exclusive pricing; a list of named tax rates so “zero-rated”, “exempt” and “5% VAT” print as what they are rather than all being 0; rounding per line or on the total; and the currency’s own decimal places, so an amount in dirhams and one in yen both look right. The whole ladder — subtotal, discount, taxable, tax, grand — is shown on the composer so a customer checking the numbers can see where they come from.

What a generated quote is

Generating a quote copies your template Doc, reads the copy it just made (never a cached idea of the template — you may have edited it five minutes ago), fills every placeholder and the item rows in one batch, exports the result as a PDF, and only then writes two rows into your spreadsheet: one in a Quotes tab (number, version, date, valid-until, currency, totals, status, links to the Doc and PDF) and one per line in a Quote items tab you can sort, filter and sum like any other. The PDF is filed in a “Quotes” folder in your Drive named after your sheet, and the filled Doc is saved in your Drive as well, named after the quote number and the customer. If anything fails before the PDF exists, the half-made Doc is deleted and no row is written — a quote with a number and no document is worse than an error.

The number follows your own rule. The default format is QT-{YYYY}-{0000}; the tokens are {YYYY}, {YY}, {MM} and a run of zeros for the padded sequence, so INV-{YY}{MM}-{000} is as valid as the default. The sequence is claimed atomically, so two people generating at once get different numbers. One limit, stated: the number is claimed before the document is built, so a generation that fails leaves a gap in the sequence. Quotes here are commercial documents, not statutory ones, and nothing should rely on the counter being gapless.

A quote has a status — draft, sent, accepted, rejected, expired — kept in the sheet, and a daily sweep marks a quote expired the day after its valid-until date on your workspace’s own calendar, not the server’s. A new version of a quote reruns generation from the original’s lines, so a revised price is not a retype. Inside Libromi Team Inbox, the PDF can be staged into the reply box with Send in chat; the WhatsApp page explains that surface.

Who it suits, and the plan it is on

It suits a business whose quotes are a document with a table on it — maintenance contracts, fit-outs, tour packages, course fees, equipment orders — and who would rather keep the look they already have than adopt a generator’s. Quoting is part of the larger plan, which allows three active templates; the entry plan does not include it. If a workspace later moves down a plan, every quote, Doc and PDF it already made keeps working — only creating new ones stops. Everything else the CRM does is on the CRM for Google Sheets page, and the plan figures for your region are on the home page.

Questions about quoting from Google Docs

Can I use my existing quote document as the template?

Not directly. The app can only open Docs it created, because its Drive permission is limited to app-created files — which is also what keeps it out of the rest of your Drive. Create a template from the app, then paste your existing design into it and mark the changing parts with placeholders; the starter shows the syntax already at work.

Does the app store my quotes?

No. The Doc and PDF are in your Drive, the lines and totals are in your sheet’s Quotes and Quote items tabs, and our database keeps the template list, your money settings and the number counter — configuration only, the same rule as the rest of the product.

What if my valid-until date passes?

A once-a-day sweep marks the quote expired in the sheet once its valid-until date has passed on your workspace’s own calendar — never on the day itself — and if you use webhooks a quote.expired event fires. Because valid-until is a date column, you can also put a date reminder on it and be emailed three days before a quote lapses.

How many templates can I have?

Three active templates on the plan that includes quoting. Archiving a template does not count against that: old quotes keep naming the template that made them, and the slot is freed for a new design.

Quote from the document you already like

Start a free trial, connect your sheet, and build your first template in Google Docs when you are ready to upgrade.

Start your free trial