- You must enable 2FA to use online card payments.
+ Two-factor authentication adds an extra verification step to your account.
{/if}
@@ -3491,8 +3550,8 @@
diff --git a/frontend/src/routes/cancellation-policy/+page.svelte b/frontend/src/routes/cancellation-policy/+page.svelte
index 64d8105..d6f9043 100644
--- a/frontend/src/routes/cancellation-policy/+page.svelte
+++ b/frontend/src/routes/cancellation-policy/+page.svelte
@@ -100,6 +100,13 @@
If the slot has not yet been claimed by another client, paying your outstanding deposit will
instantly restore your booking to a fully confirmed status.
+
+ If your booking is evicted, you are refunded in full. If another customer books
+ the overlapping time and pays while your booking is in "Pending Release", your booking is evicted
+ and every payment you made toward it is refunded to you (the slot was lost through no fault of
+ yours, so no cancellation fee applies). This refund follows the same refund-method rules in Section
+ 3 below.
+
@@ -123,19 +130,23 @@
-
Notice between 24 and 72 hours
+
+ Notice between 24 and 72 hours (including exactly 24 or 72 hours)
+
Any booking payments made up to 50% of the total booking value are treated as a
Protected Deposit. This Protected Deposit is retained to cover the short-notice vacancy,
- while any balance paid above 50% will be fully refunded.
+ while any balance paid above 50% will be fully refunded. The protected deposit is capped
+ at 50% of the booking total AND at what you actually paid — so if you only paid a
+ 20% deposit, no more than that is ever retained.
Notice of less than 24 hours
- All booking payments and deposits are entirely non-refundable and will be retained. The
- cancellation will be logged as a missed appointment history strike.
+ All booking payments and deposits are retained (no refund). The cancellation will be
+ logged as a missed appointment history strike.
@@ -224,10 +235,9 @@
Each completed booking with a payment reduces the required deposit count by one. Once the
- count reaches zero, all prior no-show records within the 6-month window are forgiven and
- your account returns to normal — no upfront deposits required — until a new no-show occurs.
- The salon can also forgive individual no-shows at management's discretion, which immediately
- removes them from the count.
+ count reaches zero, your account returns to normal — no upfront deposits required — until a
+ new no-show occurs. The salon can also forgive individual no-shows at management's
+ discretion, which immediately removes them from the count.
@@ -257,8 +267,12 @@
Where a partly-used card is cancelled, the card is cancelled automatically when the refund
- is issued, so the remaining balance cannot then be spent. See our Gift Card Terms for the
- full position.
+ is issued, so the remaining balance cannot then be spent. See our
+ Gift Card Terms
+ for the full position.
If you believe your statutory consumer rights have not been met, you can get free, impartial
diff --git a/frontend/src/routes/gdpr/+page.svelte b/frontend/src/routes/gdpr/+page.svelte
index e039d87..820c176 100644
--- a/frontend/src/routes/gdpr/+page.svelte
+++ b/frontend/src/routes/gdpr/+page.svelte
@@ -159,12 +159,9 @@
status: string;
created_at: string;
}>;
- verification_codes?: Array<{
- purpose: string;
- created_at: string;
- used_at?: string;
- expires_at: string;
- }>;
+ // verification codes are excluded from the export (they are authentication
+ // tokens, not personal data), so there is deliberately no verification_codes
+ // key and no card for it below.
forgiven_no_shows?: Array<{
id: string;
booking_id: string;
@@ -1412,41 +1409,9 @@
-
- {#if gdprData.verification_codes && gdprData.verification_codes.length > 0}
-
- Verification Codes
-
-
-
- | Purpose | Created | Used At | Expires |
-
- {#each gdprData.verification_codes as vc (vc.purpose + vc.created_at)}
-
- | {vc.purpose.replace(/_/g, ' ')} |
- {fmtDate(vc.created_at)} |
- {vc.used_at ? fmtDate(vc.used_at) : '—'} |
- {fmtDate(vc.expires_at)} |
-
- {/each}
-
-
-
-
-
- {/if}
+
{#if gdprData.forgiven_no_shows && gdprData.forgiven_no_shows.length > 0}
diff --git a/frontend/src/routes/privacy-policy/+page.svelte b/frontend/src/routes/privacy-policy/+page.svelte
index 8504a33..1116192 100644
--- a/frontend/src/routes/privacy-policy/+page.svelte
+++ b/frontend/src/routes/privacy-policy/+page.svelte
@@ -43,11 +43,6 @@
Privacy Policy
-
- DRAFT — for review
-
Last updated: August 2026
@@ -77,6 +72,13 @@
Edinburgh, Scotland
Email: {'{{SUPPORT_EMAIL}}'}
+
ICO registration (operator responsibility)
+
+ As a data controller, the salon must register with the Information Commissioner's Office
+ (ICO) and pay the data-protection fee unless an exemption applies. This is the operator's
+ responsibility — nothing in the Platform registers the business. See the ICO website
+ (ico.org.uk) for the fee and exemptions.
+
@@ -84,6 +86,33 @@
2. Data We Collect
+ Lawful Bases at a Glance
+
+ We only process personal data where UK GDPR gives us a lawful basis. The main bases we rely
+ on:
+
+
+ -
+ Contract performance (Article 6(1)(b)) — holding and managing your booking,
+ taking and refunding payments, and saving your card at your request.
+
+ -
+ Legal obligation (Article 6(1)(c)) — keeping financial and tax records
+ for 7 years (HMRC), and holding health-and-safety records for insurance.
+
+ -
+ Legitimate interest (Article 6(1)(f)) — running the salon safely and
+ efficiently, preventing fraud (including rate limiting and account lockouts), and defending
+ against claims. We weigh these interests against your rights before relying on them.
+
+ -
+ Consent (Article 6(1)(a)) — marketing preferences and explicit consent
+ for health data (Article 9(2)(a)) only. Card payment authorisation is not consent-based: the
+ SCA check on saved-card payments is carried out under contract performance and our legitimate
+ interest in fraud prevention (see §2.4).
+
+
+
2.1 Personal Data (Identifiable Information)
@@ -204,6 +233,43 @@
to you if your account is deleted, and allergy/access information held in your treatment notes
is retained de-identified (see §3.1).
+
+
+ 2.4 Secure Card Authorisation (SCA Only)
+
+
+ Online card payments, including saved-card payments, are authorised exclusively through your
+ bank’s in-app approval step (Strong Customer Authentication, SCA / 3-D Secure),
+ carried out by Square PSD2 SCA. When you pay online, your bank may ask you to approve the
+ payment in your banking app. No saved-card payment is taken without this bank-level
+ authentication.
+
+
+ If your bank cannot complete the SCA step, the payment cannot be processed and is refused.
+ For online payments, this means the relevant deposit, early payment or gift-card purchase
+ does not go through. If you are paying in person at the salon and your bank cannot complete
+ SCA, we may ask you to pay online later instead.
+
+
+ Lawful basis: the SCA check is carried out under contract performance (Article
+ 6(1)(b)) and our legitimate interest in fraud prevention (Article 6(1)(f)). No consent-based processing
+ is used for card authorisation.
+
+
+
+ 2.5 Request Snapshots (Payment Replay Records)
+
+
+ To rescue a payment that is stuck in a pending state, the Platform stores the exact payment
+ request for replay. In sandbox/production deployments these snapshots are encrypted at rest
+ (AES-256-GCM) under a deployment-provided key (SNAPSHOT_ENC_KEY).
+
+
+ Deployment requirement: if the key is not set, snapshots are stored in
+ plaintext at rest (a startup warning is logged). The operator must set
+ SNAPSHOT_ENC_KEY before go-live so buyer email and card-token data in these records
+ is encrypted.
+
@@ -255,6 +321,27 @@
7 years |
Insurance requirement |
+
+ | Guest booking PII |
+ 6 months after the appointment, then anonymized |
+ GDPR storage limitation |
+
+
+ | Gift cards |
+
+ 24-month rolling expiry (from last use) for the card; account balances do not expire
+ |
+ Consumer-protection fairness; rolling-expiry terms |
+
+
+ | Card-authorisation records |
+ None stored. Card payments are authorised by your bank's secure-authentication step
+ (see §2.4); we do not record any separate consent or authorisation records for
+ a card payment. |
+ N/A |
+
| Treatment & safety notes (incl. allergy/access information) |
To exercise these rights, contact {'{{SUPPORT_EMAIL}}'}. You also have the right to complain
- to the Information Commissioner’s Office (ICO) at any time.
+ to the Information Commissioner’s Office (ICO) at any time — via the ICO website
+ (ico.org.uk) or by writing to the ICO, Wycliffe House, Water Lane, Wilmslow, Cheshire SK9
+ 5AF. If you have concerns, we would ask you to contact us first so we can try to resolve
+ them.
Questions about how we handle your data? Please use our official
diff --git a/frontend/src/routes/terms/+page.svelte b/frontend/src/routes/terms/+page.svelte
index 7cb216c..0357811 100644
--- a/frontend/src/routes/terms/+page.svelte
+++ b/frontend/src/routes/terms/+page.svelte
@@ -43,13 +43,8 @@
Terms & Conditions
-
- DRAFT — for review
-
-
Last updated: June 2026
+
Last updated: August 2026
{#if format === 'pdf' && pdfNotice}
@@ -194,6 +189,20 @@
- Card payments are processed securely via Square.
- We do not store full card details.
+ -
+ Strong Customer Authentication (SCA / 3-D Secure): online card payments, including
+ saved-card payments, are authenticated by Square PSD2 SCA. Your bank may ask you to approve
+ the payment in your banking app. If your bank cannot complete the secure authentication, the
+ payment cannot be processed: for online payments the relevant deposit, early payment or gift-card
+ purchase does not go through. If you are paying in person at the salon and your bank cannot
+ complete SCA, we may ask you to pay online later instead.
+
+ -
+ Chargebacks: if you dispute a payment with your card issuer, we will respond
+ with the booking and payment records we hold and, where the payment was SCA-authenticated, the
+ authentication evidence. We comply with the card-scheme dispute process and may be required
+ to refund a disputed payment if the scheme decides against us.
+
-
Refunds are returned to the original payment method where possible:
@@ -270,12 +279,99 @@
balance, no additional VAT is charged (it has already been paid).
- Right to cancel: if you buy a gift card online, you can cancel the purchase within
- 14 days for a refund to the original payment method. If the card has been partly used on salon
- services, only the unspent balance is refunded and the card is then cancelled. A card that has
- been redeemed to an account balance or fully spent cannot be cancelled. See our Gift Card Terms
+ Right to cancel: if you buy a gift card online, you can cancel the purchase
+ within 14 days for a refund to the original payment method. If the card has been partly used
+ on salon services, only the unspent balance is refunded and the card is then cancelled. A
+ card that has been redeemed to an account balance or fully spent cannot be cancelled. See
+ our
+ Gift Card Terms
for the full position.
+
+ Non-refundable except where the law requires: except for the 14-day right
+ to cancel online purchases above, and except as required by consumer law or by an express
+ refund we offer under our cancellation policy, gift cards and gift-card balances are
+ non-refundable — they are not redeemable for cash and cannot be exchanged
+ for money. Where consumer law gives you a right of refund, that right is unaffected.
+
+
+
+
+ 6. Liability
+
+ -
+ Nothing in these Terms excludes or limits any rights you have under consumer law —
+ including your statutory rights under the Consumer Rights Act 2015 that services are
+ provided with reasonable care and skill and match their description.
+
+ -
+ We are not liable for losses that were not a foreseeable consequence of a breach of these
+ Terms, or for losses caused by events outside our reasonable control.
+
+ -
+ To the fullest extent permitted by law, our total liability arising out of or in
+ connection with these Terms is limited to the total amount you have paid us for the
+ service concerned.
+
+ -
+ We are not liable for the acts or omissions of third parties we rely on to provide the
+ Platform (for example our payment processor), except as required by law.
+
+
+
+
+
+ 7. Acceptable Use
+ By using the Platform you agree not to:
+
+ -
+ Use the Platform for any unlawful purpose, or in a way that infringes anyone else’s
+ rights.
+
+ -
+ Attempt to access another user’s account, or to interfere with the operation of the
+ Platform.
+
+ -
+ Misuse the booking system (for example by repeatedly reserving slots with no intention of
+ completing a booking, or by booking under false details).
+
+ - Use the Platform to send spam, offensive content, or content that misleads others.
+
+
+ We may suspend or refuse service where we reasonably believe these rules are being breached,
+ while respecting your legal rights.
+
+
+
+
+
+ 8. Complaints & Dispute Resolution
+
+
+ If you are unhappy with any part of our service, please contact us first at
+ {'{{SUPPORT_EMAIL}}'} — we will do our best to resolve your complaint fairly. You can get
+ free, impartial consumer advice from
+ consumeradvice.scot, and you can escalate a complaint to your local Trading Standards office. Claims up to
+ £5,000 can be pursued through the Scottish courts’ Simple Procedure.
+
+
+
+
+ 9. Governing Law
+
+ These Terms are governed by the laws of Scotland. Any dispute arising out
+ of or in connection with these Terms is subject to the exclusive jurisdiction of the
+ Scottish courts. Nothing in this clause limits your statutory rights as a consumer.
+