← Back to all work

Case study · Live-blog WordPress plugin

From a war and a $49 scam to the #1 page on both Wego properties.

A weekend rebuild that started with flooded customer-service lines and a fake plugin — and ended up as the highest-traffic page on Wego’s English and Arabic blogs for three months running.

846k EN sessions in 3 months #1 page on both Wego blogs ~1 weekend PRD → production
WordPressClaude AICustom GPT (PRD)n8nApifyEN + AR

01 — The weekend the lines lit up

The Israel–Iran war broke out on a weekend. Wego is a travel search engine focused on the MENA region — a huge share of our users live there, book from there, and were now staring at flights being cancelled, airports being closed, and routes being rewritten in real time.

Our customer-service lines flooded. Some travellers turned up in person at our offices because they knew we had physical locations around the world. Inside the company the directive landed fast: my manager and our CEO asked us to spin up a live blog covering all war-related travel news, in both English and Arabic, immediately.

02 — First attempt: manual updates with Claude

That afternoon a small team of us was called in to help. I’d only just started using Claude, so I asked it to draft a live-blog-style WordPress post in both EN and AR and fill it with current war-related travel news. It worked. I’d prompt, Claude would search, find the relevant items, and update the post.

The limitation was structural. Claude’s scheduled runs didn’t exist yet — every update required my laptop to be on and me to push the next prompt. Useful for the first 12 hours, but nothing about it was actually live. It was me, typing on a Saturday.

03 — The $49 detour

I looked for an off-the-shelf live-blog plugin. Found one, paid roughly $49, installed it on our blog. Three things went wrong: the documentation was unclear to the point of being unusable; there was no customer service; and I emailed for help, for docs, eventually for a refund — zero replies to any of it.

Verdict: we’d paid a website that didn’t appear to have anyone behind it. Effectively a fake plugin — money in, nothing out, no recourse. I’d burned half a day setting it up and the other half realising it.

04 — 5 AM: build it myself

I went to sleep with the problem still unsolved. Around 5 AM I woke up with a single thought: I now have access to every AI tool I’d need to write this from scratch. Why am I renting a broken black box?

I wrote the raw idea as a phone note over coffee — about twenty minutes of unstructured thinking about what a useful live-blog plugin actually needed to do. (I still have that note.)

05 — Writing the PRD, by being interviewed by GPT

I’d never written a Product Requirements Document before. Rather than fake one, I built a custom GPT whose job was to interview me about the idea and produce the PRD itself. The process took roughly an hour: I dropped the raw phone note in; it asked follow-up questions on scope, edge cases, success criteria, must-haves vs nice-to-haves; it produced a structured PRD I’d have been happy to hand to an engineer.

Lesson: the PRD wasn’t the bottleneck I’d assumed. The bottleneck was being asked the right questions — which is exactly what a well-prompted GPT can do for one person.

06 — PRD to working plugin: one Claude session

I uploaded the PRD into a private GitHub repo for the plugin (Wego-internal), pointed Claude Code at the repo, and asked it to start building. Roughly 10–15 minutes later I had a first working version. I installed it on a test blog. It rendered. It loaded posts. It accepted new entries. I took a half-day off the next morning to start tweaking it for real production use.

07 — The $200 day, and what it taught me

Before the plugin existed, an n8n workflow was already feeding the live blog automatically. The first architecture was naive: each update rewrote all of the page’s HTML — every card, every list, every snippet of inline CSS — and sent it back into WordPress. As the page grew, the payload grew. In one bad day I burned roughly $200 in API tokens — for a single page being kept current.

What changed: this is exactly the problem the plugin solved. By separating the live-blog engine from the raw page markup, n8n could send just one structured post object — a few hundred bytes — and the plugin handled rendering, ordering, RTL flipping, and notifications. The token bill dropped to near zero.

08 — The plugin today: WP LiveBlog

It stopped being a weekend hack a long time ago. Updates are stored as structured database records and rendered as a chronological timeline via a shortcode — no post editing, no page rewrites. Three months on, it runs both Wego’s English and Arabic blogs in production.

Content & rendering

  • Multiple live-blog sets — independent streams, each with its own feed, workflow, display rules, and per-set styling that never touches global theme CSS.
  • Item statuses — Draft, Published, Pinned; pinned items hold the top of the timeline.
  • Shortcode embedding — drop [wp_liveblog set="…" poll="1"] into any page; poll="1" turns on AJAX auto-refresh so readers see new cards without reloading.
  • Tags, optional search, per-set “Load More” vs pagination, and a live banner showing how many new cards have arrived.

Automation & integrity

  • REST API ingestion — a namespaced endpoint (/wp-json/wp-liveblog/v1/items) authenticated with WordPress Application Passwords. This is how n8n feeds the timeline — one small structured object per update instead of a whole rewritten page.
  • Idempotency keys — an external key on each insert means a retried n8n run never creates a duplicate card.
  • Duplicate detection — warns editors when a new item closely matches an existing one by URL or title, with a direct link to the match. Non-blocking by design.
  • Audit log — every create, edit, delete, status change, API insert, and settings change is recorded with actor and timestamp.

Bilingual, multisite, hardened

  • RTL & Arabic auto-detection with full label translation — the same plugin drives the EN and AR blogs natively.
  • Dual-timezone display (UTC + local, e.g. GST) on event times.
  • Multisite-aware — tables provision per site on activation, automatically.
  • Role-based access (Editors/Managers add & edit; Admins control settings and the API), with nonce protection, capability checks, input sanitisation, and output escaping throughout.
Why this matters: none of this was in the 5 AM phone note. It accreted because the plugin was load-bearing in production — idempotency keys appeared the first time an n8n retry double-posted; the audit log appeared the first time we needed to know who changed what. The architecture is a record of real operational pressure, not a feature wishlist.

09 — Three workflows in production

  • Middle East travel-disruption live blog — the original, launched the weekend the war broke out. Still the #1 page on both properties.
  • Hajj news live blog — live coverage through the Hajj season, when millions of MENA travellers are on the move at once.
  • Generic travel live blog — a rolling feed the editorial team uses as an idea source for new content.

10 — The numbers, and why they matter

The MENA travel-disruption live blog has been the #1 page on both Wego properties for 3+ months. Data window: March 8 – May 29, 2026.

English — blog.wego.com

MetricValue
GA4 pageviews887,756
GA4 sessions846,534
GA4 users576,100
GSC impressions61,220

Arabic — rahhal.wego.com

MetricValue
GA4 pageviews167,294
GA4 sessions161,072
GA4 users123,041

Combined: roughly 1 million sessions on a single topical page across two languages in three months — and still climbing, because the disruption hasn’t ended.

Four things I’d take from this

  • A real business crisis is the cheapest possible product brief. The plugin existed because walk-ins were arriving at our offices, not because someone wrote a roadmap.
  • AI made “idea → PRD → working plugin → production” a single morning. Two years ago this would have been a quarter of work for a small team.
  • Owning the tool beat renting a black box. The $49 plugin was a sunk cost; the plugin we own ships features whenever I need them.
  • The $200-day taught the architecture: stop sending the whole page; send the delta. That one lesson generalises across every n8n + LLM pipeline I’ve built since.

← Back to all work Start a conversation