Square cancellation event gotcha
I was handling subscription.canceled — an event type that does not exist.
Cancellations come through subscription.updated with status === "CANCELED".
case "subscription.updated": {
if (sub.status === "CANCELED" || sub.status === "DEACTIVATED") {
await db.from("users").update({ plan: "free", plan_expires_at: null })
.eq("square_customer_id", sub.customer_id);
break;
}
}
Day 7 (4/24): Dashboard Consolidation
Tried tabs, got feedback that tabs are conceptually the same as separate pages. Removed them. Everything on one scrolling page.
7 Lessons from 7 Days
- Register webhooks, not just write handlers
- Structured data needs SQL, not RAG
- Stream from the start
- Implement non-standard auth manually
Current State
Working: LINE chat with Garmin data, ZIP bulk import, Garmin auto-sync, Strava integration, Square billing, usage dashboard.
Currently just me and a few friends. If you use Garmin, give it a try. Reactions will determine how far this gets built out.
https://stride-mate.vercel.app
Closing
Building with Claude Code, I kept running into the same pattern: code works, configuration missing. The skeleton comes together fast now — but the connective tissue (webhook registration, spec edge cases) still bites just as hard.