Zeil Help Center
Admin guide

Courses & the sailing school

Run a sailing school on Zeil — build courses, schedule sessions, manage enrollments, and grant certifications on completion.

If your club teaches, Zeil's sailing school lets you publish a public course schedule, take registrations, and award certifications when a student finishes. You'll find it under Admin → School → Courses.

Create and publish a course, add an on-water session that books the boat, and mark a student complete.

Enabling the school

The School section only appears once the sailing-school feature is enabled for your club. Turn it on under Admin → Settings → Sailing school — it's off by default. See Club settings.

The season board

Admin → Courses opens the season board — one card with everything the school is running. Under the header (which counts your published courses and drafts) sits "The season at a glance": a month strip with one bar per dated published course and a Today marker, so you can see how the coming classes overlap before you open any of them.

Below the strip, each course is a row: its status pill (draft, published, or archived), its title, and a line with its date range and session count — a draft shows its enrollment mode and seat count there instead. Published rows also carry a seat meter (seats taken of capacity, or just the enrolled count on an uncapped course), an amber "N to review" pill when registrations are waiting on your decision, the course's instructors, and a duplicate button (see Running the same class again). Drafts sort to the top — they're the ones still being worked on — with the published season below.

By default the board is filtered to Upcoming — courses that aren't archived and haven't already ended. Switch to Past to find one that has already ended, Archived for archived courses, or All to see every course regardless of status or dates. If your club has certifications set up, a second row of chips below lets you narrow to courses that grant a specific certification, or to Uncertified courses. A combined course that grants several appears under each one of them.

Building a course

New course, in the board's header, opens an inline composer: give the course a title, optionally its start and end dates and the certifications it awards (the composer previews the public link as you type), and Create draft puts it on the board as a draft — private until you publish it. Open the draft to fill in the rest with the course form. Each course has:

  • Title and an optional URL slug — the slug is the public link (/courses/<slug>); leave it blank to generate one from the title.
  • Summary (one line on the schedule) and a longer description.
  • StatusDraft, Published, or Archived. Only published courses appear publicly and take registrations; drafts stay private while you build them.
  • EnrollmentOpen (students enroll instantly) or Approval required (requests wait for your decision).
  • Members only — keep the course off the public schedule. Only your active club members and admins can see it and register — handy for something like a club racing clinic. It's missing from the catalog for everyone else, and to signed-in students its page comes up "not found" — as if it didn't exist. A signed-out visitor who opens the course link instead sees a sign-in prompt, with no title or other course details — so a member you share the link with can sign in and land right back on the course. Members see it flagged "Members only" on the schedule and the course page.
  • Require mailing address — ask each registrant for a postal address, for courses whose documents you mail. It's on by default; turn it off for a course that ships nothing (a members-only clinic, say) and registration skips the address entirely.
  • Voucher code — show an optional voucher-code field on the registration form, for courses run through an external voucher or discount program. It's off by default. Turn it on and registrants can type in whatever code they were given; Zeil doesn't check it against anything, it's just captured for you to see on the roster.
  • Capacity — the maximum number of students. Leave it blank for unlimited.
  • Start and end dates. Once the start date passes (or the course ends), the course drops off the public schedule and members' Open for registration list automatically — though its page stays reachable at its direct link. A course with no dates stays listed as long as it's published.
  • Certifications granted — tick every certification this course can award. Combined classes that cover more than one (say ASA 101 and 103 together) tick several; you choose which of them each student actually earned when you mark them complete. What you tick also shows on the public schedule ("Awards ASA 101 Basic Keelboat") and gives prospective students a chip to filter the schedule by — those chips only appear once the courses open for registration award more than one kind between them. See Certifications & endorsements.

Publishing announces the course

The first time a course goes Published, Zeil announces it to your active members in their next daily digest email (they can opt out via the New course announcements preference). A members-only course is announced only to members and admins — students aren't told about it. Anyone who already holds every certification the course awards is left out, since they have nothing to earn from it — a combined class still reaches members holding only some of them, and a course that awards none announces to everyone. A lapsed certification doesn't count as held, so the member due to re-qualify still hears about the class that re-awards it. People whose first contact with the club is a course registration are asked on that form whether you may email them about new classes and announcements — those who left the box unticked aren't included here, or in your announcement emails. Moving it back to draft and re-publishing won't re-announce it.

Opening a course

Opening a course lands on its manage view — because day to day the job is running the class, not re-editing its settings. The roster card sits at the top as the centerpiece: the class's stats, every registration, and the message and walk-in registration controls (see Managing enrollments). Below it comes a short summary card: the status pill, any flags the course carries (Members only, Collects address, Voucher field), the summary line, and a facts line with its dates, capacity ("Up to N students", or "Unlimited seats"), enrollment mode, and the certifications it awards. A published course also links straight to its public page. Then come the panels for sessions, materials, and instructors.

