All projects

Qasa Events: Ticketing Web App

Eight months shipping features and fixes on an event-ticketing web app: waitlists with mass messaging, promo codes, ticket sharing and transfers, sales views, and the purchase-to-receipt flow.

Role
Frontend engineer, one of the two main contributors
System
Qasa event ticketing (Dubtel)
Event tickets with a QR code, a waitlist, and a promo-code tag

Results at a glance

  • Built the waitlist feature: joining an event's waitlist, and organiser mass messaging to everyone on it.
  • Promo codes: listing all codes and toggling them active or inactive, with clear feedback on the result.
  • Fixed sharing of multiple tickets, ticket-transfer feedback, and the purchase flow so every purchase, including free tickets, lands on its receipt.
  • Event sales view fixes (ticket names showed the last purchaser's name), sales data ordered newest first, and a dynamic 'from' price on the homepage and ticket pages.
  • Fixed a wallet that could show a negative balance, and removed cash payment from the frontend.

Overview

Qasa is an event-ticketing product with an attendee side (discover events, buy tickets, share and transfer them) and an organiser side (create events, sell tickets, see sales, manage promotions). I worked on its React + TypeScript web app for eight months, one of its two main contributors, delivering sprint tickets end to end.

Attendee features and fixes

  • Purchase to receipt. After buying, users were not always redirected to their receipt, and free tickets had their own redirect bug. Both now land on the receipt page.
  • Sharing and transfers. Sharing several tickets at once was broken. Transfers now show a clear toast built from the API's response, whether it succeeded or failed.
  • Pricing. Events show a dynamic "from" price on the homepage and ticket pages, driven by a new starting_price field.
  • Wallet. Fixed a wallet that could display a negative balance.
  • Discovery. Sensible empty states when no events match a search, event images handled dynamically across pages, and the Qasa microsite merged into the events site.

Organiser features

  • Waitlists. Attendees can join an event's waitlist, and organisers can send a mass message to everyone on it. The success message comes from the backend response, not a hard-coded string.
  • Promo codes. A full listing of promo codes, fixes to creation and visibility, and toggling codes active or inactive with feedback on the new state.
  • Sales. The event sales view showed the last purchaser's name on every ticket, which is now fixed, and sales data is ordered newest first. The event summary report UI was also updated.
  • Event creation. Currency became a required field, ticket-field defaults were fixed, and a location-address dropdown bug was resolved.

Later: funding applications

On the Qasa funding site (PHP), I built the submission flow for event and project funding applications. I also moved its emails onto the Mango Fund API and updated the trader onboarding guides.

What it taught me

Most of this work was careful, unglamorous sprint delivery in a shared codebase: reading the ticket, reproducing the bug, fixing the edge case, and checking the fix against what the backend actually returns. It's the habit behind everything I've built since.

What I took from it

  • Show the backend's real response instead of a hard-coded success message.
  • Test the edges of a purchase flow: free tickets, several tickets, and transfers.
  • Small, well-labelled sprint tickets ship faster and review better.
Henry Iddirisu

Henry Iddirisu

AI product engineer · Accra, Ghana · Remote

More projects

LaravelLaravel ReverbPHP

Lesson Whiteboard

Role: Full-stack engineer (sole developer across all three codebases)

A live whiteboard for online language lessons, built end to end across a Laravel API, Reverb WebSockets, the tutor app, and the st…

Next.jsReactTypeScript

Checkout Payments and Student Billing

Role: Full-stack engineer (payment step; billing API extensions; student and…

The payment step of a European e-learning checkout (Stripe, Klarna, Alma, PagoLight, SeQura), plus the billing API and student bil…