Skip to main content

Self-guided tour access codes plug-in

Install this plugin and import your codes. We'll send them to every booking for you.

Written by Jerome Bajou

If your tour runs through an app, every customer needs a code to start it. Buying a batch from your app provider and then pasting them into emails one at a time is the kind of job that goes wrong quietly: two customers get the same code, somebody arrives at the trailhead with nothing, and you find out from them rather than from us.

Upload the batch once. Captainbook hands one code to each customer when their booking is confirmed, puts it in their confirmation email and on their ticket, and keeps a record of which code went to whom.

⏱️ Time needed: about 10 minutes to set up, once.
✅ Requires: Extended or above (included Legacy). Managing codes then needs the Update booking permission.
⚠️ A code that has reached a customer is never reissued to anybody else, even if the booking is cancelled. That is deliberate: once it has been emailed, it is compromised.


Setting it up

  1. Plugins → Self-Guided Tours → Install. This creates the access-code field on your bookings, already set to appear in the customer’s confirmation email and on their ticket, and an empty pool to put codes in.

  2. Open the pool. The card on the plugin page has a Manage codes button once there is a pool to manage. You can also reach it from Settings → Custom attributes, on the row’s menu.

  3. Upload your codes. See below.

  4. Confirm a test booking. The code should be in the confirmation email.

That is the whole setup. There is nothing to configure per booking.


Uploading codes

Click Upload codes and pick a file with one code per line. A .csv or .txt file both work; a single-column spreadsheet export is fine, including one with quotes or a trailing comma on each line.

Nothing is written until you confirm. The preview tells you how many codes it found and lists anything it refused, with the line number:

Why a line was refused

What to do

Not readable text

Save the file as UTF-8 and upload it again.

Too long to be a code

Over 120 characters. Usually a pasted sentence or a mangled column rather than a code.

Starts with a spreadsheet formula character

A line beginning =, +, - or @. Almost always a corrupted export.

Appears more than once in this file

Remove the duplicate.

Already uploaded

That code is already in one of your pools. Codes have to be unique across your whole account.

Past the limit for one upload

Over 20,000 codes. Split the file and upload it in parts.

An upload is all-or-nothing. If a single line is refused, nothing is added. This sounds stricter than it needs to be and it is the kinder behaviour: partial acceptance means the corrected file still contains the codes that went in, so uploading it again is refused as duplicates, and you are left reconciling by hand. Fix the file, upload the whole thing.

Blank lines are ignored, so a trailing newline is not an error.


What the customer sees

The code is issued when the booking is confirmed — not when it is made. An unpaid reservation has no code yet, because it may never become a booking.

From then on it travels with every customer-facing message, in a labelled section alongside the rest of their booking details:

  • The confirmation email.

  • The reminder email before the tour. This is the one that saves you support calls — a customer who has lost the confirmation gets the code again without asking.

  • The reschedule email, if they move the booking.

  • Their ticket PDF.

Two exceptions, both normal:

  • Products set to Manifest redemption get no ticket PDF at all, so for those the emails are the only place the code appears.

  • It is deliberately not shown at checkout. The code does not exist until payment completes, so there would be nothing to show.

The “booking received” email you get when a reservation is made is an operator email and does not carry the code, for the same reason.

You can change where the code appears in Settings → Custom attributes, on the access-code field. Be careful with the customer email: switching that off means your customers stop receiving codes entirely, and every booking after it is listed under Bookings without a code with that as the reason.


Which experiences issue codes

By default, every experience issues codes from your pool. That is usually what you want with one pool and one app.

To narrow it, open a product and find the Access codes panel. Switching it on for the first experience is the moment to pay attention, because it does two things at once: that experience starts issuing codes, and every other experience stops. The screen warns you before it happens and asks you to confirm — you can keep all experiences or restrict to just this one.

The reverse is blocked: you cannot switch off the last remaining experience from the product page, because an empty list means “every experience” to the system, so removing the last one would switch codes back on everywhere rather than off. Do that from the pool screen instead, where the wording can explain it.


Keeping an eye on stock

The pool screen leads with Codes ready to issue. That is the number that matters: codes that are available and not past any expiry date.

You are emailed when the pool runs dry. The alert goes to whoever uploaded the last batch — they are the person who can fix it — and it is sent once each time the pool empties, not once per booking. It says plainly that new bookings are being confirmed without a code until more are uploaded.

Bookings are never refused for want of a code. A booking confirms, the customer is emailed, and the code is simply missing from that email. We decided that holding up somebody’s booking is worse than following up with a code. It does mean the alert is load-bearing: a customer could arrive without a code if nobody acts on it.


