Short answer
RaftLabs built CeolX, a location-first Irish music event discovery app, in React Native and Expo on a Hono and tRPC backend over PostgreSQL, with Typesense-backed map search. It launched into Irish festival season in August 2026 and by 22 September recorded 346 registered users, 119 listed events, and 1,708 event views, with accounts up 51% in five weeks.
Engagement
The CeolX engagement
- Client
- CeolX, a founder-led Irish music and events venture
- Sector
- Live music discovery and venue booking in Ireland
- Delivery
- Phased fixed-price build from March 2026, launched August 2026, ongoing
- Team
- Two engineers, one project manager, one QA engineer, part-time solution architect
- Scope
- React Native app for fans, artists, and venues; React admin portal; Hono and tRPC backend over PostgreSQL; Typesense map search; Stripe venue subscriptions
- Status
- Live on the App Store and Google Play. Venue subscriptions built and ready to switch on venue by venue
The situation
CeolX started from an idea, not a broken system. There was no previous agency and no legacy stack. The founder wanted to promote Irish music culture and had a clear picture of how: put every live session, gig, and festival slot on a map, and let fans, artists, and venues find each other on it.
CeolX is a three-sided product where none of the three sides is useful without the other two. Fans need events to browse. Artists need venues to book them. Venues need an audience worth paying for. Get the sequence wrong and you launch an empty map.
RaftLabs built the whole thing: three personas inside one React Native app, an admin portal, a Hono backend over PostgreSQL, and location-first discovery backed by Typesense. We timed the launch to Irish festival season. By 22 September the app had 346 registered accounts, 119 events listed, and 1,708 event views, and accounts had grown 51% in five weeks.
The map, the idea the whole product rests on, became the most-used screen in the app: 4,574 views from 449 people, about twice any other screen.
Before and after
From an idea about Irish music to a live three-sided app
- No product yet. An idea and a clear audience, but no app, no backend, and no way to reach that audience
- Irish live music discovery scattered across Facebook events, posters, and word of mouth
- No way for a venue to find an available artist for a Thursday night
- No way for an artist to see which venues were programming their kind of session
- No revenue mechanism, and no clarity on whether a subscription model could even ship inside the app stores
- Festival season approaching, which is either a launch window or a missed year
- One React Native app serving three personas: fans, artists, and venues, live on iOS and Android
- Map-first discovery over live event and venue data, with category and text search, and a search radius that widens on its own when an area comes back empty
- Guest browsing, so fans can explore the map and events before creating an account
- Artists publish events and promotional posts, ask to play at events, and accept or decline venue invitations
- Venues list gigs, invite artists, attach promotional ads to their events, and read engagement analytics
- A React admin portal for the internal team, with user management, event moderation, and subscription visibility
- A venue subscription model designed to clear Apple and Google review, built, tested, and ready to launch
- 346 registered accounts and 119 events listed by 22 September, with accounts up 51% in five weeks
The problems we had to solve
Venues had to pay, and the app stores forbid the obvious way to collect
This was the hardest problem on the project, and it was not a coding problem. Venue subscriptions are the revenue model. Apple and Google both restrict how an app can take money for digital access, and a global app cannot rely on the narrow exemptions that exist in some countries.
We considered three routes. Apple In-App Purchase with RevenueCat was the compliant default, but it takes roughly 15% of every subscription from a young business before the model is proven. A "Buy now" button opening an external browser clears review in some jurisdictions and is fatal in others, which makes it a liability for an app meant to travel. The third option was email-only activation: the venue signs up, the app tells them their listing is not yet visible, and an activation link arrives by email that opens Stripe Checkout, outside the app entirely.
We chose email-only activation. It costs no platform commission and works the same whichever country a reviewer opens the app in. The trade-off is that the flow only works if four rules hold.
Four rules the payment flow had to hold, or it silently breaks
Choosing email activation created four constraints that are easy to violate months later by accident:
No price, no URL, and no checkout button appears anywhere in the app. Not on the subscription prompt, not in settings, not in a tooltip. The app states that the venue is not yet visible and that activation details have been emailed. That is the entire surface.
The Stripe webhook is the only source of truth for payment. Not the browser redirect. Users close the tab, lose signal, or pay on a different device, and any flow that treats the redirect as confirmation will mark paying venues as unpaid.
There is no return URL back from the Stripe portal. A reviewer should not be able to trace a round trip from the app to a checkout and back, because that round trip is the thing being restricted.
The activation route is excluded from the app's deep-link path globs. This is the easiest rule to break. Add it by default and the activation email opens the app instead of the payment page, which silently closes the only route into the paid flow, with no error anywhere.
Location-first discovery, without building a geo engine
The map is the product. Everything else is a feed. That meant indexed geospatial search over live event and venue data, with category filters, text search across artist and event names, and a search radius that widens automatically when an area comes back empty, all responsive on a phone in a pub with poor signal.
We could have built this on PostGIS queries against Postgres directly. We used Typesense for the geo index and the native map on each platform for rendering instead: Apple Maps on iOS, Google Maps on Android. The reasoning was simple: this is a solved problem, the client is a founder-led venture without an ops team, and build weeks spent on a custom geo search layer would have bought nothing a hosted index does not already do well. Most of our testing effort went into the edges: pin clustering, and what the map shows when an area has no events. The choice held up. The map is the most-used screen in the app.
Clearing App Store and Google Play review for a three-sided app
A three-sided app with user-generated content, external payment, location permissions, and social features touches several store policies at once. Each one has to be handled in the product itself, not explained in review notes: admin moderation that can take down any event, location requested only when the map needs it, account deletion inside the app, and no payment surface at all.
We turned what we learned into a written review checklist covering these policies. The next app we take to the stores starts from that checklist instead of finding the same rules one review at a time.
Keeping scope clear with a non-technical founder
Feature-level scope works well when the buyer is technical. When the decision-maker does not read specs, a feature heading agreed on signing day can mean different things to each side a few months later. On CeolX we closed one gap like that during the build, and it changed how we scope.
We now define scope down to individual screens and states when the decision-maker is non-technical, and put the client into the staging build every week with a short demo call. On engagements where we run that cadence, the gap between what the client expects and what exists stays close to zero.
the build
How the build was sequenced
The engagement was a fixed-price phased build rather than a single delivery. That shape mattered, because two of the decisions we pushed back on were about sequence, not about features.
Phase one carries venue subscriptions alone
The original subscription ask bundled venue subscriptions, event boosting, and in-app advertising into one phase. We pushed back and split it. Venue subscriptions go first, because they are the simplest paid product and the one that proves whether venues will pay at all. Event boosting and paid promotion are designed and deferred to a later phase. A bundled subscription phase would have delayed every part of it behind the slowest part.
A pilot rollout instead of switching on all venues at once
There were 16 venues on the platform when subscriptions were ready. The instinct is to activate all of them and start billing. We recommended piloting with a handful first. An email-activation flow with no in-app checkout is unfamiliar to the person receiving it, and the first few venues will tell you where they get stuck far more cheaply than sixteen simultaneous support conversations will.
A stack chosen for a team that has no ops function
The March proposal specified Flutter, Hasura, and AWS Amplify. The build moved to a single TypeScript stack instead: React Native with Expo for one codebase across iOS and Android, a Hono backend with tRPC and Drizzle over PostgreSQL on Neon, and a React admin portal. One language across mobile, API, and admin means the app and the server validate against the same schemas, so a form rule cannot drift from the API rule behind it.
Around that core, every moving part is a managed service. BetterAuth for sign-in, Typesense for map search, AWS S3 for media, Mux for video, Upstash QStash for background jobs, Postmark for email, Firebase for push and remote config, Vercel for the API. That is the point: the client has no platform engineer, so anything requiring ongoing operational attention was a liability, not a feature.
Continuity across an engineer handover
The build passed between engineers in late June 2026, about two thirds of the way through the feature milestones. The first engineer built the core product between March and July. The second took over launch, store releases, venue subscriptions, production operations, and analytics. The handover was smooth because the stack is conventional TypeScript end to end and every milestone had a written task spec.
Proof
What the first month after launch produced
Figures come from the CeolX app's own records and app analytics, from launch week in August to 22 September 2026. They describe the first month after launch of a new product.
| Result | What changed | Period or context | Evidence and limitation |
|---|---|---|---|
| Registered accounts | 346 across three personas | 167 fans, 160 artists, 19 venues | App records, 22 September 2026. Accounts grew 51% in five weeks, from 229 on 18 August |
| Launch week | 142 installs and 104 new accounts in one week | Week to 18 August, driven by an offline event the client ran | Weekly users peaked at 217 the same week. 93% of new accounts verified their email (164 of 177, late-August check) |
| Events listed | 119 events | Published by artists and venues, 109 active on 22 September | 1,708 event views and 54 taps through to external ticket sites, a 3.2% view-to-ticket rate |
| Map usage | 4,574 map views from 449 people | The most-used screen in the app | About twice the views of any other screen. Discover is second with 2,221 |
| Community activity | 119 posts, 255 follows, 17 collaborations | Social and booking layer, launch to 22 September | 113 post likes, 26 saved events, and 91 shares started from inside the app. 10 of the 17 artist and venue collaborations were accepted |
| Platform split | Two in three people on iPhone | 358 on iPhone, 169 on Android, 4 on iPad | Includes guests browsing without an account. 56% of late-August installs came from Ireland |
| Revenue model | Ready to launch | Venue subscriptions are built and tested but not yet turned on for any venue | Revenue starts once subscriptions are turned on for the first pilot venues |
Timeline
How the engagement ran, and where it stands
January to March 2026
Scope, personas, and a phased proposal
Three personas defined with distinct pain points and feature sets, plus an admin portal. Live streaming, in-app event payments, and offline maps were explicitly ruled out of version one, in writing, before any code was written.
March to July 2026
Core build across seven milestones
Auth and onboarding, map discovery, event and post creation, the artist and venue invitation loop, calendar and notifications, analytics, and the admin portal.
Late June 2026
Engineer handover mid-build
Delivery passed to a second engineer, who took launch, store submissions, production operations, and the subscription milestone.
August 2026
Launch into festival season
Released on both stores. An offline event run by the client drove the launch spike: 142 installs, 104 new accounts, and 217 weekly users in the week to 18 August.
August to September 2026
Venue subscriptions built and ready to launch
Email-only activation, Stripe webhook as the single source of truth, no checkout surface in the app. Released behind a feature flag, so it can be turned on for a few pilot venues first and for everyone later, without a new app release.
Now
Ongoing, with later phases scoped but unconfirmed
The engagement continues. Event boosting and in-app promotion were deliberately deferred from phase one and are planned, not yet commissioned.
The lesson
For a local discovery app, acquisition is the easy half. Plan the second month before you launch the first
CeolX did not have a user acquisition problem. One offline event run by the client produced 142 installs and 104 new accounts in a single week. If you are building a community app around live events, tie your launch to a real-world moment where your audience is already gathered in one place. It works, and it costs less than any paid channel.
The harder part is the weeks after. A discovery app is only useful when there is something new to discover, so the lever that matters is supply: artists and venues posting events week after week, not only during festival season. CeolX tracks how often the map has nothing nearby to show a user, and that number is the clearest guide to where supply is thin. A three-sided marketplace lives or dies on the side that creates the inventory.
So if you are building something like this, put the same planning into the off-season that you put into launch week. Decide before you ship what gives an artist a reason to post in November, and what gives a fan a reason to open the app on a Tuesday.
Where to go next
What we would recommend next
These are opportunities beyond the delivered scope, not work that was included.
- Next 01
Take venue subscriptions live as a small pilot
The flow is built and tested. Activate a handful of the 16 venues rather than all of them, watch where the email activation step loses people, and fix that before it becomes sixteen support threads at once.
- Next 02
Grow event supply outside festival season
The app already counts every time the map has nothing nearby to show a fan. Prompts and reminders that help artists and venues publish regularly will lift fan engagement more than anything aimed at fans directly.
- Next 03
Measure ticket clicks end to end
3.2% of event views already lead to a tap on Book Ticket. Tracking those taps through to the ticket site would show how much real attendance the app drives, which is the number venues care about most.
- Next 04
Follow demand into Great Britain
In the late-August check, 33 of the 57 upcoming events were in Great Britain. Irish music travels, and the map already works anywhere. Outreach to artists and venues there is a low-cost way to grow supply.
Common questions
A phased fixed-price build. Scoping ran from January to March 2026, the core build across seven milestones ran March to July, and the app launched on both stores in August. The proposal put the build phase at 12 to 14 weeks in two-week sprints. The engagement is still running, with later phases scoped but not yet commissioned.
Two engineers across a mid-build handover, one project manager, one QA engineer, and a part-time solution architect. The build phase was a fixed price in the low five figures in euro, with any work beyond the signed scope going through a change request at an hourly rate.
For CeolX, by not charging inside the app at all. Venues sign up, the app tells them their listing is not yet visible, and a single-use activation link arrives by email that opens Stripe Checkout. No price, URL, or checkout button appears anywhere in the app, the Stripe webhook is the only source of truth for payment status, and the activation route is kept out of the deep-link configuration so the email opens the payment page rather than the app. It clears review globally and costs no platform commission. The trade-off is that paying takes the venue a few more steps than a single tap.
Because indexed location search is a solved problem and the client has no platform engineering function. Hand-rolling it on PostGIS would have consumed build weeks and produced something we would then have to operate. The hosted index handles radius and category filtering at the response times a map needs. The map itself renders natively, Apple Maps on iOS and Google Maps on Android. Most of the testing effort went into clustering and radius edge cases.
Yes. The shape is a three-sided local marketplace: people who attend, people who perform or supply, and venues that host. Sport, comedy, food markets, and community events all have that shape. The parts that transfer directly are the map-first discovery layer, the invitation loop between supply and venues, and the external-payment subscription pattern. The parts that do not are the category taxonomy and the seasonality.
Live streaming, in-app ticket payments, offline maps, and historical event data were ruled out of version one in writing before the build started. Event boosting and paid in-app promotion were designed and deferred out of phase one on our recommendation, so venue subscriptions could ship on their own rather than waiting behind a bundle.
Define scope at screen-and-state level from day one when the decision-maker is non-technical, and run a weekly demo against the staging build. Both keep what the client expects and what is being built in the same place, and we now push for both on fixed-price builds.
Yes. The engagement is ongoing. Venue subscriptions are built and ready to turn on, starting with a small pilot group of venues, and further phases including event boosting and in-app promotion are planned but not yet confirmed by the client.
Related work
More work like this

AI phone agents automate global feedback loops through voice interviews
Text surveys only reached people comfortable filling out forms. We built a voice platform that calls anyone with a phone, runs the interview, and has the findings ready when the last call ends.

Musgrave receipt scanning software case study for SuperValu and Centra
Musgrave's post-campaign report records 1,062 users and 1,610 receipt submissions. At the reporting snapshot, 1,158 were AI approved, 409 AI rejected, 4 manually approved, 10 manually rejected, and 29 remained processing.

Brux ships a dental marketing SaaS: AI smile previews, GoHighLevel sync, and self-serve onboarding built for 1,000-office scale
Brux Smile Makeover is a dental marketing SaaS where patients upload a selfie and get a lifelike AI smile preview in seconds. We built the AI pipeline, GoHighLevel two-way CRM sync, Stripe billing, and self-serve QR flyer onboarding built for 1,000-office scale.