To change any of those settings, use Edit details on the summary card. That opens the same form you created the course with; ← Done editing — back to managing takes you back.

A draft opens with the form already showing below the roster card — a draft is still being set up, which is exactly when the form is the point.

A published course's page has a Share button in the header, next to its title. It hands out the course's public registration link — the full club address (yourclub.zeilapp.com/courses/<slug>), so it works wherever you paste it. On a phone it opens the share sheet, straight into WhatsApp or your email; on desktop it copies the link and the button reads Copied.

Share only appears once the course is Published — a draft or archived course's link doesn't open for anyone, so there's nothing to hand out yet. On a members-only course the link still works for the people who should have it: a signed-out member who opens it gets a sign-in prompt and lands back on the course, while everyone else sees "not found".

Sessions

Add the sessions that make up the course. Each is either:

  • Classroom — with an optional location (e.g. "Clubhouse classroom").
  • On water — which can optionally be tied to a boat.

On-water sessions book the boat

Picking a boat for an on-water session books it on the club calendar for that session's time, so it can't be double-booked for a regular sail. Members see it as a hatched Course block marking the boat unavailable — not as a sail they can open or join. If the slot's already taken, Zeil won't save the session — pick another time or boat. Deleting the session frees the boat again.

Editing a session

To change a session, use the pencil icon next to it — the form fills in with its current details, and the button becomes Save session (with a Cancel to back out). The boat booking follows your edit automatically:

  • Adding a boat to a session books it for the session's time.
  • Removing the boat — or switching the session back to Classroomfrees it on the calendar.
  • Moving a booked session's time, or swapping its boat, moves the same booking rather than cancelling and re-creating it.

If the new time or boat clashes with an existing reservation, the edit is rejected with the usual "already booked" message and the session keeps its previous details.

Enrolled students get a session reminder (in-app and email) shortly before each session, and instructors get one with the roster attached. Rescheduling an upcoming session sends enrolled students an in-app notification that it moved; deleting an upcoming session tells them it was cancelled.

The month calendar

Per-course session lists don't show where the school's schedule collides. The calendar icon in the Admin → Courses header opens a month grid of every session across every course — drafts and archived courses included — so you can spot the evening that already has two classes on it before you schedule a third.

Each session is a chip showing its start time and course title, tinted by kind: lavender for classroom, sage for on the water. Hovering a chip shows the full details — course, session title, start and end times, and location — and clicking it opens that course's admin page. Under the grid sit the tint legend and the number of sessions in the month; List view in the header takes you back to the courses list.

Use the arrows either side of the month name to step through months, and Back to this month to return. Today's cell is highlighted. Dates and times follow your club's timezone, not your device's. On a phone the grid scrolls sideways rather than squeezing.

Materials

Attach materials to a course — a link, a file URL, or a note. Each material has a visibility:

  • Public — shown on the public course page to anyone.
  • Enrolled students — visible only to students enrolled in the course.

Adding a material notifies enrolled students that there's something new to read — in-app right away, plus a line in the next daily digest email for those subscribed to Course updates.

Instructors

Assign club members as instructors on a course. Their names appear on the public course page. An assigned instructor gets an in-app notification right away (plus a line in their next daily digest email) with the current student count, and is told when a student joins or withdraws from the roster — including when you move one between classes.

Once the course is published, its instructors also get their own class-day view — reached from a Teaching card at the top of My courses — showing the day's session and the boat roster, with a tap-per-head roll call. See Teaching a course in the member guide.

Registration waiver

You can require students to acknowledge a waiver when they register. Write and publish it under Admin → Waivers — once published, the course page shows it above the register button and students must tick a box to accept it before registering. If you never publish one, registration requires no acknowledgement. See Waivers.

Managing enrollments

The roster card at the top of the course page is where you handle registrations. Three tiles sum the class up at a glance: Seats (taken of capacity — a pending request holds its seat), Paid (how many fees are settled, and how many are still outstanding), and To review (registrations waiting on your decision — or a reassuring All reviewed). Under them, every registration is a row with the student's name, contact details, mailing address, fee status, and enrollment status:

  • Pending requests (on approval-required courses) are highlighted and show an Approve button and a decline () button. A pending request holds a seat against the capacity until you decide. Either decision emails the student the outcome.
  • Enrolled students show a Complete button, a Move button (to shift them to another class), plus the option to remove (withdraw) them. Removing asks first: a confirmation names the student and the class, because it frees their seat and tells them they're off the roster — and putting them back means registering them again. Keep enrolled backs out and changes nothing.

