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

  1. 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.
  2. They click → land at /partners/dashboard. A 30-day session cookie is set.
  3. 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_days was 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."
  • salesperson role 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 →