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
- Navigate to Partners → Resellers in the sidebar (admin only).
- Click + New partner. Set name, default commission %, territory notes. W-9 status is for US 1099 tracking.
- 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 |
- 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
kindtoquote, the row enters your normal quote → invoice flow withpartner_idand the chosen commission rate locked in. Partner sees status change in their portal. - Reject → stays as
partner_intentwithstatus='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.
- Partners → Training → + New module. Set kind (sales/technical/both), required-for-role, pass threshold (default 80%), valid-for-days (default 365 = annual).
- 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} ]} - Partners see required modules on their dashboard + at
/partners/training. They take the quiz; on pass, acertificationrow is written withexpires_at = completed_at + valid_for_days. - 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:
- Edit a document space (under
/documents/spaces). - Set Visible to partner (drop-down with your active partners) and Visible roles (CSV like
principal,salespersonfor marketing/pricing,principal,technicalfor engineering docs, orall). - Partners see allowed spaces at
/partners/documentsand download via the sameapp/storage.pypath 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: eitherpartner_contact_idORemployee_idset (CHECK constraint). Same framework will be reused for internal-employee certifications in v2.sale.partner_id+sale.partner_commission_rate— partner attribution + override ofpartner.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 →