Bookings without a code

Any booking that should have had a code and did not is listed under Bookings without a code on the pool screen, with the reason and what to do about it:

Reason

What it means

No codes were available

The pool was empty. Upload more, then issue them from here.

This experience is not covered by any code pool

The pool has been narrowed to other experiences.

The access code attribute is not set to show in the customer email

Someone has turned that off in Settings → Custom attributes.

No access code attribute is set up for this business unit

On a franchise account, this unit has no field set up.

Install the Self-Guided Tours app

The plugin was uninstalled.

We could not check just now

A temporary failure. It usually resolves on its own.

Once you have uploaded more codes, Issue codes to everyone waiting fills them in and emails the customers. It handles up to 100 bookings at a time; press it again if there are more. With an empty pool the button is not offered, because it would have nothing to issue.


Fixing one booking

Three things you will need sooner or later:

A customer says their code does not work. Find it in the codes list and use Replace. The old code is retired, a fresh one is drawn, and you tell the customer the new one. The old one is never returned to the pool.

You have a code from your provider over the phone. Type it straight into the access-code field on the booking. Captainbook records who entered it and takes that code out of the pool so it cannot also be drawn for somebody else. If the code is already with another customer it is refused rather than quietly duplicated.

A code was never used. Delete it from the codes list. This only works for codes that have not been issued; a code that has gone to a customer can be replaced but not deleted.

Every one of these is recorded against the code, so the export below shows what happened.


When a booking changes

What happens

What happens to the code

Rescheduled, same experience and still valid

The same code moves with the booking. The customer keeps the one they have.

Rescheduled to an experience on a different pool

The old code is retired and a new one is drawn from the right pool.

Rescheduled to a date the code does not cover

Same: retired, and a fresh one drawn.

Rescheduled to an experience with no pool

The old code is retired and nothing is issued. The new experience needs no code.

Cancelled

The code is retired. It is never given to anybody else.

A retired code is shown as Used up. It is a one-way state, which is also why uncancelling a booking is safe — the code was never handed to a second customer in the meantime.


Export

Export produces a CSV of every code in the pool: its status, the booking, customer, experience and tour date it went to, when it was issued and when it reached the customer. It is prepared in the background and arrives as a download link in your notifications, titled “Your access codes export is ready”.

This is the file to reach for when your app provider’s records and yours disagree.

⚠️ Treat the export like a password list. Every row is a working credential next to a customer name. Export files are not deleted automatically.


Archiving a pool

Archive pool takes a pool off this screen when you have finished with it — a supplier change, or a season that is over.

Codes already with customers keep working. But be aware of what archiving actually does to the screen: the pool, its code history and the Export button all leave with it, and there is currently no way to bring an archived pool back from the interface. If you might still need the history or the export, take the export first.


Who can do what

Managing codes needs the Update booking permission, and you have to be in the same business unit as the pool.

That is a wider group than you may expect — anyone who can edit a booking can see your unused codes in full and export them next to customer names. If you need to restrict that further, talk to us; it needs a change on our side rather than a setting you can change yourself.


What each plan includes

Access codes are delivered as a plugin, so what gates them is whether your plan includes Plugins at all. There is no separate limit on codes, pools, uploads or exports: if you can install it, everything in this article works the same.

Starter

Extended

Ultra

Corporate

Legacy

Install the Self-Guided Tours plugin

—

✅

✅

✅

✅

Everything else in this article

—

✅

✅

✅

✅


Things worth knowing

Codes have to be unique across your whole account, not just within one pool. If you buy overlapping batches from two providers, the second upload will tell you which lines collide.

Expiry dates are honoured but cannot yet be set. The system will not issue a code that is past its expiry, and the codes list has an Expires column — but there is no way to put a date on a code from the interface at the moment. Every code you upload is treated as not expiring. If your provider issues codes with an expiry, let us know; it is on our list.

One code per booking, not per traveller. A booking for four people gets one code, the same way one booking gets one voucher.

Nothing happens for bookings that already exist. Codes are issued at the moment a booking is confirmed, so installing the plugin does not go back and fill in bookings confirmed before that — and they will not appear under Bookings without a code either. That list is built from bookings that went through the issuing step and came out without a code; a booking confirmed before the plugin existed never went through it at all.

For those, type the code into the access-code field on each booking by hand. If you have more than a handful, tell us — a one-off backfill is something we can run for you.

Did this answer your question?