On a schedule
Get your week's hours by client and project
Every Friday afternoon you see where your week went, broken down by client and project in hours.
- Runs
- On a schedule
- Apps
- Toggl Track
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every Friday at 4pm, email me my Toggl Track hours for this week, grouped by client and then by project.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Agencies and consultants who bill by the hour need to know on Friday whether the week matched the plan. The answer is spread across Toggl Track: you open reports, pick the week, group by client then by project, and mentally convert seconds into hours. A retainer client who was promised ten hours might quietly have received fifteen, and nobody notices until the monthly summary.
Each Friday, this pulls Toggl's weekly summary report, converts the durations from seconds into readable hours and emails you a breakdown by client and project. The week's hours are laid out before you leave for the weekend.
It is useful for account managers who watch retainer hours across several clients. Toggl's summary does the adding, so the email only needs to be read, not calculated. No calculator needed.
What you get out of it
Retainers stay within budget
Seeing hours per client each week shows overruns while there is still time to adjust. You can cut back the following week instead of discovering at month end that you gave away a day of free work.
Project-level detail by week
The breakdown by project tells you which piece of a client engagement is eating time. A website build that suddenly takes twice the hours becomes visible in days, not weeks.
Hours you can read at a glance
Toggl's raw durations are in seconds, which are useless for planning. The report converts them to hours, so you can compare against a quote or retainer without a calculator. That makes the report usable in a meeting rather than a puzzle.
Better Monday planning
Knowing exactly where the week went helps you set priorities for the next one. If a low-value client used a third of your time, Monday's plan can reflect that. Planning becomes faster because it starts from actual numbers.
A weekly record for client conversations
When a client questions the hours, a Friday email from that week is your evidence. It is quicker to find than a re-run of a Toggl report with the right filters.
How it works
What happens, step by step
Every Friday at 4 pm, ClickRuntime pulls this week's tracked time from Toggl Track.
It adds the hours up by client, then breaks each client down by project.
You get an email with each client's total and the hours per project underneath, ready for billing or a team check-in.
Before it runs live
- Connect Toggl Track
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 Toggl Track steps into one automation
Under the hood
The code that runs this automation
from collections import defaultdict
from datetime import date, timedelta
from clickruntime import on_trigger, credentials, http, notify
API = "https://api.track.toggl.com/api/v9/me"
@on_trigger
def run(event):
auth = (credentials.secret("TOGGL_API_TOKEN"), "api_token")
monday = date.today() - timedelta(days=date.today().weekday())
entries = http.get(f"{API}/time_entries", auth=auth, params={
"start_date": monday.isoformat(), "end_date": (date.today() + timedelta(days=1)).isoformat()}).json()
projects = {p["id"]: p for p in http.get(f"{API}/projects", auth=auth).json() or []}
clients = {c["id"]: c["name"] for c in http.get(f"{API}/clients", auth=auth).json() or []}
hours = defaultdict(lambda: defaultdict(float))
for e in entries:
if e["duration"] < 0:
continue # still running
p = projects.get(e.get("project_id")) or {}
hours[clients.get(p.get("client_id"), "No client")][p.get("name", "No project")] += e["duration"] / 3600
lines = []
for client, by_project in sorted(hours.items()):
lines.append(f"{client}: {sum(by_project.values()):.2f} h")
lines += [f" - {name}: {h:.2f} h" for name, h in sorted(by_project.items())]
notify.email_me(f"Toggl hours, week of {monday}", "\n".join(lines) or "No time tracked this week.")
return {"clients": len(hours)}FAQ
Common questions
Does it cover Monday to Sunday?
Will archived projects appear?
Can I send each client their own report?
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
Receive an evening list of what you tracked
Each evening you get today's entries with a total, handy for checking nothing is missing before you log off.
See how it worksGet last month's client hours for invoicing
On the first of each month your billable hours per client are in your inbox, ready to turn into invoices.
See how it worksGet warned about a timer left on too long
If a timer has been running more than four hours you get one email naming the entry, project and start time.
See how it worksKeep exploring
Set up “Get your week's hours by client and project” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.