Each student's phone number is a link you can tap to dial — the roster doubles as the class contact sheet when you need to reach one student directly. (To tell the whole class something at once, use Message class instead.) Everyone signing up now provides a number, so it's only missing for students whose accounts predate that, and those rows show a dash instead.

On a course that requires a mailing address, each student's address appears in its own column — registration collects one so you can post course documents (certificates, workbooks), and the roster is where you grab it for the envelope. Students who registered before addresses were collected are flagged "None on file — docs are mailed". On a course that doesn't require one, the roster skips that flag, though an address already on file still shows.

On a course with voucher code turned on, a student who entered one shows "Voucher <code>" under their phone number. The field is always optional, so students who left it blank show nothing.

Tracking who's paid

Zeil doesn't take course payments itself yet, but the roster keeps the books: every active registration has a Paid toggle, starting Unpaid. Once a student's fee is settled outside Zeil — cash at the desk, a bank transfer, a voucher — tap it to flip the row to Paid (tap again to undo). The Paid tile above the roster counts settled fees against the students money is expected from, and calls out how many are still outstanding; withdrawn and declined students drop out of that count. It's bookkeeping for your eyes only: toggling it sends nothing, and students never see it.

Hear about registrations right away

Admins receive a New student registrations email — sent the moment a student registers themselves for any course, saying whether the request is waiting on your approval or the seat was confirmed automatically. (A student an admin adds from the roster doesn't send one.) It's on by default; opt out under Profile → Preferences. See Notifications.

Registering a student yourself

A signup taken over the phone or at the desk doesn't have to go through the public course page. Register a student — the roster's last row — opens a short form: their name, email, and phone, plus a mailing address if this course mails documents, and a voucher code if this course collects one (still optional). Fill it in and they're on the roster straight away.

  • If that email already has a Zeil account, Zeil uses it. What you type only fills in blanks — the person's own name, phone, or address already on file wins over what you enter.
  • If it doesn't, an account is created for them. Nothing to send: they sign in whenever they like with the usual email sign-in link.
  • Anyone who isn't in your club yet joins it as a student. Someone already on your roster keeps the role they have — registering a member or an admin for a course doesn't turn them into a student.
  • They're enrolled immediately, even on an approval-required course — you're the approver, so there's nothing left to decide.
  • They get the same confirmation email and in-app notification a self-registration sends, and the course's instructors get the same notification they'd get for any new student. No New student registrations email goes out for it, to you or your fellow admins — it's already on the roster in front of you.

If the course is full, if that student is already registered, if the course is archived, or if that email belongs to an account that's been deleted, Zeil refuses and tells you which.

No waiver is signed this way

A student you register by hand acknowledges no waiver — an admin can't agree to legal text on someone else's behalf. If your club requires a course waiver, keep collecting it on paper for these signups, exactly as you did before this form existed. See Waivers.

Completing a student

Marking a student Complete does three things:

Asks which certifications they earned

If the course grants any, Complete first shows a checklist of them, all ticked. Leave it as-is for a student who passed everything. For a combined course where they only passed part of it, untick the ones they didn't earn — those simply aren't awarded, and the student is still marked complete. You can grant a missing one later under Admin → Certifications → Grant certifications once they've passed it.

Grants what you ticked

Zeil awards those certifications to the student right away, noting the course they came from. Re-completing the same student won't grant them twice.

Notifies the student

The student gets an in-app notification and an email that they've completed the course — and, if any certifications were awarded, the email lists them and doubles as the record that they've been added to their profile.

Moving a student to another class

When a student can't make the class they signed up for — "I can't do June, put me in August" — you don't have to withdraw them and walk them through registering all over again. On any enrolled row, Move opens a picker of every other class that isn't archived — drafts and classes that have already started included. Classes that grant the same certifications as this one sort to the top, labelled "· similar"; anything else is still offered, since you know why you're moving someone. The button only appears once there's at least one other class to move to.

Pick the class and press Move student:

  • The student is seated on the new class first, then taken off this one — their row here becomes withdrawn.
  • They don't register again: the details on their profile (phone number, mailing address) carry straight over.
  • A voucher code belongs to the registration it was typed on, so it stays with the old row rather than following them — the new class's roster shows none for them. Note it down from the withdrawn row if you still need it.
  • Because they never see a registration form, no new waiver acknowledgement is collected for the new class — the signature they gave when they first registered moves with them, still showing the original version and signing time. A student with no signature on file (say the waiver was published after they registered) is moved without one — collect it on paper if you need it. See Waivers.
  • They get an in-app notification that they've been moved, plus the new class's registration confirmation email — its dates and a link through to the course page, where the session times live.
  • Even if the new class is approval required, they land enrolled rather than pending — your move is the approval.
  • Both classes' instructors are told, the way they are for any roster change: the new class gains a student, this one loses one. Admins also get the usual New student registrations email for the new class.

If the class you picked is full, or the student is already registered for it, the move is refused with that message and their enrollment here is left exactly as it was.

Messaging the class

Message class, at the top of the roster card, sends one note to everyone currently enrolled — "bring wet-weather gear on Saturday", "the classroom moved" — instead of emailing students one at a time off the roster. Press it, type your note (up to 2,000 characters), and press Send to N students. The compose box closes again with "Message sent to the class."

Every enrolled student gets an in-app notification headed with your name and the course, linking to the course page. Students who accept Course updates emails also get it by email straight away — the same preference that carries session reminders and cancellations, since this is class logistics rather than club news.

Only enrolled students are messaged — pending requests, withdrawn students, and students you've already marked complete are left out. On a course with nobody enrolled the button is disabled.

Announcement or class message?

A class message goes only to the students on one course's roster. For something the whole club should see, post an announcement instead.

The student roster

Admin → School → Students lists everyone in your club with the student role — the people who joined by registering for a course — in one place, with their contact details and course history. It appears alongside Courses once the sailing school is enabled, and the count at the top tells you how many students the club has.

Each row shows:

  • Name and email — the email stands in for the name if they haven't set one. A membership that isn't active (pending, suspended, or inactive) is flagged with a status pill; active ones aren't, since that's the norm.
  • Phone — tap or click to dial. An em dash (—) means there's no number on file.
  • Courses — one pill per registration, coloured by its status (enrolled, completed, pending, withdrawn, declined) and newest first. Choose one to jump straight to that course. Students who haven't registered for anything yet show No enrollments.
  • Joined — the date they joined the club, in your club's timezone.

Members and admins who register for a course don't appear here — their role stays as it is, so they stay on the regular member roster. See Members & roles.

Embedding the schedule on your website

The public course schedule (/courses) can also live inside your club's own website, framed with a standard iframe — handy when registration should feel part of your marketing site. Embedding is blocked by default: add your website's domain to the course embed allowlist under Admin → Settings and the frame starts rendering — no change needed on your site. See Club settings.

The page also accepts query parameters that pre-apply the catalog's filters, so one site can frame several narrowed views — a "Get your ASA 101" page that shows only the courses awarding that certification, for example:

  • ?cert= narrows to courses awarding one certification, matched case-insensitively against the certification's short code (or its full name): /courses?cert=ASA101. Use ?cert=none for clinics — courses that award no certification.
  • ?month= narrows to courses running in a given month, written as YYYY-MM: /courses?month=2027-06.

A certification — or ?cert=none — with no matching course currently open for registration shows the "no matches" empty state rather than falling back to the full list, so a framed page never advertises the wrong classes. Values that don't match anything — a typo, a deleted certification — are ignored and the full schedule renders. Visitors can still change the filters by hand; the parameters only choose the starting view.

Running the same class again

Any course doubles as a template for the next time you run it. Open the course and use Duplicate as new class, at the bottom of the page — Zeil copies the blueprint into a fresh draft and drops you straight into its form to rename, schedule, and publish. Unlike Delete, it's there on the manage view as well as the settings form, since duplicating spins off a new course rather than touching this one. Each row on the season board also carries a duplicate button that does the same thing without leaving the list — the new draft appears at the top of the board, ready to open when you are.

What comes across is everything that describes the class itself:

  • Its summary and description.
  • Enrollment mode, members only, require mailing address, voucher code, and capacity.
  • The certifications it grants.
  • All its materials — both public ones and those for enrolled students.

What doesn't is everything tied to a specific run: start and end dates, sessions, instructors, and enrollments. The copy starts with an empty schedule and an empty roster, and the original course is left untouched.

The copy's title gets a "(copy)" suffix and its slug a -copy ending — duplicate the same course again and the slug counts up (-copy-2, -copy-3, …) — so rename both before publishing. Because it's a draft, nothing is public and no one is notified until you publish it — at which point it's announced like any other new course.

Deleting a course

Delete course sits at the bottom of the course's settings form — open the course and use Edit details to get to it (on a draft, you're already there). Deleting a course also removes its sessions, materials, and enrollments.

Boat bookings are not freed

Deleting a whole course does not cancel the reservations its on-water sessions booked — those boats stay blocked on the calendar. Delete the on-water sessions one by one first (which does free their boats), then delete the course.

If you just want to take a course off the public schedule, set it to Draft or Archived instead.

On this page