Daily
Post yesterday's Lemon Squeezy sales each morning
A morning Slack post with yesterday's order count, revenue and best-selling product.
- Runs
- Daily
- Apps
- Lemon Squeezy
- AI
- Not needed
- Access
- API key
Send this to your assistant
Create a ClickRuntime automation: every day at 8am, post to #sales in Slack how many Lemon Squeezy orders I had yesterday, the total revenue, and which product sold the most.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A solo founder selling software or templates through Lemon Squeezy gets plenty of emails and almost no clear picture of yesterday's sales. The Lemon Squeezy dashboard has the numbers, but checking it is one more tab to open, and after a busy week of launching or support, the question of whether a campaign actually produced sales goes unanswered until the monthly payout.
Each morning, ClickRuntime lists your Lemon Squeezy orders, newest first, until it reaches ones older than yesterday. It adds up the totals, groups them by product and posts a short summary to Slack with the order count, revenue and a breakdown per product, so you know where the money came from.
It works for indie makers as well as small teams who want a shared view of sales.
What you get out of it
You know what a campaign produced
A newsletter on Tuesday, a post on social media on Wednesday: the following morning's summary shows whether sales moved. That feedback guides where you spend promotional effort next. That feedback loop is how a small shop learns quickly.
Product mix is visible every day
Grouping revenue by product shows which of your offerings is carrying the business and which one barely sells. That helps with pricing decisions and with deciding what to update or retire.
A slow day is noticed immediately
If a normally active product has no sales for a day, the summary makes the gap clear. You can check whether the checkout link broke or a price changed by mistake.
No tab-hopping to get the number
Opening the dashboard just to read a total interrupts work. Having it appear in Slack where you already are removes the habit and keeps the figure in front of the whole team.
A dated record accumulates in Slack
After a few months, the channel holds a day-by-day record of sales. It is easy to search when you prepare a tax summary or want to compare this launch with the last one.
How it works
What happens, step by step
Every morning, ClickRuntime collects yesterday's orders from your Lemon Squeezy store.
It counts them, adds up the sales and works out which product sold best.
A one-line summary is posted to your #sales Slack channel.
Before it runs live
- Connect Lemon Squeezy
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 Lemon Squeezy steps into one automation
Under the hood
The code that runs this automation
from collections import Counter
from datetime import date, timedelta
from clickruntime import on_trigger, credentials, http, notify
STORE_ID = "12345"
@on_trigger
def run(event):
headers = {"Authorization": f"Bearer {credentials.secret('LEMONSQUEEZY_API_KEY')}",
"Accept": "application/vnd.api+json"}
day = (date.today() - timedelta(days=1)).isoformat()
url, params = "https://api.lemonsqueezy.com/v1/orders", {"filter[store_id]": STORE_ID, "page[size]": 100}
revenue, products, done = 0, Counter(), False
while url and not done:
body = http.get(url, headers=headers, params=params).json()
for o in body["data"]:
a = o["attributes"]
if a["created_at"][:10] < day:
done = True # newest first, so everything after is older
break
if a["created_at"][:10] == day and a["status"] == "paid":
revenue += a["total"]
products[a["first_order_item"]["product_name"]] += 1
url, params = body["links"].get("next"), None
count = sum(products.values())
best = products.most_common(1)[0][0] if products else "none"
notify.slack(f"Lemon Squeezy {day}: {count} orders, ${revenue / 100:,.2f}. Top product: {best}", channel="#sales")
return {"orders": count, "revenue": revenue / 100}FAQ
Common questions
Does the total include refunds and taxes?
How does it know which orders were placed yesterday?
Is it useful if I only sell one product?
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
Post every Lemon Squeezy order to Slack
Each sale lands in your channel with the product, buyer and total as soon as it's paid.
See how it worksGet a Slack ping for new Lemon Squeezy subscribers
You know right away when someone starts a subscription, and on which plan.
See how it worksGet emailed when a renewal fails or a subscriber cancels
An email for each failed renewal payment or cancellation, so you can follow up before the customer is gone.
See how it worksKeep exploring
Set up “Post yesterday's Lemon Squeezy sales each morning” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.