Skip to content

The moment it happens

Turn quote requests into QuickBooks estimates

Every quote request or recorded sale becomes an estimate or sales receipt, and you get its number by email.

Runs
The moment it happens
Apps
QuickBooks
AI
Not needed
Access
read+write

Send this to your assistant

Create a ClickRuntime automation: when a quote request is posted to this link, create the customer in QuickBooks if they're new, create an estimate with the requested services, and email me the estimate number.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

A quote request form, a sheet where the sales team logs deals, or a point-of-sale export produces rows that finance later has to turn into QuickBooks records. A customer asks for a quote on Monday and gets it Thursday, or a cash sale from the weekend is never entered, leaving gaps between what was sold and what the books show.

Whenever a row is submitted, ClickRuntime finds the customer in QuickBooks or creates a new one, then creates either an estimate for quote requests or a sales receipt for sales that were paid on the spot, depending on the type in the row. It then emails you the result with the document number.

Businesses that mix quoting and over-the-counter sales, like installers, caterers and market sellers, get both flows from one setup.

What you get out of it

  • Quotes reach customers while they are shopping

    A prompt estimate is more likely to win the job than one that arrives after the customer has asked someone else. Speed here translates directly into more accepted quotes. The first quote in often wins the job.

  • Paid sales are recorded the same day

    Sales receipts created straight from the submission mean cash and card sales appear in QuickBooks without a catch-up session. That keeps daily takings and the ledger in agreement. Month-end reconciliation against the till gets shorter.

  • One intake for two document types

    The type in the row decides whether an estimate or a receipt is created. Staff use a single form for everything, and nobody needs to remember which QuickBooks screen applies to which situation.

  • Estimates convert smoothly to invoices

    Because estimates are created in QuickBooks proper, accepting one lets you convert it to an invoice with the same lines. The quote and the eventual bill match, which prevents pricing disputes.

  • Customer records stay tidy

    Existing customers are reused and only new ones are created, so repeat buyers build up a history. Looking back at what a client has bought or been quoted becomes a single lookup.

How it works

What happens, step by step

  1. When a quote request or a sale arrives from your form or spreadsheet, ClickRuntime picks it up.

  2. It finds the customer in QuickBooks, or adds them if they are new.

  3. It creates an estimate, or a sales receipt for a completed sale, with the requested items.

  4. You get an email with the document number, the customer, the total and the items.

Before it runs live

  • Connect QuickBooks
  • Paste your automation's link into the other app's webhook settings

What you get

RunsThe moment it happens
Turn quote requests into QuickBooks estimatesjust nowSucceeded
Email · New estimateEstimate 1012 for Acme Corp: $3,200.00 - Logo design - Brand guidelines

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • Your own rules

    Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.

  • Any number of apps

    One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.

  • AI where it helps

    Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.

  • On a schedule or on each event

    Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.

Changes you can ask for

  • Act only on the items that match your own rules, and skip the rest
  • Add an AI step, for example to summarize, sort or draft a reply
  • Add another app, for example also send it to Slack
  • Combine it with other QuickBooks steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
create_estimates_or_sales_receipts_from_submitted_rows.pyexample
from clickruntime import on_event, credentials, http, notify

REALM_ID = "1234567890"
API = f"https://quickbooks.api.intuit.com/v3/company/{REALM_ID}"

def qb(method, path, **kw):
    headers = {"Authorization": f"Bearer {credentials.connection('quickbooks', 'company')}", "Accept": "application/json"}
    resp = http.request(method, f"{API}{path}", headers=headers, params={"minorversion": 73, **kw.pop("params", {})}, **kw)
    resp.raise_for_status()
    return resp.json()

def query(sql):
    return qb("GET", "/query", params={"query": sql})["QueryResponse"]

@on_event
def handle(event):
    data = event.json
    email = data["email"].replace("'", "\\'")
    found = query(f"select * from Customer where PrimaryEmailAddr = '{email}'").get("Customer")
    customer = found[0] if found else qb("POST", "/customer", json={
        "DisplayName": data.get("company") or data["name"], "PrimaryEmailAddr": {"Address": data["email"]}})["Customer"]
    lines = [{"Amount": float(s["price"]) * s.get("quantity", 1), "DetailType": "SalesItemLineDetail",
              "Description": s["name"],
              "SalesItemLineDetail": {"ItemRef": {"value": "1"}, "Qty": s.get("quantity", 1), "UnitPrice": float(s["price"])}}
             for s in data["services"]]
    estimate = qb("POST", "/estimate", json={"CustomerRef": {"value": customer["Id"]}, "Line": lines})["Estimate"]
    notify.email_me(f"Estimate {estimate['DocNumber']} for {customer['DisplayName']}",
                    f"Estimate {estimate['DocNumber']}: ${estimate['TotalAmt']:,.2f}\n"
                    + "\n".join(f"- {s['name']}" for s in data["services"]))
    return {"estimate": estimate["DocNumber"]}

FAQ

Common questions

How does it decide between an estimate and a sales receipt?
Each submitted row carries a field that says which one applies, such as type equals quote or type equals sale. That field is read when the row arrives. Rows without a clear type can be sent to you by email for review instead.
Can an estimate expire automatically?
QuickBooks lets you set an expiration date on an estimate. The date can be filled from the row or calculated, for example thirty days after creation. QuickBooks itself marks it as expired but does not cancel or delete anything.
Will the customer receive the estimate by email?
The default result is an email to you with the document number. Sending the estimate to the customer through QuickBooks can be added as a step if you want quotes to go out without you forwarding them.
What permissions does it need?
read+write. Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run for each event the app sends.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Turn quote requests into QuickBooks estimates” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.