Skip to content
CodeHardy

Own productWe designed, built and operate it ourselves.

Popup Pal

Event software we designed, built and run ourselves, from the first trader application to the gate on show day

What it is
Web software for organisers of markets, fairs, trade shows and exhibitions: trader applications, stall invoicing, ticketing, floor plans and show-day tools.
Our role
All of it. Product, design, engineering, payments integration, operations and support.
Period
Second version of the product. The current codebase was started in July 2026 and work continues.
Status
Live at popuppal.com and in active development.
All project details
Type
Own product. Popup Pal is a trading name of CODEHARDY LTD.
What it is
Web software for organisers of markets, fairs, trade shows and exhibitions: trader applications, stall invoicing, ticketing, floor plans and show-day tools.
Our role
All of it. Product, design, engineering, payments integration, operations and support.
Platform and stack
Web only, with no native apps. One Next.js and TypeScript application on Vercel, PostgreSQL on Neon through Prisma, Stripe Connect for payments, Resend for email, Sentry for error monitoring.
Period
Second version of the product. The current codebase was started in July 2026 and work continues.
Status
Live at popuppal.com and in active development.
Popup Pal organiser dashboard showing the Applications inbox for a series called Lantern Yard Winter Markets 2026. A notice headed One application, many dates sits above tabs reading Needs a decision, Awaiting deposit, Booked, Reserve list and Closed, with Booked selected. Two trader cards, both marked Returning, each list the dates requested, with a confirmed or rejected badge on every date.
The applications inbox for a series of market dates. Demo data.
  • One application, many dates

    A trader applies once for the whole series and picks the dates they want, instead of applying event by event.

  • Tabs by stage

    The inbox is grouped into needs a decision, awaiting deposit, booked, reserve list and closed.

  • Every date gets its own outcome

    Each requested date is confirmed or rejected separately. The second card shows one date confirmed and one rejected. The notice on screen says the trader gets a single email covering every date.

The problem

Organisers of markets, fairs, trade shows and exhibitions run their trader admin across forms, email, spreadsheets and bank transfers. General ticketing platforms sell the visitor tickets but usually leave out the trader side: applications, stall fees, documents and pitch allocation.

We built Popup Pal to put that work into one organiser workflow, from opening applications to show day. It is our own product. We decide what goes into it, design it, build it, run it and answer the support requests.

Two constraints shaped the build. Organisers keep the commercial relationship, so card payments for tickets and stalls go directly to the organiser's own Stripe account and Popup Pal never holds event money. Buyers should not need an account or an app to buy a ticket, and staff should not need an app or hired hardware to scan one. So buyers check out as guests, and signed-in staff scan from a phone browser.

Who owned what

What CodeHardy was responsible for

  • Product decisions, pricing and the documentation.
  • Interface design for the organiser dashboard, the trader workspace and the public event, checkout and order pages.
  • All engineering: one Next.js application, the PostgreSQL schema, scheduled jobs and the test suite.
  • The Stripe Connect integration: connecting organisers' accounts, direct charges, application fees, refunds and webhooks.
  • Hosting, deployments, error monitoring, and separate staging and production environments.
  • Organiser support, and the internal admin tools used to provide it.
  • The move from the first version of Popup Pal, including redirects from its old URLs.

What organisers and payment providers own

  • Organisers are the seller of record for their tickets and stalls. They set prices, refund policy and entry rules.
  • Organisers decide which traders to accept, what each stall costs and which pitch each trader gets.
  • Organisers hold their own Stripe account. Card payments for tickets and stalls land there, and their data can be exported.
  • Stripe processes the card payments and pays out to the organiser.

What made it hard

What we built

Trader applications and documents

Organisers build an application form with their own questions, conditional questions and file uploads. Traders can save a draft and come back to it. Applications land in one inbox, existing applications can be imported from CSV, and returning traders are flagged. Organisers review certificates and insurance documents, and reminders go out before a document expires.

A dialog titled Accept Stone & Stem Pottery, open over the list of applications. It has a stall category menu set to Craft stall (3m) at £45.00, an optional internal notes field and a button labelled Accept & provision stall. Behind it, the trader's application answers are partly visible, including that they hold public liability insurance.
Accepting an application. Frame from a product demo recording. Demo data.
  • The decision sets the price

    Accepting a trader means choosing a stall category, here a 3 metre craft stall at £45.00.

  • The invoice follows from the decision

    The helper text says a stall is provisioned in this category and a fee invoice is sent when it is not free.

  • Answers stay with the application

    The trader's answers to the organiser's own questions sit on the application card, including whether they hold public liability insurance.

Stall offers, invoices and payments

