The funnel analytics I built to catch broken activation had a broken event of its own. Here's how I found it.
Follow-up to last week's post, where the same instrumentation caught a paying customer being failed by my own code in real time. This week I turned it on the number I actually care about and it fell apart under its own weight.
Bootstrapped social media scheduler, solo dev, fourteen months in. 115 accounts, one sale to date, still zero external publishes.
WHAT I WAS TRYING TO MEASURE
The full funnel from Aug 23 onward: signup, onboarding, connect a platform, open the composer, schedule a post. The step I cared about most was the last one, because everything upstream of it has been picked apart for months and this hadn't.
connect\_screen\_viewed: 70
connect\_clicked: 19
connect\_succeeded: 13
compose\_opened: 33
post\_scheduled: 1
That last row is the one I wrote this post about.
THE BUG
post\_scheduled fired as the first line of the publish handler, before the guard clause a few lines down that returns early for empty content, an over-limit post, no platform picked, or media still uploading. It measured "the function was called," not "a post exists." A second, separate implementation of immediate publishing, which is what the actual Post Now button calls, never fired it at all.
So 1 is not "one person scheduled a post." It's an unknown number of clicks, of unknown outcome, with an entire code path excluded from the count.
WHY IT MATTERED BEYOND THE NUMBER
Chasing why that second path had no tracking, I found it also never granted the first-post credit bonus and never updated the user's posting streak. Two separate functions were doing "someone just published," and only one of them had the reward logic attached. They'd been written months apart and nobody had ever diffed them against each other.
THE FIX
Moved the event into the API route that actually inserts the post row, after the insert succeeds, so it can only fire when a post is real. That route is shared by the single-post, thread, and A/B test compose flows, so all three are now covered by one call instead of three separate ones that would each need remembering. Extracted the credit and streak logic into one shared function both publish paths call.
WHAT I'D TELL ANOTHER SOLO FOUNDER
An analytics event answers "did the code run," not "did the thing succeed," unless you put it after the part that can fail. If your funnel has a step that only fires from a button's onClick, go check whether it fires before or after the network request. Mine was in the wrong spot for months and looked completely reasonable sitting there.
Also filed TikTok's audit for public posting this week, unrelated to any of this but worth mentioning since it's the next real lever if it clears. Happy to go into the event schema or the credit-pool split if either is useful to anyone building something similar.
u/InterestingRun7594 · Social & creators