Availability: Taking on new projects

The internal system a charter business actually runs on

Client
Karpa Sailing
Where
Skopje, North Macedonia
When
2025 to present
Type
Own venture

The problem

A charter operation quoting, confirming and running bookings across email, spreadsheets and memory, where every step a member of staff forgot became a problem a guest discovered at the marina.

Chartering a yacht is a sequence with a lot of steps between the enquiry and the handover of the keys. Run it out of an inbox and the failures are always the same: the quote that expired without anyone noticing, the crew list that arrived incomplete, the guest who never got the marina instructions.

Quotes and reservations

  • Offers, pre-reservations and confirmed reservations as distinct states, labelled correctly everywhere a client can see them.
  • Generated PDFs in Macedonian or English, with a QR code embedded, produced without a build step or an external service.
  • Shareable public links with expiry, including one-day and three-day presets, an expire-now action, and a live date hint so nobody has to count forward in their head.
  • Expired offers archived rather than deleted, on their own admin screen, because a lost quote is a lost history.

Crew lists

The guest list started as a wide table that nobody could complete on a phone. It was rebuilt as one card per guest, which is what most people actually fill it in on, with the sections a charter genuinely needs — skipper details, arrival information, notes — and a print view in both portrait and landscape for the paperwork the marina still wants on paper.

Access control went the other way from where it started. Passwords were removed entirely and replaced with a single unguessable link. A password is one more thing to send, forget, and email in plain text; a long random URL is simpler for the guest and no weaker in practice for content of this kind.

The Charter Zone

A client portal on its own unguessable link, gathering everything a booking needs in one place: the booking details, the crew list, arrival and departure, optional extras, the payment schedule, documents and messages. The booking facts are read live from the reservation on every load, so editing the offer keeps the portal correct rather than leaving two copies to drift apart.

It has a draft state, so staff can prepare and preview a portal before the client can open it. Anything entered during preview is saved — useful when a client emails their flight details instead of using the form — but notification emails stay suppressed until the link is actually sent.

After the charter

Star ratings with written reviews and photo uploads, published through shortcodes and on the boat pages, plus a bilingual satisfaction questionnaire that is editable per charter with answers visible only to staff.

Two constraints worth naming

No Composer on the target environment, so mPDF, the QR library and their dependencies are bundled directly with a hand-written autoloader, trimmed of the fonts and language data the plugin never touches.

And a translation plugin that rewrites the page after WordPress has finished with it, which is why Macedonian words kept appearing on English crew lists. Standalone pages now clear the output buffer explicitly so they are served exactly as generated.

The outcome

A single internal WordPress plugin covering quotes, reservations, guest lists, a client portal, post-charter reviews and satisfaction surveys, now past forty feature releases and used for every booking.

Describe the symptom. I will tell you what it usually means.

Every enquiry gets a reply within one working day.