All Tabs

Somehow, Google Sheets Became My CMS

google-sheetscontentpocket-nenek

I did not set out to build a content management system for Pocket Nenek. I just wanted the people writing the food stories to update them without opening a code editor or messaging me every time a comma moved.

So, Google Sheets. Everyone knows how to use it. It has rows. It has columns. How hard could it be?

What I pictured

Read a Sheet, show the food trail, go home.

What I built

Schemas, header checks, sync logs, upserts, deactivation rules, and a local database mirror.

The Sheet was friendly for the editor, but the bot still needed boring guarantees. “Scheduled At” had to actually mean “Scheduled At”. A formula under a blank header looked populated to a human and invisible to the importer. A Sheet ID without working service-account credentials quietly meant the app was still reading the local workbook.

None of these bugs were difficult in isolation. They were difficult because the screen looked correct. You could stare at a full row and think, obviously the bot can see this. The bot, sadly, cannot appreciate visual vibes. It sees keys and values.

The spreadsheet is the front desk

I eventually stopped treating Sheets like the database. It is the editorial front desk. People can comfortably change stories, answers, notifications, and settings there. The sync layer checks the paperwork, and the runtime reads a cleaner local copy.

That separation made the whole thing calmer. Editors do not need deployment access. The bot does not need to trust arbitrary cells live. When something fails, there is a sync record to inspect instead of a vague “the trail is broken”.

If it has editors, validation, publishing rules, and a history of weird content bugs, congratulations: it is a CMS wearing gridlines.

I still like Sheets for this. I just no longer call it the simple option with a straight face.

Thanks for reading.Read more tabs →