Monthly
Receive last month's profit and loss
On the 1st, income, expenses and net profit for the previous month land in your inbox.
- Runs
- Monthly
- Apps
- QuickBooks
- AI
- Not needed
- Access
- accounting (read)
Send this to your assistant
Create a ClickRuntime automation: on the 1st of each month, email me last month's QuickBooks profit and loss with total income, total expenses and net profit.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Owners of small businesses are told to review their profit and loss every month, and most mean to. The report sits behind several clicks in QuickBooks, needs the right date range and accounting method, and gets postponed until the accountant asks. Problems like a margin that slipped three months ago are only discovered at year end.
On the first of each month, ClickRuntime calls the QuickBooks ProfitAndLoss report for the month that just ended, formats income, cost of goods sold, expenses and net income into a readable email, and sends it to you. The same layout arrives every month, so changes are easy to spot.
It suits owner-operators and partners who want a financial pulse without logging in or waiting for a bookkeeper's package, and who want to catch problems while there is still time to correct them.
What you get out of it
The month-end review actually happens
A report that lands in your inbox on the first gets read. A report that requires you to log in and configure it often does not, and silence from the books is how problems grow.
Margin shifts are caught within weeks
Comparing this month's email with last month's shows if cost of goods sold or an expense category jumped. Responding in the next month is much cheaper than finding it in a year-end review.
Conversations with your accountant improve
Because you have read the numbers before they ask, you can raise questions about odd categories and unexpected costs. That makes accountant time more productive and billable hours more focused.
Decisions use current data
Hiring, pricing and ad budgets are better set from last month's actual profit than from a gut feeling. Having the numbers every month removes the delay between a decision and its evidence.
A running record accumulates
Each email is a dated copy of the P and L as it stood at the start of the month. Keeping them lets you see later how figures changed after adjustments, which helps in lender or investor conversations.
How it works
What happens, step by step
On the 1st of each month, ClickRuntime pulls last month's profit and loss report from QuickBooks.
It picks out total income, total expenses and net profit.
You get an email with those three figures.
Before it runs live
- Connect QuickBooks
What you get
Build your own
Need it to work differently?
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
- Run it at a different time, more or less often, or only on weekdays
- 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
from datetime import date, timedelta
from clickruntime import on_trigger, 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_trigger
def run(event):
end = date.today().replace(day=1) - timedelta(days=1)
report = qb("GET", "/reports/ProfitAndLoss",
params={"start_date": end.replace(day=1).isoformat(), "end_date": end.isoformat()})
totals = {}
for row in report["Rows"]["Row"]:
if row.get("group") in ("Income", "Expenses", "NetIncome"):
totals[row["group"]] = float(row["Summary"]["ColData"][1]["value"] or 0)
notify.email_me(f"P&L {end:%B %Y}: net ${totals.get('NetIncome', 0):,.2f}",
f"Total income: ${totals.get('Income', 0):,.2f}\n"
f"Total expenses: ${totals.get('Expenses', 0):,.2f}\n"
f"Net profit: ${totals.get('NetIncome', 0):,.2f}")
return totalsFAQ
Common questions
Which accounting method does the report use?
Can I receive the report broken down by class or location?
How does it handle months that have not been closed by my accountant?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Hear when daily sales look unusual
You get an email on mornings when yesterday's sales were far above or below normal.
See how it worksGet last month's ledger as CSV
On the 1st, the general ledger and invoice list for the previous month arrive in your inbox ready for your accountant.
See how it worksCatch overdue invoices nobody emailed
A daily list of overdue invoices that were never sent to the customer, so they don't sit forgotten.
See how it worksKeep exploring
Set up “Receive last month's profit and loss” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.