Skip to content

Sessionfold documentation

Overview and requirements

Sessionfold is self-hosted coaching practice software: bookings, sessions and a private portal for every client. It is built for independent coaches and small practices (career, executive, wellness, tutoring) and centres on ongoing client relationships: programs and packages, private and shared session notes, goals with check-ins, action items, files and invoices.

What it does

  • Coaches: weekly hours, time off, buffers, a time zone and a default video link for each coach.
  • Services and programs: single sessions, packages and multi-session programs with an outline and an optional deposit.
  • Public booking page: service, coach and week picker, the visitor's time zone, intake questions, consent, payment and a confirmation with a calendar file.
  • Double-booking protection: an overlap check plus a unique claim for each 5-minute block.
  • Client portal: email sign-in links, upcoming sessions with the video link and calendar files, cancellation, shared notes, goals with check-ins, action items, files, invoices and payment.
  • Notes: private, shared and stakeholder/360 notes. Private notes never appear in the portal. Coaches see only their own clients.
  • Payments: Stripe Checkout, PayPal Orders and Razorpay Payment Links with your own keys; webhooks are signature-checked and processed once per event.
  • Reminders and reports: email reminders with calendar files; revenue and utilisation reports with CSV export.
  • Look and feel: dark mode in the admin, reduced-motion support, and a portal style setting (Sessionfold default, or plain with your own accent colour).

Requirements

  • PHP 8.3 or 8.4 with pdo_mysql, mbstring, openssl, intl, fileinfo, tokenizer, curl, bcmath and sodium
  • MySQL 8+ or MariaDB 10.6+ (SQLite for evaluation only)
  • Writable storage/ and bootstrap/cache/
  • One cron entry (every minute)

The zip includes production vendor/ and every font, icon and admin asset. Composer, Node and an internet connection are not needed to install.

Installation

Web installer (cPanel)

  1. Create a MySQL database and user (cPanel → MySQL Databases).
  2. Upload the zip and extract it. You get a sessionfold/ folder.
  3. Point the domain or subdomain document root at sessionfold/public/.
  4. Open https://your-domain/. The first visit is sent to /install?token=… (a one-time install token, valid for 1 hour; only its hash is stored).
  5. The installer checks the server, tests the database, writes .env, runs migrations, asks for the practice time zone and currency (USD by default) and creates the admin account. Tick "Load demo data" to explore with fictional coaches and clients.
  6. The licence key is optional at this step and the installer works offline.
  7. Add the cron entry (every minute):
* * * * * cd /home/USER/sessionfold && php artisan schedule:run >> /dev/null 2>&1

It sends reminders, drains the database queue and runs the daily licence check.

Command line

cp .env.example .env    # set the DB_* values first
php artisan sessionfold:install --name="Your Name" --email=you@example.com --password='change-me' \
  --business="Your Practice" --timezone=America/New_York [--license=AUCIP-XXXXX-XXXXX-XXXXX-XXXXX] [--domain=coaching.example.com] [--demo]

Reopening the installer

Run php artisan sessionfold:install-token and open the /install?token=… link it prints. Without a valid token, /install answers 403 while a token is pending, 503 if no token was issued and the site isn't installed, and 404 once the site is installed. It never touches .env.

Updating

Back up the database and .env, upload the new zip over the old files (keep .env and storage/), then run php artisan migrate --force.

Installation is a paid add-on.

Configuration

Settings (Admin → Settings)

  • Practice: business name, currency, minimum notice and how far ahead clients can book.

  • Booking: intake questions shown on the booking form.

  • Portal style: Sessionfold (linen header with blush accents) or Plain (white header, your accent colour). A custom accent must reach at least 4.5:1 contrast against white.

  • Payments: Stripe, PayPal and Razorpay keys from your own accounts. The webhook URLs are shown on the page:

    • /api/webhooks/stripe (checkout.session.completed)
    • /api/webhooks/paypal (PAYMENT.CAPTURE.COMPLETED)
    • /api/webhooks/razorpay (payment_link.paid)

    An invoice is marked paid only when the amount and currency match.

Coaches (Admin → Coaches)

Set each coach's time zone, weekly hours, time off, buffers before and after sessions, and a default video link (any URL: Zoom, Google Meet, Jitsi or your own).

Mail

Set the MAIL_* values in .env. Reminders and sign-in links are sent through the queue, which the cron entry drains.

Demo mode

