Skip to content

[Compliance / B2B] Extend centre partnership (#251/#256–258): 3-step EA-safe triage, BR org fields, COMPLIANCE_HOLD, How-it-works Partners tab #412

Closed

Description

@owlstonbusiness-svg

CEO lock — 2026-10-22 (centre detail banner now)


Summary

Extend MatchMax’s B2B education-centre track so we facilitate only genuine independent contractor engagements (“Contracts for Services” / 獨立導師外判課程服務) and systematically block/decline staff or employee recruitment requests — staying outside the Hong Kong Employment Agency (EA) licensing regime (Cap. 57).

This issue implements the legally reviewed 3-step process (Accept once → Screen before matching → Confirm once per engagement), hardens Partner Organisation onboarding, ToS acceptance, and removes employment placement terminology on matchmax.hk.

This is an extension of existing work — not a greenfield rebuild. Link and build on:


Non-goals

  • Do not add a public vacancy / jobs / “Apply to centre” board (see Issue C10 — (community feature, stage 5) Jobs, blocked #228 and Phase 2 parked issue).
  • Do not invent a second fee model. Matching money remains the 1.5-lesson admin fee (Fee Agreement / FEE_TERMS_VERSION). CEO 2026-10-21: payer = self-employed tutor (same as B2C). Parents/centres do not pay MatchMax matching fees. Strike any older “tutor is never the payer” / parent-default wording in drafts.
  • Do not create a parallel compliance_acceptance_logs table if terms_acceptances can be extended with new surfaces/columns.
  • Do not add a new app_role of organisation_rep. Use organization_members.role (e.g. owner/admin) on the existing org membership model. Keep internal code role staff; ban “staff/hire/recruit…” only in public EN/ZH copy.
  • Do not ask tutors to “waive Employment Ordinance rights.” Facts + gates only.
  • Engagement Summary must not make MatchMax a party to the Lesson Contract (ToS §§3, 5).

Where to change (exact map)

A. Vocabulary (quick wins)

Location Change
src/features/i18n/locales/en.json → howItWorks.flow_body Replace “guesswork out of hiring” with engage / find / match language
Matching ZH locale keys (with #401) Same
src/lib/tutor-application.schema.ts (~PDPO consent) “tutor recruitment and matching” → “tutor listing and matching”
Public UI / emails / meta REMOVE public use of: Hire, Recruit, Job, Vacancy, Salary, Wages, Employer, Employee, Probation, Internship, 1-Month Trial, Staff (public centre-facing only)
Preferred public terms Engage / 委聘·合作, Independent Educator / 獨立導師, Course Module·Project / 專科課程項目, Service Fee·拆帳, Partner Organisation / 合作教育機構, Subjects Taught, Achievements and Experiences

B. Partner org onboarding — Accept once

Location Change
src/lib/feature-flags.ts → CENTRE_MARKET_ENABLED Keep false until BR + authority gate ship; then enable
src/routes/_authenticated.business.join.tsx Required legal fields + authority checkbox (unticked default)
src/features/business/business.functions.ts → createOrganization Persist new columns; reject without BR + authority ack
DB organizations Add legal_entity_name, trading_name (optional), br_number, rep_name, rep_role; keep name as public/trading display
src/features/legal/terms.ts + terms_acceptances New surface e.g. centre_partnership + version centre-2026-10 (align #257)
Public page src/routes/business.$slug.tsx — never label “Employer Account”
Admin src/routes/_authenticated.admin.organizations.tsx — BR review before activate

Required fields (Gemini):

  1. legal_entity_name (String, Required) — official registered company name (e.g. XYZ Education Limited), distinct from public trading/shop name
  2. trading_name (String, Optional) — public-facing brand name
  3. br_number (String, Required) — Business Registration (BR) number or organisation identifier
  4. rep_name & rep_role (String, Required) — authorised representative full name and title
  5. verified_contact (Email & Phone, Required)

Mandatory Authority Checkbox (unticked by default):

  • [ ] I confirm that I am authorised to accept these Terms and bind [legal_entity_name].

Never label this an "Employer Account" — use Education Partner / Organisation Account.

C. Tutor independent service-provider facts

Location Change
src/features/tutor-application/ApplicationForm.tsx + tutor profile schema / DB See checklist below

Tutor profile additions:

  • operating_structure dropdown: Individual Independent Educator / Registered Sole Proprietor / Limited Company
  • br_status (Optional): record if they hold a Business Registration Certificate
  • Do you offer educational services independently to multiple clients/students? (Yes / No)
  • Will you deliver the teaching personally, or do you work with qualified substitutes/assistants? (Personal only / Qualified delegation available)

D. Unbundled electronic acceptance

Reuse TermsGateCheckbox / recordTermsAcceptance — do not pre-tick.

  • Checkbox 1 (Mandatory): [ ] I have read and agree to the MatchMax Platform Terms of Service and Privacy Collection Statement. (downloadable PDF/modal link to /tos, current TERMS_VERSION)
  • Checkbox 2 (Mandatory for Paying Party = tutor): [ ] I have read and agree to the Matching and Platform Service Fee Agreement. — must explicitly display how the 1.5-lesson admin fee is calculated, when it is earned, cancellation/refund rules, and off-platform anti-circumvention terms (FEE_TERMS_VERSION). Paying party is the self-employed tutor on B2C and [Compliance / B2B] Extend centre partnership (#251/#256–258): 3-step EA-safe triage, BR org fields, COMPLIANCE_HOLD, How-it-works Partners tab #412 B2B cases.
  • Checkbox 3 (Optional — Direct Marketing): [ ] I consent to receive updates, case alerts, and promotional communications from MatchMax. (must not block registration if left unticked)
  • Backend audit: reuse/extend terms_acceptances — store user_id, surface, terms_version, timestamp, and where missing add ip_address, legal_entity_name, and exact checkbox strings accepted (do not invent a parallel compliance_acceptance_logs table unless columns cannot fit)

Surfaces today: signup, note_upload, checkout, referral_signup, case_request — add centre_partnership (+ engagement confirm if needed).

E. Pre-matching triage — Screen before matching

Location Change
Parent src/routes/case-request.tsx + src/lib/cases.functions.ts → submitCaseRequest
Centre New/extended org case create path implementing #256 (one named student; reject tutor-pool requests)
Status enum Extend case_request_status with compliance_hold (today: new | contacted | matched | closed | rejected)
Admin lock src/routes/_authenticated.admin.cases.tsx — while compliance_hold: no tutor recommend, no circulate, no contact release
Tutor apply src/routes/_authenticated.tutor-requests.$caseCode.tsx — read-only screening summary + radio confirm / clarify→hold

Centre request form — 4-part triage (Gemini full detail)

When an Organisation Account submits a case request, enforce this form before the request enters the matching pool:

Part 1: Engagement Category (Hard Gate)
  • Question: "What is the nature of this request?"
    • Option A: Engaging an independent educator for a specific course module, exam clinic, or class series (Contract for Services)
    • Option B: Recruiting a full-time or part-time staff member / employee (Contract of Employment)
    • Option C: Arranging services on behalf of an external third-party organisation
    • Option D: Other / Unsure
  • Routing:
    • B → hard-block submission immediately. Modal: "MatchMax is an independent educator marketplace and does not provide staff or employment recruitment services."
    • C or D → set status compliance_hold for manual admin clarification before any matching
    • A → proceed to Parts 2–4
Part 2: Contracting, Payment & Financial Arrangements
  • Who directly contracts with and pays the educator? (Pre-filled with legal_entity_name; flag compliance_hold if third-party)
  • Proposed Service Fee Structure: Dropdown (Hourly Service Fee / Per-Session Service Fee / Course Revenue-Split Ratio %) + amount + checkbox Open to educator counter-proposal / negotiation
  • Who supplies the classroom premises and primary teaching equipment? (Organisation / Educator / Online / Shared)
  • Fee reminder for Ryan: MatchMax’s own charge remains the existing 1.5-lesson admin fee (Fee Agreement), not a new parallel “platform service fee” product — show both clearly where relevant
Part 3: Scope of Services, Deliverables & Non-Integration
  • Course Module / Subject / Curriculum & Target Duration: (e.g. IBDP Physics HL — 4-Week Intensive Clinic or Term 1 Weekly Series)
  • Gate: "Will the educator be required to perform reception, administrative, sales, student-discipline, or general staff-cover duties outside the agreed teaching deliverables?" (Yes / No / Unsure)
  • Gate: "Is this request replacing a staff vacancy or converting an existing/former employee into a contractor?" (Yes / No)
  • Routing: If Yes or Unsure on either → compliance_hold (do not publish to tutors or release contacts)
Part 4: Educator Autonomy & Genuine Choice
  • Who determines the specific teaching methodology and lesson delivery style? (Educator independently / Mutual alignment on syllabus goals / Strictly controlled by Centre)
  • Can the educator freely teach other clients/centres and decline future modules without penalty? (Yes / No)
  • Is qualified substitution or delegation permitted if agreed in advance? (Yes / No / Open to discussion)
  • UX: allow centres to pre-fill saved answers on repeat requests with 1-click “details remain accurate” confirmation

Parent booking form addition (B2C triage)

  • Who is engaging the tutor and who is the learner? (Myself / My child vs An organisation or third party)
  • Are any non-tutoring household, childcare, or staff duties required? (No / Yes — if Yes → compliance_hold)

Tutor factual confirmation (on Apply / Propose Terms)

Show read-only summary of Centre screening answers (contracting entity, independent service nature, zero admin/reception duties, proposed rate/split). Require one radio before submit:

  • These arrangements reflect my understanding of this independent service engagement. → proceed
  • I need to correct or clarify something about these working arrangements. → text box + set match/compliance_hold for admin review

F. Engagement summary — Confirm once per engagement

  • Automated 1-page Engagement Summary once Centre/Parent and Tutor agree to proceed — table engagement_summaries keyed to case id, displaying:
    1. Contracting Customer Legal Name (legal_entity_name or Parent Name) & Independent Educator Name (tutor_id + Legal Name)
    2. Scope of Services (Subject, curriculum, module duration, location/online format, and explicit note: No administrative, reception, or staff duties)
    3. Agreed Service Rate / Revenue Split, payment schedule, and responsible payer
    4. Applicable MatchMax 1.5-lesson matching admin fee (separately itemized; Fee Agreement)
    5. Material autonomy terms confirmed in Step 2
  • Dual-party 1-click confirmation on the exact same version before contact details / lesson commencement are finalized:

    [ ] I agree to the arrangements shown and confirm that they accurately describe the intended engagement. I will notify MatchMax of any material changes.

  • "Report Material Change" button in the active engagement dashboard — either party can log changes to duties, hours, or contracting structure (triggers re-screen / compliance_hold if duties become employment-like)
  • Must stay consistent with ToS §§3, 5, 15 (MatchMax not party to the Lesson Contract)

G. How It Works + ToS

Location Change
src/routes/how-it-works.tsx + howItWorks.* i18n Add For Education Partners (B2B) tab beside Parents & Tutors (#258)
Partner steps copy Register legal entity → Post independent course module (not staff recruitment) → Confirm Engagement Summary; parties execute their own Contract for Services & NDA off-platform as needed
src/routes/tos.tsx Update Scope (§1): technology venue for Contracts for Services; reject employment placement; hold/reject employment-like requests. Bump TERMS_VERSION and re-gate

Acceptance criteria


Out of band (CEO / Austin — not Ryan acceptance)

  1. EAA written inquiry email (ea-ee@labour.gov.hk) with 3-step workflow paper trail
  2. Incorporate MatchMax Limited (Companies Registry)
  3. Bilingual Independent Educator Service & NDA template for centres to sign directly with the educator

CEO roadmap notes (2026-10-21)


CEO / Gemini SAFE append (2026-10-21) — routes + org fields ONLY

Fee payer — CEO locked (2026-10-21)

  • Same fee model for B2C and [Compliance / B2B] Extend centre partnership (#251/#256–258): 3-step EA-safe triage, BR org fields, COMPLIANCE_HOLD, How-it-works Partners tab #412 B2B centre/partner cases: parents / centres do not pay MatchMax matching fees; the self-employed tutor pays the 1.5-lesson admin fee after the first two intros (short packages ≤5 lessons still use the existing 20% package rule; $0 Pro-Bono = 0%).
  • Reject Gemini’s “tutor ≤10% first-month” alternate B2B fee and any “tutor is never the payer” / parent-as-default-payer language inherited from old centre tickets.
  • Cap.57 posture: MatchMax does not hold an EA licence. Matching is limited to self-employed / independent-contractor tutors only — no employment, no vacancy/job board (that stays parked on #413).
  • Public + centre copy must keep engage / match / independent educator language (no “we hire tutors for you”).

Live route targets (fix redirects)

how-it-works.tsx and case-request.tsx are client redirects on the live site. Implement against real pages:

Intent Edit these (live) Do not put product UI in
Partners / How-it-works B2B tab & guide copy src/routes/guide.index.tsx, src/routes/guide.partners.tsx (and related guide i18n) src/routes/how-it-works.tsx (REDIR → /guide)
Case / partner request flow src/routes/_authenticated.tutor-requests.index.tsx (and related tutor-requests routes), src/lib/cases.functions.ts src/routes/case-request.tsx (REDIR → /tutor-requests?post=true)
Partner org join / BR fields src/routes/_authenticated.business.join.tsx (+ business.functions) N/A

Organisation fields (same form as BR)

On _authenticated.business.join.tsx (same form as BR — no second form):

  • Organisation type dropdown: Tutorial Centre / Day School / NGO
  • Optional EDB / Charity identifier fields alongside BR (not a separate intake)

Cap.57 triage, compliance_hold, Engagement Summary, and public copy rules in the body above remain in force — this append only corrects file targets and restates org-type placement.

Activity

  1. owlstonbusiness-svg commented on Oct 21, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    Related: #415 (Phase 1.5 Extracurriculars) will place a broad_category dropdown at the top of partner/B2B case forms. Cap.57 triage questions in this issue stay unchanged; Camps must not look like employment.

  2. owlstonbusiness-svg commented on Oct 21, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    Talks / schools / social impact (from #415 update):

    Partner Org onboarding should add:

    1. Org type dropdown: Tutorial Centre | Day School | NGO or Charity
    2. Identifier label: BR Number / EDB School Reg. No. / Charity IRD No. — field optional (schools often have no commercial BR)

    Speaker supply itself lives on #415 (Skill-only tutors + workshop_package + $0 Pro-Bono badge). School self-serve still blocked live while CENTRE_MARKET_ENABLED=false.

  3. owlstonbusiness-svg commented on Oct 21, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    CEO roadmap notes applied (2026-10-21)

  4. owlstonbusiness-svg commented on Oct 21, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    CEO fee lock (2026-10-21): Tutor still pays the 1.5-lesson admin on #412 centre/B2B cases (same as B2C). MatchMax does not hold EA — limit to self-employed / independent-contractor tutors only. No job board (#413 stays parked). Rejected Gemini’s ≤10% alternate B2B fee and “tutor never payer” wording.

  5. owlstonbusiness-svg commented on Oct 21, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    Cleanup: removed leftover contradicting lines that said parent/centre pays / tutor never pays. CEO lock stands — self-employed tutor pays 1.5-lesson on B2B too. B2B centre partnership + tutor-support brand (#416) unchanged.

  6. owlstonbusiness-svg commented on Oct 22, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    CEO lock — 2026-10-22 · Centre detail banner now (not parked with #413)

    Decision: Partner centres may have a LinkedIn-style background banner on the public centre detail page (/business/$slug) in the current V1 centre track — do not wait for vacancy / job board (#413, still On Hold).

    Why now: V1 already involves centres for engaging independent tutors (Cap.57-safe matching / Partner Org). Centre branding assets already exist; volume is low vs thousands of tutors; institutional trust benefit is real.

    Scope

    • Optional banner on /business/$slug detail only.
    • No banner on centre discovery cards / small list tiles (vertical space + skim).
    • Fixed aspect + crop + size limit; classroom / brand imagery preferred.
    • Same anti-circumvention rule: no phone / WhatsApp / QR / contact in banner.
    • Verified / Blue-tick centres get full brand treatment; unverified centres fall back to clean header (align Case Card B2B identity rules on [Feature / UX] Unified Case Card & Detail Page (B2C + B2B Cap.57 Safe) #423).
    • Gate behind existing Partner Org / BR flow when CENTRE_MARKET_ENABLED / org activate — not a separate product.

    Still parked

    Cross-link: tutor detail banners + cooler pills on #411; Case Card no-banner on #423.

  7. owlstonbusiness-svg commented on Oct 22, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    Cross-link #428: B2B centre/school cases stay manual for auto-ranking until Cap.57 flow is stable. Unrelated to centre detail banners (still shippable on /business/$slug).

  8. added a commit that references this issue on Oct 24, 2026
  9. owlstonbusiness-svg commented on Oct 24, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    CEO / Jarvis 2026-10-24 — centre banners stay V1-now on this issue

    Do not park centre /business/$slug banners for Shop/Community. 2026-10-22 lock stands: optional detail banner ships with Partner Org / V1 centre track; no banners on centre discovery cards; fixed crop + no contact/QR. A separate avatar + case-demographics issue excludes banners and points here for centre chrome.

  10. added a commit that references this issue on Oct 24, 2026
  11. owlstonbusiness-svg commented on Oct 24, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    Broker Overflow extends this Partner Org / Cap. 57 centre track — #442. Same org model + hard gate for agencies; no parallel /b2b rebuild.

  12. owlstonbusiness-svg commented on Oct 24, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    Follow-on: #442 — Broker Overflow + Org Referral self-serve Partners lane on top of this Partner Org / Cap. 57 track (no second org system).

  13. owlstonbusiness-svg commented on Oct 24, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    Cross-link: #443 — short ≤5 / 20% applies to centre B2B after Cap. 57 screen; tutor remains payer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    urgentGood for newcomers

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions