Last updated 2026-04-27

Partners / resellers (admin)

OtiumWork supports external resellers that sell on behalf of your company — distinct from your internal sales team and from your customers. They get their own portal with role-gated views, submit deals for approval, see commission accruals, take certifications, and ask technical questions.

To use this feature, an admin must enable the Partner portal module on the company at /admin/modules. New tenants default OFF.

Adding a partner

  1. Navigate to Partners → Resellers in the sidebar (admin only).
  2. Click + New partner. Set name, default commission %, territory notes. W-9 status is for US 1099 tracking.
  3. After save, you're on the partner detail page. Add contacts (one row per person at the partner who needs portal access). Each contact gets a role:
Role Sees Can do
principal Everything for this partner Manages other contacts, signs reseller agreement, all of the below
salesperson Own deals, sales/marketing/competitive collateral, price lists Submits deal intents, uploads POs, sees own commission accruals
technical All this partner's deals (no $), engineering docs, own certs Uploads technical questions, takes certifications, attaches files
finance All deals + commissions + payouts + price lists (read-only) Downloads payout reports
viewer Dashboard, deal status (read-only) Nothing else
  1. Each new contact gets an invite email (link valid 7 days) sent automatically. They click to access the portal — no password needed; sessions last 30 days.

Deal intents

When a partner contact submits a deal via /partners/deals/new, it lands as a quote.kind='partner_intent' row in Partners → Deal intents. Review queue lets you:

  • Approve → flips kind to quote, the row enters your normal quote → invoice flow with partner_id and the chosen commission rate locked in. Partner sees status change in their portal.
  • Reject → stays as partner_intent with status='rejected'. Add a note (visible to partner).

All decisions log to audit_log. No bypass: every deal goes through admin review before it can become a sellable quote.

Q&A inbox

Technical role contacts can submit pre-sales technical questions at /partners/questions/new. Optionally tied to a specific deal. Admins (or any role at your tenant with admin access) respond at Partners → Questions. Mark as answered to keep open for follow-up, or check Close when fully resolved.

Training & certifications

Modules + auto-graded quizzes — annual re-certification supported.

  1. Partners → Training → + New module. Set kind (sales/technical/both), required-for-role, pass threshold (default 80%), valid-for-days (default 365 = annual).
  2. Quiz JSON uses this structure: json {"questions": [ {"q": "What's our standard discount cap?", "choices": ["5%","10%","15%","20%"], "correct_idx": 1}, {"q": "...", "choices": [...], "correct_idx": 0} ]}
  3. Partners see required modules on their dashboard + at /partners/training. They take the quiz; on pass, a certification row is written with expires_at = completed_at + valid_for_days.
  4. Failed attempts don't break anything — partners can re-take immediately.

Document sharing

Partner contacts can see documents in any document_space marked partner-visible:

  1. Edit a document space (under /documents/spaces).
  2. Set Visible to partner (drop-down with your active partners) and Visible roles (CSV like principal,salesperson for marketing/pricing, principal,technical for engineering docs, or all).
  3. Partners see allowed spaces at /partners/documents and download via the same app/storage.py path internal users use. Same audit log.

Schema reference

  • partner — one row per reseller organization.
  • partner_contact — multiple per partner, with role.
  • partner_session — magic-link sessions, 30-day idle expiry.
  • partner_question — Q&A inbox, optionally deal-linked.
  • training_module — module + quiz JSON + pass threshold + validity.
  • certification — polymorphic: either partner_contact_id OR employee_id set (CHECK constraint). Same framework will be reused for internal-employee certifications in v2.
  • sale.partner_id + sale.partner_commission_rate — partner attribution + override of partner.default_commission_pct.
  • sale.po_document_id — PO uploaded by partner, attached to the sale.
  • quote.kind (quote | partner_intent) + quote.partner_id + quote.partner_intent_* — partner-submitted deal-intent state.
  • document_space.partner_visible_to_id + document_space.partner_role_visibility — role-gated visibility.
  • company.module_partner_portal_enabled — per-tenant feature flag.

Sequencing & limits (v1)

What's NOT implemented yet (revisit when needed): - PO upload UI on individual deals — column exists, no upload form yet. - Cert expiry banners with date math — dashboard shows certs but doesn't compute "expires in N days" client-side. - Multi-currency partner commissions. - Tiered commission structures. - Territory exclusivity / hard collision blocking on deal intents. - Partner-driven sub-resellers. - 1099 threshold automation (we track w9_status only — actual 1099 generation lives in QuickBooks). - API access for partners (no Salesforce-to-OtiumWork sync). - Internal-employee certification (schema is ready; UI not wired).

For migration off Salesforce: enable the partner portal module → add ABC Mexico (or whoever) as a partner → invite their principal contact → they invite their team or you do → done. Salesforce seats can come down once they've used the portal for a real deal cycle.


See something wrong or outdated in this article? Report it →