DEMO=true in .env makes deletes, account and role changes, settings and licence actions read-only, drops outgoing mail, and resets the data every 6 hours (php artisan sessionfold:demo-reset).

Usage

Roles

  • Admin: everything.
  • Coach: their own clients, sessions, notes and goals.
  • Client: the portal only.

Daily work

  1. Dashboard: today's sessions with a join link, what's coming up, and unpaid invoices.
  2. Sessions: status, video link and topic for each session. Times are stored in UTC and shown in each person's time zone.
  3. Session notes: notes are private by default. Only notes marked "Shared with client" appear in the portal. Stakeholder/360 notes stay with the coach.
  4. Goals: progress per goal, with check-ins from the client portal.
  5. Invoices: deposits and balances for packages and programs; clients pay from the portal.
  6. Reports: revenue, paid and outstanding invoices, sessions, no-shows and utilisation per coach for a date range, with CSV export.

Clients

Share /book with clients. They pick a service, a coach and a time in their own time zone, answer the intake questions and pay any deposit. They sign in at /portal with an emailed link to see upcoming sessions, add them to their calendar, cancel, read shared notes, check in on goals, tick off action items, download files and pay invoices.

Licence FAQ

Which licence do I need?

  • Regular licence: use in one end product that end users are not charged for. Free updates while licensed and 6 months of support (renewable).
  • Extended licence: use in one end product that end users are charged for (for example a paid SaaS or paid membership). Free updates while licensed and 6 months of support (renewable).

One licence = one end product. Free local installs (localhost/.test) plus up to 3 staging installs on staging subdomains per licence; staging doesn't count against your production domain. Each additional end product needs another licence.

Support is through Aucip tickets, typically within 1–2 business days.

Is installation included?

Installation is a paid add-on.

What does Sessionfold send to aucip.com?

Only licence and update checks are sent to aucip.com. A check carries the key, product, domain, a random install id, a random nonce, the version and production/staging. No client data and no telemetry. Every answer is signed and checked against a key built into the code.

How are updates delivered?

Update packages are checksum-verified before install. The update answer must carry a signed SHA-256 checksum and an https download link on aucip.com, otherwise it is refused. Admin → Licence shows the link and the SHA-256 next to it; compare it with sha256sum on the downloaded zip before you upload it.

What counts as staging?

Staging is decided by the host name only. Common patterns: staging.*, dev.*, test.*, uat.*, preview.*, and tunnels such as ngrok. The full list as found in the code:

Type Patterns
Staging subdomains staging.*, stage.*, dev.*, test.*, uat.*, preview.*, *-staging.*, *.staging.*
Host staging domains *.wpengine.com, *.wpenginepowered.com, *.kinsta.cloud, *.cloudwaysapps.com, *.pantheonsite.io
Tunnels (always staging) *.ngrok.io, *.ngrok-free.app, *.ngrok.app, *.loca.lt, *.trycloudflare.com, *.expose.dev, *.sharedwithexpose.com, *.serveo.net

Local hosts (localhost, *.test, *.local, 127.0.0.1 and private IPs) are free, need no key and make no licence calls.

What if I already have 3 staging installs?

aucip.com refuses the fourth with a clear message. Deactivate one from its own Settings → Licence page, or from your aucip.com account, then try again. As an aucip.com server rule, a tunnel seat that has not been used for 7 days expires and frees the slot; this is decided on aucip.com, not in the script.

What happens if the licence can't be verified?

After the 14-day grace period (counted only from dates signed by aucip.com), admin settings and updates lock. The booking page, client portal, payments and reminders keep working.

Changelog

1.0.0

First release.

  • Coaches with weekly hours, time off, buffers, time zones and a default video link.
  • Single sessions, packages and multi-session programs with outlines and optional deposits.
  • Public booking: service, coach and week picker, visitor time zone, intake questions, consent, payment, confirmation with calendar file.
  • Double-booking protection (overlap check plus a unique claim per 5-minute block).
  • Client portal with email sign-in links: upcoming sessions, video link, calendar files, cancellation, shared notes, goals with check-ins, action items, files, invoices and payment.
  • Private, shared and stakeholder/360 notes. Coaches see only their own clients.
  • Stripe Checkout, PayPal Orders and Razorpay Payment Links with your own keys; signed, de-duplicated webhooks.
  • Email reminders with calendar files; revenue and utilisation reports with CSV export.
  • Web and CLI installers that work offline, demo mode with automatic reset, dark mode and reduced-motion support.