Last updated 2026-04-27
Partner portal
This page describes what your resellers / partners see at /partners/*. They reach the portal via an invite email containing a magic link — no password is set up for them.
Sign-in flow
- Partner contact receives an invite email the first time you add them as a contact (admin:
/admin/partners/<id>/contacts/new). Link valid 7 days. - They click → land at
/partners/dashboard. A 30-day session cookie is set. - After the first invite expires, they go to
/partners/login, enter their email, and a fresh 30-minute sign-in link is sent. Same flow as the customer portal.
If they can't find the invite, resend from /admin/partners/<id> → contacts table → "Resend invite."
What each role sees
The dashboard, navigation, and per-page content are gated by the contact's role. See the admin help for the full role table.
The top nav shows: Dashboard · Deals · Documents · Questions · Training. Items they can't act on are still visible read-only or hidden depending on role.
Submitting a deal (salesperson, principal)
/partners/deals/new — they fill in customer name, deal title, expected USD amount, optional close date, and free-text description. Submit creates a quote row with kind='partner_intent'. They see "Pending approval" in their portal until you decide.
Documents
/partners/documents lists every document_space marked visible to their partner_id with their role in the allowed-roles CSV. Downloads route through the same authenticated app/storage.py path that internal employees use — full audit, no separate storage backend.
Questions (technical, principal)
/partners/questions/new — submit subject + body, optionally link to a deal_id. Posts to partner_question table. Admins answer at /admin/partners/questions. Threading is single-level for v1 — one question, one answer (admin can update the answer).
Training
/partners/training lists modules where required_for_role matches their role (or is both). Each module shows their cert status:
- Not started — no passed cert exists for this contact + module.
- Certified — passed cert exists. Expiry date shown if
valid_for_dayswas set.
/partners/training/<id> shows the module description and the quiz. They submit; auto-grading writes a certification row. Pass = score ≥ module's pass_threshold (admin sets per-module, default 80%).
Footer
Every partner-portal page renders the tenant's brand (logo + primary color from company.brand_*), with a small "Powered by OtiumWork" footer link. Per-reseller white-label (where ABC Mexico shows their OWN brand instead of the tenant's) is a separate v2 build.
Limits / gotchas
- Sessions are tied to one browser. Sign-in from a new device → another magic link.
- The invite token in the URL is single-use. If they click twice, the second click hits "Link already used."
salespersonrole currently sees ALL of their partner's deals, not just deals they personally submitted. Tighter per-contact scoping is a follow-up.- Deal collisions (two partners registering the same end-customer) currently surface only at admin review time — no automatic territory rules in v1.
See something wrong or outdated in this article? Report it →