Accepting a trader assigns a stall category and price. An offer can convert on a fixed or percentage deposit, with the balance invoiced automatically and unpaid invoices chased. Each numbered invoice has its own secure pay link. Card payments go to the organiser's Stripe account, cash and bank transfers can be recorded by hand, and Popup Pal takes no percentage of stall fees.

A public invoice page for invoice PP-INV-000007, Summer Makers Market 2026, marked issued. It shows a stall fee of £45.00 due 20 July 2026 for Stone & Stem Pottery, issued by Demo Makers Markets, a Pay £45.00 button and the line Secure card payment by Stripe.
The pay link a trader receives for a stall invoice. Frame from a product demo recording. Demo data.
  • The link is the credential

    Each numbered invoice has its own pay link, authorised by a 256-bit random token in the URL. The page has no sign-in step.

  • Issued by the organiser

    The invoice names the organiser as the issuer. The card payment is a direct charge on the organiser's connected Stripe account.

  • Card payment by Stripe

    The page states that card payment is handled by Stripe. Popup Pal takes no percentage of stall fees.

Ticketing with guest checkout

Each ticket type carries its own price, capacity, per-order limit and sale window. Organisers can add checkout questions, add-ons, discount codes and waitlists. Buyers never create an account. The link in their confirmation email opens their order, where they can show QR tickets, add the event to a calendar, forward a ticket or request a refund.

Floor plans and show day in a phone browser

A drag-and-drop editor lays out pitches, walls, doors and labels, starts from layout presets, and produces a print and share view for the setup crew. On the day, ticket scanning, door sales and trader check-in run in a phone browser. There is no native app and no scanner hardware. Entry rules can be single entry, once per day or re-entry, and door sales record cash, card and complimentary tickets.

The floor plan editor for Summer Makers Market 2026. A toolbar offers Pitch, Wall, Door and Label tools and three layout presets named Empty hall, Market rows and Perimeter. The canvas shows rows of pitches labelled A1 to A9 and B1 to B9. Pitch A4 is selected, and a side panel shows its position, width, height and label.
The floor plan editor with one pitch selected. Frame from a product demo recording. Demo data.
  • Tools and layout presets

    Pitches, walls, doors and labels are added from the toolbar. Empty hall, Market rows and Perimeter give a starting layout.

  • Print and share view

    The plan has a print and share view. The notice on screen says it is for the setup crew on the morning of the event. Unsaved changes are flagged next to the save button.

  • Traders are assigned to pitches

    The selected pitch, A4, shows the start of the assigned trader's name under its label. Its position and size are edited in the panel on the right.

The Scan tab at phone width. A notice headed Any phone is a scanner sits above a count of 12 admitted and 44 remaining, broken down by ticket type. Below, an amber panel reads ALREADY SCANNED with the ticket holder's name, ticket type, ticket serial and the line Already scanned 21:43:47.
The ticket scanning screen at phone width, refusing a ticket that was already scanned. Frame from a product demo recording. Demo data.
  • Any phone with a camera

    Scanning runs in the phone's browser. There is no app to install and no scanner to hire, and several staff can scan at the same time.

  • Counts by ticket type

    Admitted and remaining totals are shown for the event and for each ticket type.

  • A second scan is refused

    The server checks the signed QR code and records the admission inside a database transaction that locks the ticket, so two phones scanning the same code cannot both admit it.

The trader directory at phone width. A notice headed Your trader directory explains check-in and the payment badges. The first card shows The Sourdough Project on pitch A1 with badges reading claimed, Checked in 6 Jul 2026 21:44 and Paid, and buttons for Message, Invoice, No-show and Cancel. The next card, Wren & Willow Prints on pitch A4, has a Check in button.
The trader check-in screen at phone width. Frame from a product demo recording. Demo data.
  • Checked in, with a time

    Each trader is checked in as they arrive, against the pitch they were given on the floor plan. A trader who does not arrive can be marked as a no-show.

  • Payment status on the same card

    The notice at the top explains the badges. Payment due means the invoice is issued but unpaid. Paid means the stall fee has settled to the organiser's Stripe account.

Operating it

The same application serves the marketing site, the documentation and an internal admin area for support, moderation, refunds, feature flags and the audit log. The interface is available in English, Spanish, French and German, in light and dark themes. Ten scheduled jobs cover work such as reminders, expiring unpaid orders, invoice chasing and fee receipts. Error monitoring reports errors only. Each report is rebuilt from an allowlist of fields, and emails, URLs and long tokens are scrubbed from messages before anything is sent. The accessibility target is WCAG 2.2 AA. That is a target we build to, not an audited result.

Decisions

Check it yourself

Need something like this?

Tell us about your project. We reply within one working day.