How it works
- Open a Google Sheet and start Saasy Logs from the
Extensions menu.
- Paste the log, or upload the .log file you downloaded
from Salesforce.
- Read the Summary. Each run adds its own tabs, so
nothing already in the sheet is touched.
See it step by step on a real log →
See the path your save took
Your code says what can run. The log says what did.
Saasy Logs draws it as a map: which trigger fired, what it set off,
and on which object.
Example code path: the top-level steps a save went through
| Code path | Kind | Ran | Object |
OrderItemTrigger | Trigger | ×2 | OrderItem |
OrderTrigger | Trigger | ×2 | Order |
Set Order Owner | Flow | once | — |
Three lines, and the cascade is visible: saving an order line fired the
order's trigger, which fired a flow. Nobody had to read 20,000 rows to see it.
Then what happened, in sentences
The Summary opens by saying what happened, before any table.
What happened
10.40 s — 60% of the whole transaction — is unlogged time, between
SOQL_EXECUTE_END and DML_BEGIN.
Overall, 96% of the elapsed time has no log line explaining it.
2 updates cost 5.13 s across 5 rows; the slowest single one took
4.63 s. That span includes every trigger, flow and validation the save
set off — not just the write.
Real output from a real 25 MB production log.
Then a ranked shortlist
A big log holds 168,000 lines. These are the few worth your time, worst first.
Example ranked findings from a debug log
| Severity | Finding | Where |
| CRITICAL |
CPU time exceeded: 30,064 of 25,000 (120%) |
namespace (default) |
| ERROR |
System.LimitException: Apex CPU time limit exceeded |
findRelatedSettings, Apex line 22 — 5 occurrences |
| WARN |
10.40 s unlogged gap (60% of transaction) |
between SOQL_EXECUTE_END and DML_BEGIN |
| WARN |
Log is incomplete — Salesforce discarded 35.8 MB |
Timings across the skip are unreliable |
| INFO |
104.5 s self time in updateChildRecords |
25 calls · 125 s total · 25 DML — DML inside a loop |
And every step, in detail
The Trace tab lists every trigger, method, flow and workflow rule that ran,
with the record it ran on. Filter to one trigger, class or object.
Excerpt of a trace, inside a trigger
| Kind | Class | Method | Object | ms |
| Trigger | — | — | OrderItem | 178.6 |
| Method | TriggerRouter | Run(IHandler) | OrderItem | 176.7 |
| Method | OrderItemHandler | IsDisabled() | OrderItem | 62.4 |
| Method | HandlerSettings | findRelatedSettings(Id, Id) | OrderItem | 59.8 |
| Workflow | — | Recalculate Order Total ×4 | OrderItem | |
Real timings from a production log, class names changed. A third of the
trigger's time went on IsDisabled(), checking whether it should
run at all, and a workflow rule fired four times on the way past.
It finds the time nobody logged
A debug log lists things that happened. The expensive part is often the
gap between two of them: seconds where nothing was logged at all. Saasy Logs
measures those gaps and tells you where they sit.
Read
how it found 10 seconds between two lines I'd scrolled past for years.
Where the project actually is
Now is what I've run against a real log in a real spreadsheet.
Next is what I'm building. Later is a wish list, and wish
lists are free.
Now
Working and verified
- The code path. Which trigger fired, what it set off, on which object.
- The route, in order. Triggers, flows, workflow rules, validations, classes.
- Filter without re-running. By trigger, class, method, object or limit type.
- A summary in sentences. The duck goes first.
- The shortlist. Fatal errors, blown limits, unlogged gaps, hotspots — ranked.
- Honest about holes. It says when the log is incomplete.
- Paste or upload. The text or the .log file, whichever you have.
- A scrubbed copy, every run. Names and record IDs stay, values go. Ready to send.
- Your tabs are safe. Every run adds its own tabs and overwrites nothing of yours.
- No Drive permission. Just the sheet you opened it from.
Next
Being built now
- The Marketplace listing. Install it the normal way.
- The object path. Which records the save touched, in what order.
- The 101 hunt. Which query keeps running, and who calls it.
- Async hand-offs. Where the trail leaves this log.
- Name the managed package. Whose code the missing time belongs to.
Later
Wanted, not started
- Benchmarks you can keep. Find out whether the fix helped.
- Lead with the error you got. The 9am email, answered first.
- One transaction, many logs. Put a shattered journey back together.
- Before and after. Two runs, side by side.
- Enormous logs, in chunks.
💬 Support
A question, a bug, or a log it read wrong: email
support@saasylogs.com.
What helps. What you ran, what you expected, and what
you got. The version is in Extensions → SaasyLogs → About / limits. If a
log is part of it, send the run's Scrubbed tab rather than the raw log:
class, flow and profile names stay, so it can still be read.
Getting started. See it on a real log
walks through one run, step by step. What has
changed lists every release.
🔒 Privacy Policy
Apex debug logs are among the most sensitive artefacts a Salesforce org
produces. They routinely contain names, email addresses, phone numbers,
postal addresses, whatever your code printed with System.debug, and the
shape of your internal automation.
Your log stays in your spreadsheet. Saasy Logs runs
inside the Google Apps Script runtime attached to the sheet you opened
it from, and that sheet is the only thing it can see — it asks for no
Google Drive permission at all. The parsing, the summary and the trace
are all built there.
What it leaves in your spreadsheet. Each run adds its
own tabs: a Summary, a Trace, and a scrubbed copy of the log, plus a
small marker on those tabs so it can find them again if you choose
Replace my last run. They are yours to keep or delete.
How it is protected. Your log stays inside Google's
infrastructure the whole time. The dialog sends it to the add-on over
Google's encrypted connection, the add-on works on it in memory, and
the results are written to your spreadsheet, where your Google account
and the spreadsheet's own sharing settings decide who can see them.
Saasy Logs has no server or database of its own, so the developer
never receives your data. Its permission covers only the spreadsheet
you open it from. And every run writes a scrubbed copy, with emails,
contact and account names and printed values replaced, so a log can
go outside your company without its sensitive parts.
How long it is kept, and how to delete it. The log
text is held in memory only while a run is working, and released when
it finishes. What lasts is what you can see: the tabs each run adds,
and the small marker on them. They stay until you delete the tabs or
the spreadsheet. To stop Saasy Logs using your data altogether,
uninstall it from Extensions → Add-ons → Manage add-ons and remove its
access at
myaccount.google.com/permissions.
An earlier version held pasted text in Google's per-document cache for
six hours so you could re-run without re-pasting; that feature is gone
and the cache went with it.
Google user data. With your permission, Saasy Logs
reads and writes the spreadsheet you open it from, to build the tabs
above, and shows its own dialogs inside Google Sheets. It keeps no copy
of that data and shares it with no one. Saasy Logs' use and transfer
of information received from Google APIs adheres to the
Google
API Services User Data Policy, including the Limited Use
requirements.
Last updated 6 October 2026 · Questions: support@saasylogs.com
📄 Terms of Service
Saasy Logs is provided free of charge and as is, without warranty of
any kind. It is a diagnostic aid: it reports what a debug log
contains and flags where a log is incomplete, but it cannot guarantee that
every performance problem in your org will be surfaced, and it is not a
substitute for your own engineering judgement.
You are responsible for ensuring you have the right to process any log you
paste into it. Do not use it on data you are not permitted to handle.
Not affiliated with, endorsed by, or sponsored by Salesforce, Inc. or Google
LLC. Salesforce, Apex and related marks are trademarks of Salesforce, Inc.
Last updated 13 September 2026