What Actually Works in Productivity Apps for Freelancers
1. Notion AI sometimes rewrites content you never touched
There’s this thing Notion does where you have an AI block assisting a page, and you leave that block alone, but then suddenly the page history shows a revision. A version of your bullet list got subtly restructured by the AI block you didn’t even click. I noticed this when comparing shared page histories during a client async planning session. My original phrasing was replaced. Not deleted, just… reworded in a voice that wasn’t mine. No revision shown. Just different text.
If you embed Notion AI into a workspace-wide page template and later duplicate that template, it carries with it a connected AI context. That means when someone hits “summarize” or runs it off a slash command in their duplicate, it can treat the page like it belongs to the original writer’s intent. Somehow it decides how to improve based on a previous prompt.
That blew up for me after I handed off a shared SOP vault where two VAs noticed their content kept rewriting itself — subtly, but enough to mess with phrasing.
Pro tip: Turn off inline AI in templates before duplicating them for team use. Also, regularly command+shift+H to view revision changes, especially during collaborative async handoffs.
2. Slack messages triggered by Airtable delays can stack without warning
I had a Slack automation that was supposed to fire when a checkbox in Airtable was checked. Zapier read the field, filtered for the value, formatted a message, and posted to a private channel. After pushing it to a live workspace, one thing I forgot: Airtable automations batch-sync when multiple filtered views load simultaneously. The Zap didn’t understand throttling.
So what happened: One checkbox ticked. Four filtered views recalculated. Zapier read that single update as four unique triggers.
Slack message:
“Invoice sent ✅”
Slack message:
“Invoice sent ✅”
Slack message:
“Invoice sent ✅”
Slack message:
“Invoice sent ✅”
Client thought I was mocking them.
Fix was adding a timestamp comparison modifier in Airtable using NOW() - LAST_MODIFIED_TIME()
filtered to show less than 5 seconds old. Only the freshest record would pass. That cut ghost triggers cold, but it took half a day of trail-and-error to sort out why it wasn’t a Zapier issue — it was just Airtable being too eager to recalculate.
3. Coda buttons can freeze browser tabs during async polling
Let’s be blunt: Coda is magic until it starts polling APIs in loops. Then it becomes unusable if the button happens to trigger a looping pack formula. I was testing a freelancer task board that used button-click triggers to run a GET request from a third-party project board. Worked great in theory, until I let the button call a table of 50 rows that each looped through a formula chain.
Browser fan kicked in. Tab froze for 15 seconds. Clicking things didn’t help — the whole canvas became unresponsive. Chrome’s activity monitor showed 600MB RAM usage in one tab.
The surprising fix wasn’t changing the loop — it was adding one second of delay using RunActions(Delay(1), OtherAction)
to de-bounce the first 10 row calls.
Undocumented edge case: Coda buttons don’t short-circuit repeated background calls if the results don’t change. Saw this in a debug session where logging showed identical API fetches returning the same payload, but Coda insisted on firing them all again unless you explicitly cached the value in a control or variable block.
4. Time zone mismatch in Google Calendar breaks AI draft logic
Once, I copied a Zap from my personal work calendar to a shared client account. Same connected Google Calendar. Zap pulls new events marked as external calls and summarizes them in a Slack thread using OpenAI. The summaries suddenly started jumping the gun: people were getting prompts about calls that weren’t happening for 12 hours.
Turns out the root cause was one shared calendar originally created in GMT and another in PST. Zapier was pulling datetime strings from both, assuming UTC, and passing them straight into the OpenAI prompt unmodified.
The AI awkwardly started hallucinating past tense: “You discussed X with Y.” We hadn’t even gotten on Zoom yet.
Fix:
- Standardize all Google Calendars to same timezone under settings → time zone
- Set a formatter step in Zapier to normalize datetime field using the exact offset
- Use
{{zap_meta_human_now}}
to validate current-time in AI prompt logic - Double-check for 12-hour vs 24-hour formatting in AI prompt context
Ridiculously annoying to debug, because at first it looked like a bug inside ChatGPT when it was just a formatting oversight.
5. Cron jobs in Make can repeatedly run even after timeout
I ran into this building an automated portfolio sync where Make pulled in Behance and Dribbble updates once a day, filtered them, and updated a Webflow CMS. Used a cron trigger with a 1-day interval. At some point, Webflow started rate limiting the POST requests because the scenario kept running three times in an hour.
Checked the execution logs — it was being retried after what Make called a “soft failure.” Not hard enough to stop the chain. Just soft enough to panic and retry every 20 minutes until the timeout passed… then it did it again.
Root edge case: If you use custom API modules that don’t return a valid object (like a 204 No Content – which Webflow LOVES), Make thinks the module errored and triggers a retry path. You have to manually insert a Set Variable
step with a dummy JSON object as a success marker to stop it from looping.
Whole site updated three times a day for a week before anyone noticed.
6. Raycast AI workflows rely way too much on local context
Raycast is great for local keyboard workflows, but if you expect AI to behave like a cloud assistant — think again. I tried building a command that takes selected text, rewrites it in a specific voice, then pastes it back to the clipboard. Worked fine when the cursor focus was clean. Broke instantly when last-clicked app wasn’t text-compatible (like Figma or Slack).
The command didn’t just fail — it hung with no output. No error message either. Just.. silence. Couldn’t even tell whether the clipboard updated.
The bug: Raycast doesn’t pause for macOS context switches. If you click outside a text field while a workflow is building, it still tries to overwrite to clipboard — but loses the assignment pointer to that field.
My workaround? I added a log-to-terminal step inside the custom JavaScript where the modified string gets dumped to user clipboard first, then echoed to the terminal so I can visually confirm output even if the clipboard thing fails mid-switch.
Bonus: It taught me Raycast AI’s token cap is a little over 1000 characters. Anything longer silently gets cut off without trimming the text — it just sends partial context. No warning.
7. Processed automations don’t always reflect Teams notifications instantly
We set up a workflow for a remote design team using Microsoft Forms to capture daily standups. A Power Automate flow parsed Forms responses and dropped them into a Teams channel thread grouped by user + date. Looked fine on paper. The problem? Notifications didn’t always land until 15–20 minutes after. Not because of the flow — because of Teams rendering logic.
We saw logs confirming the message was posted. The bot tag showed up. But users didn’t receive pings unless the message caused a new thread or was marked as important.
Undocumented behavior: Replies to an existing thread within two minutes of original post are more reliably delivered. But if the flow waits 3+ minutes to add a reply comment, Teams deprioritizes it from user notification preferences unless manually toggled.
Made it look like the bot wasn’t working for half the week. Fix was chaining a timed condition at the end that evaluated whether to reply to thread or mention user directly based on last-post time delta.
8. MacOS Shortcuts app sometimes forgets file path variables after sleep
This might be the most frustrating thing I’ve seen lately. Built a shortcut that grabs a file from a known path — a templated invoice — fills today’s date, exports it as PDF, and attaches it to Mail.app. Works great until the machine goes to sleep overnight. Next morning: shortcut fails with “File not found” error. But the file is there. Nothing moved.
Turns out macOS deallocates environment variables pointing to sandboxed paths after hibernation. If you stored a file’s location via “Get File” and saved the reference rather than rescoping fresh from the Finder, it doesn’t find it anymore after waking up.
Aha moment: Instead of “Get File” → stored, use “Get File from Folder” → “Find file by name contains [template].” Forces a re-query on every run, even after wake events.
I thought I was crazy the first three times it happened. Rebooting fixed it, but then I watched the log over AppleScript’s shortcut overview — and it showed the path being passed as NULL after sleep. It wasn’t a permissions issue. It was plain forgetfulness from the OS.