Repository navigation
[Compliance / B2B] Extend centre partnership (#251/#256–258): 3-step EA-safe triage, BR org fields, COMPLIANCE_HOLD, How-it-works Partners tab #412
Description
CEO lock — 2026-10-22 (centre detail banner now)
- Optional banner on
/business/$slugdetail only — ship with V1 Partner Org / centre track (centres already engage tutors; do not wait for [PARKED · Cap.57] Partner storefront SaaS + vacancy ad board — blocked pending solicitor/EAA; storefront-only slice under D1/D3 #413). - No banner on centre discovery cards.
- Fixed crop + no contact/QR; verified centres get brand treatment.
Full checklist: comment [Compliance / B2B] Extend centre partnership (#251/#256–258): 3-step EA-safe triage, BR org fields, COMPLIANCE_HOLD, How-it-works Partners tab #412 (comment)
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:
- Epic Epic: Fee, centre cases, operations & shop (F/O/D + centre C) #251 (Fee, centre cases, operations & shop)
- # Issue C1 — Centre student case #256 C1 — Centre student case
- # Issue C2 — Partnership and what the centre agrees #257 C2 — Partnership and what the centre agrees (
centre-2026-10) - # Issue C3 — Centre block on the guide #258 C3 — Centre block on the guide
- Terms of Service updates #214 / # Issue F2 — Form, terms, and privacy for the fee #253 — Terms gates + matching-fee acceptance (foundation already shipped)
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_logstable ifterms_acceptancescan be extended with new surfaces/columns. - Do not add a new
app_roleoforganisation_rep. Useorganization_members.role(e.g. owner/admin) on the existing org membership model. Keep internal code rolestaff; 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):
legal_entity_name(String, Required) — official registered company name (e.g. XYZ Education Limited), distinct from public trading/shop nametrading_name(String, Optional) — public-facing brand namebr_number(String, Required) — Business Registration (BR) number or organisation identifierrep_name&rep_role(String, Required) — authorised representative full name and titleverified_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_structuredropdown: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, currentTERMS_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— storeuser_id, surface,terms_version,timestamp, and where missing addip_address,legal_entity_name, and exact checkbox strings accepted (do not invent a parallelcompliance_acceptance_logstable 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
- Option A:
- 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_holdfor 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; flagcompliance_holdif third-party) - Proposed Service Fee Structure: Dropdown (
Hourly Service Fee/Per-Session Service Fee/Course Revenue-Split Ratio %) + amount + checkboxOpen 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 ClinicorTerm 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
YesorUnsureon 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 childvsAn 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.→ proceedI need to correct or clarify something about these working arrangements.→ text box + set match/compliance_holdfor admin review
F. Engagement summary — Confirm once per engagement
- Automated 1-page Engagement Summary once Centre/Parent and Tutor agree to proceed — table
engagement_summarieskeyed to case id, displaying:- Contracting Customer Legal Name (
legal_entity_nameor Parent Name) & Independent Educator Name (tutor_id+ Legal Name) - Scope of Services (Subject, curriculum, module duration, location/online format, and explicit note: No administrative, reception, or staff duties)
- Agreed Service Rate / Revenue Split, payment schedule, and responsible payer
- Applicable MatchMax 1.5-lesson matching admin fee (separately itemized; Fee Agreement)
- Material autonomy terms confirmed in Step 2
- Contracting Customer Legal Name (
- 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_holdif 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
- Organisation type dropdown (Tutorial Centre / Day School / NGO) and optional EDB/Charity identifier live on the same form as BR fields.
- Org join collects legal entity, BR, rep, verified contact + unticked authority checkbox; partnership acceptance stored with version
centre-2026-10 - Employment/staff category cannot submit; admin/reception or vacancy-replacement Yes/Unsure →
compliance_holdwith contact lock - Parent form has lightweight triage; Yes to non-tutoring duties →
compliance_hold - Tutor apply shows screening summary + confirm / clarify→hold
- Dual-party Engagement Summary confirm before contact release / lesson start
- Public copy: no hire/recruit/job/vacancy/employer framing; How It Works has Partners tab; “hiring” removed from
flow_body; PDPO consent no longer says “recruitment” - Fee UX still 1.5-lesson admin fee paid by self-employed tutor (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); do not default to centre/parent as MatchMax payer
-
CENTRE_MARKET_ENABLEDonly flipped after BR + gates above - No vacancy / apply-to-centre UI anywhere in this issue
- Supersedes/implements the product intent of # Issue C1 — Centre student case #256–# Issue C3 — Centre block on the guide #258 under epic Epic: Fee, centre cases, operations & shop (F/O/D + centre C) #251 (leave those issues cross-linked; close only when criteria here are met or explicitly absorbed)
Out of band (CEO / Austin — not Ryan acceptance)
- EAA written inquiry email (
ea-ee@labour.gov.hk) with 3-step workflow paper trail - Incorporate MatchMax Limited (Companies Registry)
- Bilingual Independent Educator Service & NDA template for centres to sign directly with the educator
CEO roadmap notes (2026-10-21)
- Ship after Feature: Dual-Language Custom Headline + Core Academic Breakdown Restructure #411; before / with [Feature · V1] Extracurriculars — hybrid tags, portfolio, ecosystem #415.
- Supersedes # Issue C1 — Centre student case #256, # Issue C2 — Partnership and what the centre agrees #257, # Issue C3 — Centre block on the guide #258 — close those tickets as not planned once this issue absorbs their intent (already reflected in acceptance above).
- Organisation type + optional EDB/Charity ID must live on the same Partner Org form as BR fields (no second form).
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;
$0Pro-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
owlstonbusiness-svg commentedon Oct 21, 2026
Related: #415 (Phase 1.5 Extracurriculars) will place a
broad_categorydropdown at the top of partner/B2B case forms. Cap.57 triage questions in this issue stay unchanged; Camps must not look like employment.owlstonbusiness-svg commentedon Oct 21, 2026
Talks / schools / social impact (from #415 update):
Partner Org onboarding should add:
Tutorial Centre|Day School|NGO or CharityBR 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+$0Pro-Bono badge). School self-serve still blocked live whileCENTRE_MARKET_ENABLED=false.owlstonbusiness-svg commentedon Oct 21, 2026
CEO roadmap notes applied (2026-10-21)
owlstonbusiness-svg commentedon Oct 21, 2026
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.
owlstonbusiness-svg commentedon Oct 21, 2026
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.
owlstonbusiness-svg commentedon Oct 22, 2026
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
/business/$slugdetail only.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.
owlstonbusiness-svg commentedon Oct 22, 2026
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).Merge pull request #433 from keyframesfound/urgent-fixes-423-401-397-412
owlstonbusiness-svg commentedon Oct 24, 2026
CEO / Jarvis 2026-10-24 — centre banners stay V1-now on this issue
Do not park centre
/business/$slugbanners 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.Merge pull request #435 from keyframesfound/issue-412-centre-partnership
owlstonbusiness-svg commentedon Oct 24, 2026
Broker Overflow extends this Partner Org / Cap. 57 centre track — #442. Same org model + hard gate for agencies; no parallel
/b2brebuild.owlstonbusiness-svg commentedon Oct 24, 2026
Follow-on: #442 — Broker Overflow + Org Referral self-serve Partners lane on top of this Partner Org / Cap. 57 track (no second org system).
owlstonbusiness-svg commentedon Oct 24, 2026
Cross-link: #443 — short ≤5 / 20% applies to centre B2B after Cap. 57 screen; tutor remains payer.