-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
1994 lines (1994 loc) · 150 KB
/
Copy pathindex.html
File metadata and controls
1994 lines (1994 loc) · 150 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Recast Partner Program – Branded Preview</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
<script src="https://unpkg.com/lucide@latest"></script>
</head>
<body class="bg-[#f9fafb] text-[#111827] font-['Inter',sans-serif] min-h-screen antialiased">
<header class="relative overflow-hidden">
<div aria-hidden="true" class="pointer-events-none absolute inset-0 blur-3xl"
style="background:
radial-gradient(60% 60% at 20% 10%, rgba(37,99,235,0.18) 0%, transparent 70%),
radial-gradient(60% 60% at 80% 0%, rgba(37,99,235,0.18) 0%, transparent 70%),
radial-gradient(80% 80% at 50% 90%, rgba(37,99,235,0.1) 0%, transparent 70%)">
</div>
<div class="relative mx-auto max-w-7xl px-6 lg:px-12 pt-10 pb-8">
<div class="flex items-center justify-between">
<div class="inline-flex items-center gap-2 rounded-full border border-[#E2E8F0] bg-white px-3 py-1 text-xs text-gray-600">
<span class="inline-block h-1.5 w-1.5 rounded-full bg-[#2563eb]" aria-hidden="true"></span>
<span class="sr-only">Recast Partner Program</span>
</div>
</div>
<h1 class="mt-4 text-3xl font-semibold leading-tight sm:text-4xl">
<span class="text-transparent bg-clip-text"
style="background-image: linear-gradient(90deg, #2563eb, #1d4ed8);">Recast Partner Program</span>
</h1>
<p class="mt-2 max-w-3xl text-gray-700 leading-relaxed">
We put <span class="text-[#2563eb] font-semibold">partnership</span> at the center of how we go to market.
</p>
</div>
</header>
<main class="relative mx-auto max-w-7xl px-6 lg:px-12 pb-20">
<div id="app"></div>
</main>
<script>
const STATE = {
partnerType: 'Program Overview',
commitment: 'Annual',
dealType: 'Net New',
newPartner: false,
activeTab: 'overview',
showBusinessPlanModal: false,
showEvaluationModal: false,
showPartnerEventsModal: false,
showCsvModal: false,
showLeadsGuideModal: false,
showPartnersHelpModal: false,
showInternalROEPopout: false,
showPartnerCommPopout: false,
showDealRegModal: false,
activeStep: 0,
tier: 'tier1',
activeTier: 'tier1',
defaultTierByType: { Registered:'tier3', 'Value/Preferred':'tier2', 'Strategic/Premier':'tier1' },
partnerTierMeta: {
'Registered': {
defaultTier: 'tier3',
marginCap: '5%',
coSellEligible: false,
fullCycleEligible: false,
},
'Value/Preferred': {
defaultTier: 'tier2',
marginCap: '15%',
coSellEligible: true,
fullCycleEligible: true,
},
'Strategic/Premier': {
defaultTier: 'tier1',
marginCap: '25%',
coSellEligible: true,
fullCycleEligible: true,
},
},
showMspOption: false,
simpleROE: {
Registered: {
summary: "You can refer and transact. Margin capped at 5% for transactional or referral sales only.",
sourcing: [
{label:"Partner Sourced", value:"You found the opp + registered it → Up to 5% if approved."},
{label:"Transactional/Referral", value:"Intro or PO only → Referral margin."}
],
bands: [
{band:"Tier 3 – Transactional", when:["Intro only or PO processing"], rule:"Default for LAR/Referral"}
],
renewals:[
"Renewal margin is discretionary, capped at 5%, and applies only if the LAR manages the renewal process.",
],
roePrinciples: [
{principle:"Deal Registration", description:"Required only when Recast requests it for transactional tracking.", intent:"Maintain visibility into reseller-led renewals and SKUs."},
{principle:"Partner of Record", description:"Applies on approved transactions only; expires automatically at renewal unless partner remains active.", intent:"Simplify transactional flow; no lifetime PoR."},
{principle:"Sales Collaboration", description:"Optional; Recast leads the sale, LAR supports quote and PO process.", intent:"Maintain message control and accuracy."},
{principle:"Renewal Ownership", description:"Renewal margin is discretionary, capped at 5%, and applies only if the LAR manages the renewal process.", intent:"Protect margin integrity and ensure customer experience consistency."},
],
marginBands: [
{band:"Tier 3 – Transactional / Referral", criteria:"Partner identifies or processes transaction. Recast leads sales cycle and closes opportunity.", eligible:"Registered (LAR/Referral)", margin:"5% (Discretionary)", example:"LAR adds Recast SKU to renewal with minimal engagement."},
],
csv: {
blurb:"Upload event or campaign lists for fast routing. Influence ≠ margin.",
required:["Partner Name","Campaign Name/ID","Account Name (and Domain)","First Name","Last Name","Email","Country","Source Type","Attribution Intent","Requested PoR (Y/N)"],
flow:[
"Create/Update Campaign Members; de-dupe by email; match Account by Domain/Name.",
"Stamp: Lead Source=Partner Event; Sourcing Partner; Attribution (Primary/Influence).",
"Option: 'Create Deal Registration' → PQL → Channel approval in 2 business days."
]
}
},
'Value/Preferred': {
summary:"You co-sell with us; consistent activity earns Tier 2. Own full cycle → Tier 1.",
sourcing: [
{label:"Partner Sourced", value:"You found the opp + registered it + helped close → Full margin when you drive the sale."},
{label:"Recast Sourced (Co-Sell)", value:"We brought the lead; you help sell → Shared margin."},
{label:"Transactional/Referral", value:"Intro or PO only → Referral margin."}
],
bands:[
{band:"Tier 1 – Full-Cycle", when:["Sourced + registered","Owns qual→close with light Recast support"], rule:"Full margin"},
{band:"Tier 2 – Co-Sell", when:["Shared discovery/demo/pricing; active MAP"], rule:"Shared margin"}
],
renewals:["PoR retains renewal with activity compliance; else may be reassigned."],
csv: {
blurb:"Upload event or campaign lists for fast routing. Influence ≠ margin.",
required:["Partner Name","Campaign Name/ID","Account Name (and Domain)","First Name","Last Name","Email","Country","Source Type","Attribution Intent","Requested PoR (Y/N)"],
flow:[
"Create/Update Campaign Members; de-dupe by email; match Account by Domain/Name.",
"Stamp: Lead Source=Partner Event; Sourcing Partner; Attribution (Primary/Influence).",
"Option: 'Create Deal Registration' → PQL → Channel approval in 2 business days."
]
}
},
'Strategic/Premier': {
summary:"Strategic partner. Default expectation is Tier 1 unless co-sell is requested.",
sourcing: [
{label:"Partner Sourced", value:"You found the opp + registered it + helped close → Full margin when you drive the sale."},
{label:"Recast Sourced (Co-Sell)", value:"We brought the lead; you help sell → Shared margin."},
{label:"Transactional/Referral", value:"Intro or PO only → Referral margin."}
],
bands:[
{band:"Tier 1 – Full-Cycle", when:["Sourced + end-to-end ownership"], rule:"Full margin"},
{band:"Tier 2 – Co-Sell", when:["Recast Sourced or heavier presales help"], rule:"Shared margin"}
],
renewals:["PoR renewal protection with activity; expansions follow Tiers."],
csv: {
blurb:"Upload event or campaign lists for fast routing. Influence ≠ margin.",
required:["Partner Name","Campaign Name/ID","Account Name (and Domain)","First Name","Last Name","Email","Country","Source Type","Attribution Intent","Requested PoR (Y/N)"],
flow:[
"Create/Update Campaign Members; de-dupe by email; match Account by Domain/Name.",
"Stamp: Lead Source=Partner Event; Sourcing Partner; Attribution (Primary/Influence).",
"Option: 'Create Deal Registration' → PQL → Channel approval in 2 business days."
]
}
},
MSP: {
summary:"Managed service delivery; monthly economics; PoR protections per MSP ROE.",
sourcing:[{label:"MSP Motion", value:"You package Recast in services; co-sell on net-new logos."}],
bands:[
{band:"Tier 1", when:["MSP drives sale and delivery"], rule:"Programmed in MSP price book"},
{band:"Tier 2", when:["Co-sell with Recast SE/AE"], rule:"Shared margin"}
],
renewals:["Incumbent MSP retains renewal if active in lifecycle reviews."],
roePrinciples: [
{principle:"Deal Registration", description:"Mandatory for all partner-led opportunities.", intent:"Protect partner investment."},
{principle:"Partner of Record", description:"Approved PoR retains lifecycle rights with active engagement.", intent:"Encourage long-term loyalty."},
],
marginBands: [
{band:"Tier 1 – MSP Driven", criteria:"MSP drives sale and delivery.", eligible:"MSP", margin:"25%", example:"MSP packages and sells Recast in managed services."},
{band:"Tier 2 – Co-Sell", criteria:"Co-sell with Recast.", eligible:"MSP", margin:"15%", example:"Joint sale with Recast support."},
],
csv: {
blurb:"Upload event or campaign lists for fast routing. Influence ≠ margin. Emphasize multitenant lists.",
required:["Partner Name","Campaign Name/ID","Account Name (and Domain)","First Name","Last Name","Email","Country","Source Type","Attribution Intent","Requested PoR (Y/N)"],
flow:[
"Create/Update Campaign Members; de-dupe by email; match Account by Domain/Name.",
"Stamp: Lead Source=Partner Event; Sourcing Partner; Attribution (Primary/Influence).",
"Option: 'Create Deal Registration' → PQL → Channel approval in 2 business days."
]
}
}
},
exampleACV: 100000,
servicesMultiplier: 6,
salesCycle: {
stages: {
PQL: {
label: "PQL",
description: "Partner Qualified Lead registered in portal. Recast approval is required to assign Partner of Record.",
entryCriteria: ["Partner identifies lead", "Lead submitted in Partner Portal"],
exitCriteria: ["Recast approves or declines within SLA", "Partner of Record set in CRM"],
deliverables: ["Registration form (company, domain, contacts, use case)", "Approval notification"],
},
Identification: {
label: "Identification (10%)",
description: "Initial contact made; meeting confirmed; problem identified.",
entryCriteria: ["Approved lead", "Intro outreach completed"],
exitCriteria: ["Discovery meeting held", "Clear problem statement"],
deliverables: ["Discovery notes", "Next-step email / agenda"],
},
Qualification: {
label: "Qualification (25%)",
description: "Pain and decision process validated; budget signal present; technical feasibility confirmed.",
entryCriteria: ["Engaged prospect", "Business + technical discovery"],
exitCriteria: ["Budget/timeline/authority captured", "Technical viability confirmed"],
deliverables: ["MEDDICC summary", "Qualified Opportunity in CRM"],
},
Development: {
label: "Development (50%)",
description: "Solutioning and validation; business case and compelling event linked to value.",
entryCriteria: ["Technical work started", "Solution fit agreed"],
exitCriteria: ["Technical Win achieved", "Budget allocated"],
deliverables: ["Technical validation checklist", "Mutual Action Plan (MAP)", "High-level architecture / scope"],
},
Proposal: {
label: "Proposal (75%)",
description: "Commercial alignment; quote/SOW delivered; legal/security reviews in progress.",
entryCriteria: ["Budget identified", "Solution design accepted"],
exitCriteria: ["Budget approval in progress", "Security/Legal submitted"],
deliverables: ["Final quote or SOW", "Security questionnaire / DPA (if required)"],
},
Closing: {
label: "Closing (90%)",
description: "Signature or PO routing; go-live plan established.",
entryCriteria: ["Commercial terms finalized", "Redlines near completion"],
exitCriteria: ["Signature/PO received", "Launch date confirmed"],
deliverables: ["Executed order form/PO", "Launch plan"],
},
ClosedWon: {
label: "Closed Won",
description: "Provisioning and fulfillment completed; CS intro scheduled.",
entryCriteria: ["Executed paperwork"],
exitCriteria: ["Software/license delivered", "CS kickoff scheduled"],
deliverables: ["Fulfillment confirmation", "Handoff note to CS"],
},
Onboarding: {
label: "Onboarding",
description: "Kickoff → Implementation → UAT → Launch → Enablement; drive time-to-value and adoption.",
entryCriteria: ["Closed-won handoff"],
exitCriteria: ["Go-live achieved", "Enablement milestones completed"],
deliverables: ["Kickoff deck", "Implementation checklist", "UAT sign-off", "Training/Certification path"],
},
},
tierMeta: {
tier1: {
name: "Tier 1 – Full-Cycle Ownership",
summary: "Partner leads end-to-end (lead → close). Recast provides SMEs as needed.",
margin: "25%",
color: "bg-green-100 text-green-800",
},
tier2: {
name: "Tier 2 – Joint Engagement",
summary: "Co-sell motion. Partner drives top/mid-funnel; Recast supports validation and close.",
margin: "15%",
color: "bg-amber-100 text-amber-800",
},
tier3: {
name: "Tier 3 – Transactional / Referral",
summary: "Partner sources or influences; Recast runs the sale.",
margin: "5% (discretionary)",
color: "bg-slate-200 text-slate-800",
},
},
tiers: {
tier1: {
PQL: { primaryOwner: "Partner AE", support: ["Recast Channel Manager"], accountable: "Recast Channel Manager" },
Identification: { primaryOwner: "Partner AE", support: ["Recast AE"], accountable: "Partner Sales Lead" },
Qualification: { primaryOwner: "Partner AE", support: ["Partner SE"], accountable: "Partner Sales Lead" },
Development: { primaryOwner: "Partner SE", support: ["Recast SE (as-needed)", "Partner AE"], accountable: "Partner SE Lead" },
Proposal: { primaryOwner: "Partner AE", support: ["Partner SE", "Recast AE (pricing review)", "Recast Legal/Security (as-needed)"], accountable: "Partner Sales Lead" },
Closing: { primaryOwner: "Partner AE", support: ["Recast AE", "Channel Ops"], accountable: "Partner Sales Lead" },
ClosedWon: { primaryOwner: "Partner AE", support: ["Recast AE", "Recast CS"], accountable: "Recast Sales Leader" },
Onboarding: { primaryOwner: "Partner Services", support: ["Recast CS", "Partner PM"], accountable: "Recast CS Leader" },
},
tier2: {
PQL: { primaryOwner: "Partner AE", support: ["Recast Channel Manager"], accountable: "Recast Channel Manager" },
Identification: { primaryOwner: "Partner AE", support: ["Recast AE"], accountable: "Recast AE" },
Qualification: { primaryOwner: "Partner AE", support: ["Recast SE"], accountable: "Recast AE" },
Development: { primaryOwner: "Recast SE", support: ["Partner SE", "Partner AE"], accountable: "Recast SE Lead" },
Proposal: { primaryOwner: "Recast AE", support: ["Partner AE", "Recast Legal/Security"], accountable: "Recast Sales Leader" },
Closing: { primaryOwner: "Recast AE", support: ["Partner AE", "Channel Ops"], accountable: "Recast Sales Leader" },
ClosedWon: { primaryOwner: "Recast AE", support: ["Recast CS", "Partner AE"], accountable: "Recast Sales Leader" },
Onboarding: { primaryOwner: "Recast CS", support: ["Partner Services"], accountable: "Recast CS Leader" },
},
tier3: {
PQL: { primaryOwner: "Recast AE / Channel Manager", support: ["Partner (Referral / LAR)"], accountable: "Recast Channel Manager" },
Identification: { primaryOwner: "Recast AE", support: ["Partner (Intro only)"], accountable: "Recast AE" },
Qualification: { primaryOwner: "Recast AE", support: ["Recast SE"], accountable: "Recast AE" },
Development: { primaryOwner: "Recast SE", support: ["Recast AE"], accountable: "Recast SE Lead" },
Proposal: { primaryOwner: "Recast AE", support: ["Legal/Security", "Finance"], accountable: "Recast Sales Leader" },
Closing: { primaryOwner: "Recast AE", support: ["Channel Ops"], accountable: "Recast Sales Leader" },
ClosedWon: { primaryOwner: "Recast AE", support: ["CS"], accountable: "Recast Sales Leader" },
Onboarding: { primaryOwner: "Recast CS", support: ["Partner (as applicable)"], accountable: "Recast CS Leader" },
},
},
rows: ["PQL", "Identification", "Qualification", "Development", "Proposal", "Closing", "ClosedWon", "Onboarding"],
selectedStage: null,
showStageModal: false,
modalPosition: { top: 0, left: 0 }
},
msp: {
overview: "Welcome to the Recast MSP Partner Program\n\nThe Recast MSP Program is built for service providers that want to embed Recast’s solutions into their service offerings to drive recurring revenue, expand client value, and scale with predictable economics.\n\nWe support multiple MSP archetypes—from infra-focused to app-centric—with enablement tailored to each type. Whether you’re a high-touch implementation shop or a lightweight automation-led MSP, this program offers flexible models to fit your business.\n\nProgram Highlights:\n\n* Monthly point-based licensing structure for easy cost forecasting\n\n* Tiered margin tiers based on deal ownership and engagement\n\n* Access to white-labeled deployment kits, SOWs, and enablement tools\n\n* Support for both application workspace and endpoint solutions\n\n* Designed to protect partner margin, loyalty, and renewal rights",
requirements: [
"Invitation and approval from Recast Channel Leadership",
"Executed Master Partner or OEM Agreement",
"Active go-to-market motion and enablement plan on file",
"Quarterly alignment on co-sell activity or pipeline reviews (QBRs)",
"Minimum monthly point commitment (entry tier: 300 points/month)",
"Completion of required certifications for eligible product lines",
"Agreement to Rules of Engagement and margin structure"
],
benefits: [
"Registered deal margin (per Tier definition)",
"Renewal margin protection with activity compliance",
"Monthly point-based pricing tiers with discounted rates at scale",
"Recast partner portal access",
"Prebuilt “Campaigns-in-a-Box” and brand kits",
"Partner services packaging playbooks (SOWs, pricing templates)",
"Self-service training and deployment kits",
"Joint lead-gen campaigns and MDF eligibility (tier-based)",
"Dedicated partner support lines for sales, SE, and services",
"Recast Account Manager for joint planning",
"Eligibility for Recast-sourced leads (with active plan and certs)"
],
onboarding: {
steps: [
"Partner invitation and agreement execution",
"Assign internal Partner Sales Lead and Technical Lead",
"Complete initial certification (sales + technical track)",
"Define GTM and enablement plan with Recast Channel Manager",
"Select monthly point commitment tier",
"Gain access to:\n * Partner Portal\n * Deployment and packaging toolkits\n * Sales motion playbooks\n * Points-based pricing calculator",
"Launch your first co-sell or registered opportunity",
"Schedule first Quarterly Business Review (QBR)"
],
resources: [
"New Partner Starter Kit",
"Certification path guides",
"Pricing and packaging calculator",
"Application Workspace and Right Click Tool playbooks",
"Partner FAQ and escalation contact list"
]
},
roe: [
"Deal Registration is Mandatory\nAll partner-led opportunities must be registered and approved in the Partner Portal to qualify for margin and Partner of Record (PoR) status.",
"Partner of Record (PoR) Protection\nApproved PoR partners retain rights for the full customer lifecycle, including renewals and expansions, provided they maintain active engagement (e.g., QBRs, renewal activity).",
"Discount Policy\nRecast will not discount or quote any PoR-owned customer below partner pricing unless pre-approved through a formal channel escalation.",
"Conflict Resolution\nIn overlapping claims, Recast Channel Leadership will evaluate based on:\n* Deal registration timestamp\n* CRM activity log\n* Customer attestation (if needed)",
"Renewal Ownership\nPartner of Record retains renewal margin unless:\n* Customer explicitly reassigns to another partner\n* Partner has been inactive and missed renewal planning window",
"Sales Collaboration\nRequirements vary by Tier:\n* Tier 1: partner-driven\n* Tier 2: co-sell required\n* Tier 3: Recast-owned",
"Ethical Conduct\nAll partners must comply with Recast’s Code of Conduct, anti-poaching rules, and maintain professional behavior in joint accounts.",
"Margin Tier Enforcement\n* Tiers 1–3 define margin eligibility\n* Margins reset if Tier criteria are not met\n* Quarterly review of Tier performance and partner tiering",
"Governance\n* Lead registration valid for 30 days; can be renewed with pipeline activity\n* Tier reviews occur quarterly\n* Escalation SLA: 5 business days to VP of Partner Programs"
]
},
model: {
tiers: {
Registered: {
overview: "Registered partners are either License Added Resellers (LARs) or referral partners who help Recast reach more customers.\n\n* LARs handle the transaction — they place the order and act as the bill-to on behalf of the customer. They earn up to a 5% margin on those deals.\n\n* Referral partners introduce Recast to a customer or opportunity. If we close the deal directly, they can receive up to a 5% rebate at Recast’s discretion.\n\nThese partnerships are lightweight and transactional — no formal agreement is required. We simply set up the partner in Salesforce with valid billing information and process orders as needed.\nThey’re a low-overhead way for Recast to fulfill deals or expand into new opportunities through trusted local or resale partners.",
requirements: [
"Salesforce Bill‑To Account",
],
benefits: [
"Resell Licensing",
"Listing on Recastsoftware.com",
],
},
'Value/Preferred': {
overview: "Value/Preferred Partners are approved resellers or referral partners who actively collaborate with Recast on qualified opportunities and co-selling motions. They are beyond transactional resale — investing time and resources to build Recast expertise, pursue certifications, and establish repeatable sales and delivery motions.\n\nThese partners typically co-sell and co-market with Recast, leveraging our technical experts and marketing resources to expand reach, accelerate deal velocity, and build early customer success stories. They are focused on the right customer segments, maintain a defined sales presence, and often represent Recast within their regional or vertical markets.\n\nValue/Preferred Partners demonstrate early-stage commitment through pipeline creation, deal registration, and customer enablement. They receive access to enablement, marketing funds, and field collaboration to help them grow toward Strategic/Premier-level engagement.\n\nValue/Preferred Partners are in the growth phase of the Recast ecosystem — proving alignment, building capability, and showing consistent commitment to joint success.",
requirements: [
"Partner Agreement Signed",
"Partner Profile Submission",
"Technical Certification: 1 Individual",
"Sales Certification: 1 Individual",
"Minimum Annual Deal Volume: 4 Deals per Year"
],
benefits: [
"Resell Licensing",
"Access to Partner Portal",
"Listing on Recastsoftware.com",
"Self-Service Training",
"Campaigns-in-a-Box",
"Partner NFR Licensing",
"Partner of Record (PoR) Eligibility",
"Eligible for MSP or Resell Delivery Model",
],
},
'Strategic/Premier': {
overview: "Strategic/Premier Partners are strategic, invite-only collaborators who represent Recast at the highest level of partnership. These partners have demonstrated sustained revenue growth, deep technical and sales capability, and a long-term commitment to joint business planning with Recast leadership.\n\nThey are fully enabled to co-sell, co-market, and co-deliver Recast solutions, often representing our brand in major enterprise environments. Strategic/Premier Partners maintain certified technical resources, dedicated sales and marketing teams, and a defined customer base that aligns with Recast’s target markets and geographies.\n\nEach Strategic/Premier Partner has a joint business plan with Recast — including shared revenue targets, annual growth goals, and investment commitments across enablement, customer adoption, and marketing execution. They also participate in roadmap reviews, quarterly business planning, and go-to-market alignment with Recast executives.\n\nStrategic/Premier Partners are our most strategic alliances — delivering measurable impact through scale, shared investment, and sustained customer success across regions and verticals.",
requirements: [
"Partner Agreement Signed",
"Partner Profile Submission",
"Technical Certification: 2 Individuals",
"Sales Certification: 2 Individuals",
"Quarterly Business Review (QBR)",
"Mutual Business Plan | Min. Deal volume plan in place",
],
benefits: [
"Resell Licensing",
"Access to Partner Portal",
"Listing on Recastsoftware.com",
"Self-Service Training",
"Campaigns-in-a-Box",
"Exclusive Roadmap Preview/Access for requests",
"Partner NFR Licensing",
"CPQ Self Service (quote-to-order)",
"Partner of Record (PoR) Eligibility",
"Eligible for MSP or Resell Delivery Model",
"Dedicated Support Contact",
"Recast Marketing | Demand Gen Support ",
"Lead Pass | Services Delivery Leads",
"Recast Executive Support",
"Co-Sell & Expansion Support",
],
},
},
margins: {
Annual: {
"Net New": {
"Value/Preferred|Strategic/Premier": [
{ band: "Tier 1", upTo: "25%", when: "Partner sourced AND registered AND leads qualification → close AND owns demo OR technical validation AND certs active" },
{ band: "Tier 2", upTo: "15%", when: "Co-sell motion AND Recast supports demo/SE work AND Partner participates but does not run full cycle" },
{ band: "Tier 3", upTo: "5% (discretionary)", when: "Referral OR LAR transaction AND Recast fully owns sale" },
],
Registered: [
{ band: "Tier 3", upTo: "5% (discretionary)", when: "Get up to 5% margin for transacting or rebated for demand gen" },
],
},
Renewal: {
"Value/Preferred|Strategic/Premier": [
{ band: "Tier 1", upTo: "5%", when: "Preferred/Premier w/ PoR-L" },
{ band: "Tier 2", upTo: "5%", when: "Non-incumbent" },
{ band: "Tier 3", upTo: "0–5% (discretionary)", when: "Registered" },
],
Registered: [{ band: "Tier 3", upTo: "0–5% (discretionary)", when: "Registered" }],
},
},
Monthly: {
"Net New": {
"Value/Preferred|Strategic/Premier": [
{ band: "Tier 1", upTo: "25%", when: "Partner sourced AND registered AND leads qualification → close AND owns demo OR technical validation AND certs active" },
{ band: "Tier 2", upTo: "15%", when: "Co-sell motion AND Recast supports demo/SE work AND Partner participates but does not run full cycle" },
{ band: "Tier 3", upTo: "5% (discretionary)", when: "Referral OR LAR transaction AND Recast fully owns sale" },
],
Registered: [
{ band: "Tier 3", upTo: "5% (discretionary)", when: "Partner originated AND Partner registered AND Recast approved" },
],
},
Renewal: {
"Value/Preferred|Strategic/Premier": [
{ band: "Tier 1", upTo: "5%", when: "Preferred/Premier w/ PoR-L" },
{ band: "Tier 2", upTo: "5%", when: "Non-incumbent" },
{ band: "Tier 3", upTo: "0–5% (discretionary)", when: "Registered" },
],
Registered: [{ band: "Tier 3", upTo: "0–5% (discretionary)", when: "Registered" }],
},
},
},
onboarding: {
steps: [
{ name: "Onboard", items: [
"Activate agreements & meeting cadence",
"Install partner licenses; demo-back",
"Technical accreditation (≥1)",
"Sales accreditation (≥1)",
]},
{ name: "Activate", items: [
"Register leads in Partner Central",
"Use marketing resources",
"Develop opportunities with tools & demos",
"First deal achieved",
"Directory listing & website promotion",
]},
{ name: "Accelerate", items: [
"Marketing plan & events/webinars",
"Create repeatable offer",
"≥6 licensing deals annually",
"Nominate for partner awards",
"Drive expansions & renewals",
]},
],
},
roe: {
principles: [
{ principle: "Deal Registration", description: "Mandatory for all partners. All deals must be registered to qualify for margin and PoR. Registration expires after 30 days unless renewed with activity.", intent: "Protect partner investment and ensure visibility." },
{ principle: "Partner of Record (PoR)", description: "Two types: PoR-T (Transactional, for Registered tier, expires at renewal) and PoR-L (Lifecycle, for Preferred/Premier/MSP, valid for renewals/expansions if active). PoR-L expires if no renewal activity at 180, 120, or 90 days prior.", intent: "Encourage long-term engagement and protect incumbents." },
{ principle: "Sales Motion", description: "Tier 1 (Full-Cycle: Partner leads, 25% margin), Tier 2 (Co-Sell: Joint, 15% margin, comp-neutral), Tier 3 (Transactional/Referral: Recast leads, 5% discretionary). Eligibility based on certifications and participation.", intent: "Align compensation with effort and neutrality." },
{ principle: "Renewal Ownership", description: "PoR-L retains renewals with outreach at 180/120/90 days. Miss all → PoR expires 60 days prior, reassigned to Recast.", intent: "Reward active partners and ensure renewals." },
{ principle: "Conflict Resolution", description: "Evaluated by timestamp, activity, and customer input. Escalation to VP within 5 days.", intent: "Fairness and quick resolution." },
{ principle: "Ethical Conduct", description: "Adhere to code of conduct and anti-poaching rules.", intent: "Maintain trust and integrity." }
],
bands: [
{ band: "Tier 1 – Full Cycle", criteria: ["Partner sourced/registered", "Partner runs demo/validation", "Certs active", "Preferred/Premier/MSP only"], eligible: "Preferred/Premier/MSP", margin: "25%", example: "Partner leads entire sale with minimal Recast support." },
{ band: "Tier 2 – Co-Sell", criteria: ["Joint participation", "Recast supports demo/SE", "MAP uploaded", "Preferred/Premier/MSP only"], eligible: "Preferred/Premier/MSP", margin: "15%", example: "Shared effort; Recast aids in qualification/demo." },
{ band: "Tier 3 – Transactional/Referral", criteria: ["Partner intro only", "Recast runs sale", "All tiers eligible"], eligible: "All", margin: "5% (discretionary)", example: "Referral or LAR transaction." }
],
governance: [
{ element: "Registration Validity", definition: "30 days; auto-expire nightly if expired." },
{ element: "PoR Expiry", definition: "Nightly job expires PoR-L if outreach missed." },
{ element: "Certification Alerts", definition: "Alerts 30 days prior to expiry." },
{ element: "Scorecard Refresh", definition: "Nightly refresh of partner scorecards." },
{ element: "Escalation SLA", definition: "5 business days to VP of Partner Programs." }
],
summary: [
{ tier: "Strategic/Premier", engagement: "Full-cycle (Tier 1)", involvement: "Light-touch", range: "25%", notes: "Top-tier, full control of sales motion" },
{ tier: "Value/Preferred", engagement: "Joint sale (Tier 2)", involvement: "Moderate", range: "15%", notes: "Co-sell and presales collaboration" },
{ tier: "Registered / LAR", engagement: "Transactional (Tier 3)", involvement: "Recast-led", range: "5% (discretionary)", notes: "Finder’s fee or referral incentive only." },
],
conflicts: "In cases of overlapping claims, Recast Channel Leadership will evaluate based on deal registration timestamp, documented activity, and customer attestation.",
escalation: "Channel disputes escalated to VP of Partner Programs within 5 business days.",
scenarios: [
{
title: "Net-New Partner Leads",
description: "Simple rule: if Sales is already on it → no conflict. If Sales isn’t on it → Partner gets approved, PoR assigned, and we collaborate. Keeps pipeline clean and ownership clear — everyone knows who’s driving."
},
{
title: "MDF Event Leads",
description: "Ownership is defined before the event. Partner-led = Partner manages follow-up. Sales-led = AE or AM follows up directly. PoR only applies if the partner truly sourced the demand."
},
{
title: "AM Cross-Sell / Upsell",
description: "Account Managers can contact customers directly — even with a Partner PoR — to ensure we don’t slow down opportunities. Partner still earns Tier 2 margin and services revenue. Transparency is key: Partners stay looped in when it adds value."
},
{
title: "Renewals",
description: "If Partner holds PoR → they lead renewal; RM/CSM supports. If no PoR → RM/CSM handles renewal directly. Partner keeps renewal margin when they drive retention."
}
]
},
other: {
overview: "",
partnerTypesDescs: [
"Managed Service Providers (MSPs) are strategic delivery partners who package Recast’s technology into their own managed services — helping customers manage, secure, and optimize their IT environments more efficiently.\n\nMSPs think in monthly recurring revenue (MRR) — not annual contracts. They operate on predictable, consumption-based models and need software that scales with them, not against them. Recast fits perfectly into this model by being easy to deploy, multitenant, and designed for repeatable use across clients.\n\nRather than making margin on licenses, MSPs make money on the services they deliver around the software — configuration, automation, monitoring, and continuous management. Recast helps them improve their margins by reducing manual effort, increasing client coverage, and adding high-value capabilities they can bundle into existing service offerings.\n\nFor many MSPs, Recast also opens the door to application management as a service, expanding beyond traditional infrastructure or security management into new, higher-value revenue streams.\n\nMSP partners are a key part of Recast’s ecosystem — they scale our reach, drive recurring adoption, and deliver measurable customer outcomes every month.",
"ISV partners are technology companies that package and resell Recast as part of their broader solution, creating a stronger combined offering for customers. These partners typically embed or align Recast’s capabilities with their own platform to enhance value, accelerate sales cycles, and simplify deployment for joint customers.\n\nBy partnering with Recast, ISVs can address more customer pain points, eliminate common objections around integration or workflow gaps, and bring a ready-to-deploy joint solution to market faster.\n\nISV partners typically co-sell and co-market with Recast — leveraging joint messaging, enablement, and go-to-market programs to expand reach, build credibility, and drive new revenue.\n\nTogether, we deliver a unified, higher-value solution that helps both companies win faster, sell more efficiently, and serve customers better.",
"OEM partners are strategic technology companies that embed Recast’s capabilities directly into their own products or platforms to enhance functionality, performance, or customer experience. These relationships extend Recast’s reach to thousands of customers through the partner’s existing technology ecosystem.\n\nIn an OEM model, the partner licenses and integrates Recast technology under their own brand, delivering it as a seamless part of their broader solution. This creates a tightly coupled, scalable go-to-market motion where Recast’s value is distributed through a trusted, established platform — accelerating adoption and expanding market penetration.\n\nOEM partnerships are highly strategic and collaborative, often involving joint engineering, product road mapping, and go-to-market alignment at both the technical and executive level.\n\nTogether, OEM partners and Recast bring enterprise-grade solutions to market faster, reduce deployment complexity for customers, and create durable, high-value revenue streams for both organizations.",
"Distributors are territory-based partners with exclusive rights to represent and grow Recast within a defined region or market. They act as our local extension — managing partner recruitment, enablement, and demand generation to expand Recast’s reach and market share.\n\nThese partners typically maintain a network of resellers, MSPs, and system integrators in their region. They handle localized sales, billing, and first-line support, ensuring smooth customer engagement while helping Recast maintain brand and commercial consistency across markets.\n\nDistributors are responsible for developing regional pipeline, building and enabling sub-partners, and executing go-to-market plans aligned with Recast’s global objectives. They also collaborate with Recast on marketing, events, and regional channel strategy to ensure sustained partner and customer growth.\n\nThis model allows Recast to enter new markets efficiently, ensure local expertise, and scale faster through a trusted regional partner that’s fully invested in our success."
],
requirements: [
"Invitation from Recast Channel Leadership",
"Signed Master or OEM Agreement",
"Defined go-to-market motion and enablement plan",
"Quarterly alignment on co-sell and marketing activities"
],
partners: [
{ partnerType: "Technology Partner (ISV)", tierEligibility: "Strategic/Premier", margin: "Negotiated; typically Tier 2 equivalent + referral incentives", dealRegistration: "Optional", mdfAccess: "Co-marketing only", enablement: "Developer enablement, API/SDK certification" },
{ partnerType: "OEM Partner", tierEligibility: "Strategic/Premier", margin: "Embedded / co-sell pricing (not margin-based)", dealRegistration: "N/A", mdfAccess: "Strategic MDF", enablement: "OEM SDK, roadmap collaboration, joint solution blueprints" },
{ partnerType: "Distributor Partner", tierEligibility: "Strategic/Premier", margin: "Transactional (Tier 3 equivalent, pre-negotiated)", dealRegistration: "Required", mdfAccess: "Tiered MDF by volume", enablement: "Distributor onboarding toolkit, partner training delivery" },
]
}
},
partnerEvents: {
summaries: [
{ type: "Webinars", icon: "video", description: "Interactive online sessions showcasing joint solutions, best practices, and customer stories.", avgInvited: 926, avgAttended: 853, avgOpps: 222, avgOppInvited: "24%", avgOppAttended: "26%", avgClosed: 59, win: "27%", benefit: "High engagement with targeted audiences, leading to qualified leads and accelerated pipeline." },
{ type: "User Groups", icon: "users", description: "Community-focused meetings for end-users to share experiences and learn from experts.", avgInvited: 21, avgAttended: 17, avgOpps: 4, avgOppInvited: "21%", avgOppAttended: "25%", avgClosed: 1, win: "24%", benefit: "Builds loyalty and uncovers expansion opportunities through direct customer interactions." },
{ type: "Events (incl. Conf + HH)", icon: "calendar", description: "In-person conferences and happy hours for networking and product demonstrations.", avgInvited: 330, avgAttended: 300, avgOpps: 85, avgOppInvited: "25%", avgOppAttended: "28%", avgClosed: 25, win: "28%", benefit: "Face-to-face connections that foster trust and drive higher conversion rates." },
{ type: "Partner Events", icon: "handshake", description: "Collaborative gatherings with partners to align strategies and generate joint opportunities.", avgInvited: 280, avgAttended: 207, avgOpps: 52, avgOppInvited: "19%", avgOppAttended: "25%", avgClosed: 12, win: "24%", benefit: "Strengthens partnerships and creates shared pipelines for mutual growth." },
]
},
filterModalOpen: false,
selectedPartnerTypes: [],
dealRegNotes: {
partner: `FOR PARTNERS — HOW WE WORK WITH YOU\n1. Register your deals — that protects your position.\nSubmit via the Partner Portal or CSV.\nAs soon as you register a lead:\n\n* We check Salesforce to confirm it’s not already being worked\n\n* Your Partner Manager reviews it\n\n* We assign you visibility on the account and any related opportunity\n\n2. We will NEVER work a registered deal behind your back.\nIf you register a deal, we treat you as the lead stakeholder by default.\n3. You choose how involved you want us to be.\nOnce approved, you decide:\n\n* Partner-Led: You run the deal end-to-end\n\n* Co-Sell: You and our AE work together (you run discovery, we run commercial close)\n\n* Sales-Led Referral: You just make the intro and we run the full cycle\n\n4. You keep credit and visibility.\nYou always see:\n\n* Opportunity progress\n\n* Stages\n\n* Activities\n\n* Forecast signals`,
internal: `FOR SALES — WHAT YOU NEED TO KNOW\n1. Partner deals WILL NOT create duplicate work for you.\nSalesforce automatically flags whether you’re already working the account.\nIf you are → Partner gets notified, you keep ownership, and there’s no conflict.\n2. When a new partner lead comes in, one of three things happens:\nA. Partner-Led\n\n* Partner works the full cycle\n\n* You get visibility\n\n* You still get full quota credit\n\nB. Co-Sell\n\n* You handle pricing + licensing\n\n* Partner handles discovery + services\n\n* Shared deal, shared visibility\n\nC. Sales-Led Referral\n\n* Partner introduces → you run the deal\n\n* Partner gets referral compensation\n\n3. You always get full quota credit.\nQuota credit is rep-neutral:\nIf the account is in your territory, you get 100% credit regardless of who works the deal.\n4. No conflict, no surprises.\nPartner Managers handle deal registration, routing, and conflict resolution.\nYou will never get blindsided by a partner-registered deal being worked behind the scenes.`,
summary: `THE SIMPLE SUMMARY\nPartners: Register your deals. You get visibility, protection, and control.\nWe won’t work deals behind your back. You choose Partner-Led, Co-Sell, or Referral.\nSales: Partners will bring deals. You’ll either co-sell with them or they’ll run the deal.\nYou always keep full quota credit. No duplicates. No surprises.`
}
};
const PARTNER_TYPES = ["Program Overview", "Registered", "Value/Preferred", "Strategic/Premier", "Technology Partner (ISV)", "OEM Partner", "Distributor Partner"]; // Removed MSP from dropdown
const TABS = [
{ id: 'overview', label: 'Overview', icon: 'book-open' },
{ id: 'requirements', label: 'Requirements & Benefits', icon: 'check-circle' },
{ id: 'onboarding', label: 'Onboarding', icon: 'rocket' },
{ id: 'salesmotion', label: 'Sales Motion', icon: 'table' },
{ id: 'margins', label: 'Margins', icon: 'dollar-sign' },
{ id: 'roe', label: 'Rules of Engagement', icon: 'gavel' }
];
function initFilter() {
STATE.selectedPartnerTypes = PARTNER_TYPES.slice();
if (typeof localStorage !== 'undefined') {
try {
const saved = localStorage.getItem('recastPartnerTypeFilter');
if (saved) {
const parsed = JSON.parse(saved);
STATE.selectedPartnerTypes = parsed.selectedPartnerTypes.filter(t => PARTNER_TYPES.includes(t));
}
} catch (e) {
// fallback to default
}
}
if (STATE.selectedPartnerTypes.length === 0) {
STATE.selectedPartnerTypes = PARTNER_TYPES.slice();
}
if (!STATE.selectedPartnerTypes.includes(STATE.partnerType)) {
STATE.partnerType = STATE.selectedPartnerTypes[0] || PARTNER_TYPES[0];
}
}
function setDefaultTier(type) {
if (type === 'Registered') return 'tier3';
if (type === 'Value/Preferred') return 'tier2';
return 'tier1';
}
function getPartnerData(type) {
if (type === "Program Overview") {
return {
overview: '',
requirements: [],
benefits: [],
isStandard: false,
isPremier: false,
isPreferred: false,
specific: null
};
}
if (["Registered", "Value/Preferred", "Strategic/Premier"].includes(type)) {
return {
overview: STATE.model.tiers[type].overview,
requirements: STATE.model.tiers[type].requirements,
benefits: STATE.model.tiers[type].benefits,
isStandard: true,
isPremier: type === "Strategic/Premier",
isPreferred: type === "Value/Preferred",
specific: null
};
} else {
const descIndex = ['Technology Partner (ISV)', 'OEM Partner', 'Distributor Partner'].indexOf(type) + 1; // Adjusted index since MSP is 0 but removed
const desc = STATE.model.other.partnerTypesDescs[descIndex];
return {
overview: desc,
requirements: STATE.model.other.requirements,
benefits: STATE.model.tiers['Strategic/Premier'].benefits,
isStandard: false,
isPremier: false,
isPreferred: false,
specific: STATE.model.other.partners.find(p => p.partnerType === type)
};
}
}
function render() {
if (!STATE.selectedPartnerTypes.includes(STATE.partnerType)) {
STATE.partnerType = STATE.selectedPartnerTypes[0] || PARTNER_TYPES[0];
}
const data = getPartnerData(STATE.partnerType);
let html = '<div class="space-y-6">';
html += renderPartnerTypeSelector();
html += renderTabs();
html += '<div class="rounded-2xl bg-white p-6 shadow-md hover:shadow-lg transition-shadow duration-300">';
switch (STATE.activeTab) {
case 'overview':
html += renderOverview(STATE.showMspOption && (STATE.partnerType === 'Value/Preferred' || STATE.partnerType === 'Strategic/Premier') ? STATE.msp.overview : data.overview, data.isPreferred || data.isPremier);
break;
case 'requirements':
html += renderRequirementsAndBenefits(STATE.showMspOption && (STATE.partnerType === 'Value/Preferred' || STATE.partnerType === 'Strategic/Premier') ? STATE.msp.requirements : data.requirements, STATE.showMspOption && (STATE.partnerType === 'Value/Preferred' || STATE.partnerType === 'Strategic/Premier') ? STATE.msp.benefits : data.benefits, data.isPremier);
break;
case 'margins':
if (data.isStandard) {
html += renderMarginsContent();
} else {
html += renderDetailsContent(data.specific);
}
break;
case 'roe':
html += renderROEContent();
break;
case 'salesmotion':
html += renderSalesMotionContent();
break;
case 'onboarding':
if (STATE.partnerType !== 'Registered') {
html += renderOnboardingContent(STATE.showMspOption && (STATE.partnerType === 'Value/Preferred' || STATE.partnerType === 'Strategic/Premier') ? { ...data, overview: STATE.msp.overview, requirements: STATE.msp.requirements, benefits: STATE.msp.benefits, onboarding: STATE.msp.onboarding } : data);
} else {
html += '<p class="text-center text-gray-700 leading-relaxed">Not applicable for Registered partners.</p>';
}
break;
}
html += '</div>';
html += '</div>';
html += renderFilterTrigger();
if (STATE.filterModalOpen) html += renderFilterModal();
if (STATE.showBusinessPlanModal) {
html += renderBusinessPlanModal();
}
if (STATE.showEvaluationModal) {
html += renderEvaluationModal();
}
if (STATE.showPartnerEventsModal) {
html += renderPartnerEventsModal();
}
if (STATE.showCsvModal) {
html += renderCsvModal();
}
if (STATE.showLeadsGuideModal) {
html += renderLeadsGuideModal();
}
if (STATE.salesCycle.showStageModal) {
html += renderStageModal();
}
if (STATE.showPartnersHelpModal) {
html += renderPartnersHelpModal();
}
if (STATE.showInternalROEPopout) {
html += renderInternalROEPopout();
}
if (STATE.showPartnerCommPopout) {
html += renderPartnerCommPopout();
}
if (STATE.showDealRegModal) {
html += renderDealRegModal();
}
document.getElementById('app').innerHTML = html;
lucide.createIcons();
addEventListeners();
}
function renderFilterTrigger() {
return `
<div class="fixed bottom-4 left-4 z-50">
<input type="checkbox" id="filterTrigger" class="h-4 w-4 rounded accent-[#2563eb] opacity-50 focus:opacity-100" ${STATE.filterModalOpen ? 'checked' : ''} />
</div>
`;
}
function renderFilterModal() {
let checkboxes = '';
PARTNER_TYPES.forEach(t => {
const display = t === 'Registered' ? 'Registered (LAR/Referral)' : t;
const checked = STATE.selectedPartnerTypes.includes(t) ? 'checked' : '';
checkboxes += `
<label class="flex items-center gap-2">
<input type="checkbox" class="partner-type-checkbox h-4 w-4 rounded accent-[#2563eb]" data-type="${t}" ${checked} />
${display}
</label>
`;
});
const allChecked = STATE.selectedPartnerTypes.length === PARTNER_TYPES.length ? 'checked' : '';
return `
<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50 px-4" role="dialog" aria-modal="true" id="filterModalBg">
<div class="relative max-w-md w-full bg-white rounded-xl shadow-2xl p-6">
<button class="absolute top-4 right-4 text-gray-600 hover:text-gray-900 focus:outline-none" id="closeFilterModal">
<i data-lucide="x" class="h-5 w-5"></i>
</button>
<h2 class="text-xl font-medium mb-4">Select Partner Types to Show</h2>
<div class="space-y-3">
<label class="flex items-center gap-2 font-medium">
<input type="checkbox" id="selectAll" class="h-4 w-4 rounded accent-[#2563eb]" ${allChecked} />
Select All
</label>
${checkboxes}
</div>
<div class="mt-6 flex justify-end gap-3">
<button id="resetFilter" class="rounded-full border border-[#E2E8F0] px-4 py-2 text-sm hover:bg-gray-50 transition-colors duration-300">Reset</button>
<button id="saveFilter" class="rounded-full bg-[#2563eb] text-white px-4 py-2 text-sm hover:bg-[#1d4ed8] transition-colors duration-300">Save</button>
</div>
</div>
</div>
`;
}
function renderPartnerTypeSelector() {
let options = '';
STATE.selectedPartnerTypes.forEach(type => {
options += `<option value="${type}" ${STATE.partnerType === type ? 'selected' : ''}>${type === 'Registered' ? 'Registered (LAR/Referral)' : type}</option>`;
});
return `
<div class="flex items-center gap-4">
<label for="partnerType" class="sr-only">Partner Type</label>
<select id="partnerType" class="rounded-full border border-[#E2E8F0] bg-white px-4 py-2 text-sm font-medium text-gray-700 focus:outline-none focus:ring-2 focus:ring-[#2563eb] focus:ring-offset-2 transition-all duration-300">
${options}
</select>
</div>
`;
}
function renderTabs() {
let tabsHtml = '<div class="flex flex-wrap gap-2 mb-6 overflow-x-auto -mx-6 px-6 md:mx-0 md:px-0 scrollbar-hide">';
let tabsToShow = TABS;
if (STATE.partnerType === 'Program Overview') {
tabsToShow = [TABS[0]]; // Only Overview
}
tabsToShow.forEach(tab => {
const active = STATE.activeTab === tab.id;
const disabled = (tab.id === 'margins' && !getPartnerData(STATE.partnerType).isStandard) || (tab.id === 'onboarding' && STATE.partnerType === 'Registered');
tabsHtml += `
<button
data-tab="${tab.id}"
class="${active ? 'bg-[#2563eb] text-white' : 'bg-white text-gray-700 hover:bg-gray-100'} ${disabled ? 'opacity-50 cursor-not-allowed' : ''} inline-flex items-center gap-2 rounded-full px-5 py-2.5 text-sm font-medium transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-[#2563eb] focus:ring-offset-2"
${disabled ? 'disabled' : ''}
>
<i data-lucide="${tab.icon}" class="h-4 w-4"></i>
${tab.label}
</button>
`;
});
tabsHtml += '</div>';
return tabsHtml;
}
function renderOverview(overview, showButtons) {
let html = '<h2 class="text-xl font-medium mb-6 flex items-center gap-3"><i data-lucide="book-open" class="h-6 w-6 stroke-[#2563eb]"></i>Overview</h2>';
if (STATE.partnerType === 'Program Overview') {
html += '<div class="mt-6 flex flex-col sm:flex-row gap-4">';
html += '<button id="partnersHelpButton" class="rounded-full border border-[#E2E8F0] px-6 py-3 text-sm font-medium text-gray-700 hover:bg-gray-50 transition-all duration-300 flex items-center justify-center gap-2 focus:outline-none focus:ring-2 focus:ring-[#2563eb] focus:ring-offset-2"><i data-lucide="users" class="h-4 w-4"></i>Why Partner with us?</button>';
html += '</div>';
html += renderProgramOverviewMatrix();
} else {
html += `<p class="text-gray-700 leading-relaxed whitespace-pre-line transition-opacity duration-300">${overview}</p>`;
}
if (showButtons && (STATE.partnerType === 'Value/Preferred' || STATE.partnerType === 'Strategic/Premier')) {
html += '<div class="mt-6 flex flex-col sm:flex-row gap-4">';
html += `<label for="mspToggle" class="relative inline-flex cursor-pointer items-center">
<input type="checkbox" id="mspToggle" class="sr-only peer" ${STATE.showMspOption ? 'checked' : ''}>
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-[#2563eb] peer-focus:ring-offset-2 rounded-full peer peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all duration-300 peer-checked:bg-[#2563eb]"></div>
<span class="ms-3 text-sm font-medium text-gray-900">View MSP Partnership Option</span>
</label>`;
html += '</div>';
}
if (showButtons && STATE.partnerType !== 'Program Overview') {
html += '<div class="mt-6 flex flex-col sm:flex-row gap-4">';
html += '<button id="evaluationButton" class="rounded-full border border-[#E2E8F0] px-6 py-3 text-sm font-medium text-gray-700 hover:bg-gray-50 transition-all duration-300 flex items-center justify-center gap-2 focus:outline-none focus:ring-2 focus:ring-[#2563eb] focus:ring-offset-2"><i data-lucide="scale" class="h-4 w-4"></i>Value/Preferred to Strategic/Premier Evaluation</button>';
html += '</div>';
}
return html;
}
function renderProgramOverviewMatrix() {
let html = '<div class="overflow-x-auto">';
html += '<table class="min-w-full divide-y divide-[#E2E8F0]">';
html += '<thead><tr><th class="px-4 py-2 text-left text-xs font-semibold">Benefit</th><th class="px-4 py-2 text-left text-xs font-semibold">Registered</th><th class="px-4 py-2 text-left text-xs font-semibold">Value/Preferred</th><th class="px-4 py-2 text-left text-xs font-semibold">Strategic/Premier</th></tr></thead>';
html += '<tbody class="divide-y divide-[#E2E8F0]">';
html += '<tr class="bg-gray-50"><td colspan="4" class="px-4 py-2 text-xs font-medium">Core Access</td></tr>';
html += renderBenefitRow("Resell Licensing", '✓', '✓', '✓');
html += renderBenefitRow("Access to Partner Portal", '✗', '✓', '✓');
html += renderBenefitRow("Listing on RecastSoftware.com", '✓', '✓', '✓');
html += renderBenefitRow("Self-Service Training", '✗', '✓', '✓');
html += '<tr class="bg-gray-50"><td colspan="4" class="px-4 py-2 text-xs font-medium">Marketing & GTM Support</td></tr>';
html += renderBenefitRow("Campaigns-in-a-Box", '✗', '✓', '✓');
html += renderBenefitRow("Quarterly Roadmap Updates", '✗', '✓', '✓');
html += renderBenefitRow("Basic Lead-Gen Support (no funding)", '✗', '✓', '✓');
html += renderBenefitRow("Joint Lead-Gen Campaigns (with MDF Funds)", '✗', '✗', '✓');
html += renderBenefitRow("Mutual Business Plan & GTM Alignment", '✗', '✓', '✓');
html += '<tr class="bg-gray-50"><td colspan="4" class="px-4 py-2 text-xs font-medium">Sales & Deal Support</td></tr>';
html += renderBenefitRow("Partner NFR Licensing", '✗', '✓', '✓');
html += renderBenefitRow("Enhanced CRM Access (quote-to-order)", '✗', '✗', '✓');
html += renderBenefitRow("Partner of Record (PoR) Eligibility", '✗', '✓', '✓');
html += renderBenefitRow("Co-Sell & Expansion Support", '✗', '✓', '✓');
html += '<tr class="bg-gray-50"><td colspan="4" class="px-4 py-2 text-xs font-medium">Delivery Enablement</td></tr>';
html += renderBenefitRow("Eligible for MSP or Resell Delivery Model", '✗', '✓', '✓');
html += renderBenefitRow("Access to Services Delivery Leads", '✗', '✗', '✓');
html += '<tr class="bg-gray-50"><td colspan="4" class="px-4 py-2 text-xs font-medium">Strategic Engagement</td></tr>';
html += renderBenefitRow("Dedicated Support", '✗', '✗', '✓');
html += renderBenefitRow("Dedicated Recast Partner Manager", '✗', '✗', '✓');
html += '</tbody></table></div>';
return html;
}
function renderBenefitRow(benefit, reg, pref, prem) {
return `<tr><td class="px-4 py-2 text-xs text-gray-700 leading-relaxed">${benefit}</td><td class="px-4 py-2 text-xs text-gray-700 leading-relaxed">${reg}</td><td class="px-4 py-2 text-xs text-gray-700 leading-relaxed">${pref}</td><td class="px-4 py-2 text-xs text-gray-700 leading-relaxed">${prem}</td></tr>`;
}
function renderRequirementsAndBenefits(requirements, benefits, isPremier) {
let html = '<h2 class="text-xl font-medium mb-6 flex items-center gap-3"><i data-lucide="check-circle" class="h-6 w-6 stroke-[#2563eb]"></i>Requirements & Benefits</h2>';
html += '<div class="grid grid-cols-1 md:grid-cols-2 gap-6">';
html += '<div class="rounded-2xl bg-gray-50 p-6">';
html += '<h3 class="text-lg font-medium mb-4 flex items-center gap-2"><i data-lucide="list-checks" class="h-5 w-5 stroke-[#2563eb]"></i>Requirements</h3>';
html += '<ul class="space-y-4">';
requirements.forEach(req => {
html += `
<li class="flex items-start gap-3">
<div class="flex-shrink-0 mt-1 bg-[#2563eb] rounded-full p-1">
<i data-lucide="check" class="h-3 w-3 stroke-white"></i>
</div>
<span class="text-gray-700 leading-relaxed">${req}</span>
</li>
`;
});
html += '</ul>';
html += '</div>';
html += '<div class="rounded-2xl bg-gray-50 p-6">';
html += '<h3 class="text-lg font-medium mb-4 flex items-center gap-2"><i data-lucide="award" class="h-5 w-5 stroke-[#2563eb]"></i>Benefits</h3>';
html += '<ul class="space-y-4">';
benefits.forEach(ben => {
html += `
<li class="flex items-start gap-3">
<div class="flex-shrink-0 mt-1 bg-[#2563eb] rounded-full p-1">
<i data-lucide="check" class="h-3 w-3 stroke-white"></i>
</div>
<span class="text-gray-700 leading-relaxed">${ben}</span>
</li>
`;
});
html += '</ul>';
html += '</div>';
html += '</div>';
if (isPremier) {
html += '<div class="mt-8 rounded-2xl border border-[#E2E8F0] p-6 bg-gray-50 flex gap-3 items-start">';
html += '<i data-lucide="info" class="h-5 w-5 mt-0.5 stroke-[#2563eb]"></i>';
html += '<div><div class="font-medium">Strategic/Premier Tier Note</div><p class="text-gray-700 leading-relaxed text-sm mt-1">Strategic/Premier partners receive enhanced MDF and joint planning. Schedule a QBR to discuss advancement.</p></div>';
html += '</div>';
html += '<div class="mt-6 flex flex-col sm:flex-row gap-4">';
html += '<button id="businessPlanButton" class="rounded-full bg-[#2563eb] text-white px-6 py-3 text-sm font-medium hover:bg-[#1d4ed8] transition-all duration-300 flex items-center justify-center gap-2 focus:outline-none focus:ring-2 focus:ring-[#2563eb] focus:ring-offset-2"><i data-lucide="file-text" class="h-4 w-4"></i>View Sample Business Plan</button>';
html += '<button id="partnerEventsButton" class="rounded-full border border-[#E2E8F0] px-6 py-3 text-sm font-medium text-gray-700 hover:bg-gray-50 transition-all duration-300 flex items-center justify-center gap-2 focus:outline-none focus:ring-2 focus:ring-[#2563eb] focus:ring-offset-2"><i data-lucide="calendar" class="h-4 w-4"></i>Partner Events & Campaigns</button>';
html += '</div>';
}
return html;
}
function renderMarginsContent() {
let html = '<h2 class="text-xl font-medium mb-6 flex items-center gap-3"><i data-lucide="dollar-sign" class="h-6 w-6 stroke-[#2563eb]"></i>Margins</h2>';
html += '<div class="rounded-2xl bg-white p-6 shadow-md mb-6">';
html += '<h3 class="text-lg font-medium mb-4 flex items-center gap-2"><i data-lucide="filter" class="h-5 w-5 stroke-[#2563eb]"></i>Filters</h3>';
html += '<div class="flex flex-col sm:flex-row gap-4 rounded-full border border-[#E2E8F0] p-1 bg-white mb-4">';
html += '<select id="commitment" class="flex-1 rounded-full px-4 py-2 text-sm text-gray-700 focus:outline-none">';
html += `<option value="Annual" ${STATE.commitment === 'Annual' ? 'selected' : ''}>Annual</option>`;
html += `<option value="Monthly" ${STATE.commitment === 'Monthly' ? 'selected' : ''}>Monthly</option>`;
html += '</select>';
html += '<select id="dealType" class="flex-1 rounded-full px-4 py-2 text-sm text-gray-700 focus:outline-none">';
html += `<option value="Net New" ${STATE.dealType === 'Net New' ? 'selected' : ''}>Net New</option>`;
html += `<option value="Renewal" ${STATE.dealType === 'Renewal' ? 'selected' : ''}>Renewal</option>`;
html += '</select>';
html += '</div></div>';
const isRegistered = STATE.partnerType === 'Registered';
const tierKey = isRegistered ? 'Registered' : 'Value/Preferred|Strategic/Premier';
let margins = STATE.model.margins[STATE.commitment][STATE.dealType][tierKey];
if (!isRegistered) {
margins = [...margins]; // copy to avoid modifying original
}
html += '<div class="rounded-2xl bg-white p-6 shadow-md mb-6">';
html += '<h3 class="text-lg font-medium mb-4 flex items-center gap-2"><i data-lucide="table" class="h-5 w-5 stroke-[#2563eb]"></i>Margin Tiers</h3>';
html += '<div class="overflow-x-auto mb-6">';
html += '<table class="min-w-full divide-y divide-[#E2E8F0]">';
html += '<thead><tr><th class="px-6 py-3 text-left text-sm font-semibold">Tier</th><th class="px-6 py-3 text-left text-sm font-semibold">Up to</th><th class="px-6 py-3 text-left text-sm font-semibold">When</th></tr></thead>';
html += '<tbody class="divide-y divide-[#E2E8F0]">';
margins.forEach(m => {
html += `<tr><td class="px-6 py-4 text-sm text-gray-700 leading-relaxed">${m.band}</td><td class="px-6 py-4 text-sm text-gray-700 leading-relaxed">${m.upTo}</td><td class="px-6 py-4 text-sm text-gray-700 leading-relaxed">${m.when}</td></tr>`;
});
html += '</tbody></table></div></div>';
html += '<div class="rounded-2xl bg-white p-6 shadow-md mb-6">';
html += '<h3 class="text-lg font-medium mb-4 flex items-center gap-2"><i data-lucide="calculator" class="h-5 w-5 stroke-[#2563eb]"></i>Example Calculation</h3>';
if (isRegistered) {
STATE.tier = 'tier3';
}
const availableTiers = isRegistered ? ['tier3'] : (STATE.partnerTierMeta[STATE.partnerType].fullCycleEligible ? ['tier1', 'tier2', 'tier3'] : ['tier2', 'tier3']);
html += '<div class="flex flex-wrap gap-4 mb-4">';
availableTiers.forEach(tier => {
html += `
<label class="inline-flex items-center gap-2 cursor-pointer">
<input type="radio" name="tier" value="${tier}" ${STATE.tier === tier ? 'checked' : ''} class="form-radio h-4 w-4 text-[#2563eb] focus:ring-[#2563eb]">
<span class="text-sm font-medium">${STATE.salesCycle.tierMeta[tier].name.split(' – ')[0]}</span>
</label>
`;
});
html += '</div>';
html += '<div class="mt-4">';
html += '<label for="exampleACV" class="block text-sm font-medium mb-1">Example ACV ($)</label>';
html += '<input type="number" id="exampleACV" value="' + STATE.exampleACV + '" min="0" step="1000" class="rounded-full border border-[#E2E8F0] bg-white px-4 py-2 text-sm text-gray-700 focus:outline-none focus:ring-2 focus:ring-[#2563eb] focus:ring-offset-2 transition-all duration-300 w-full max-w-xs" />';
html += '</div>';
const upTo = margins.find(m => m.band.toLowerCase().replace(/\s/g, '') === STATE.tier.toLowerCase().replace(/\s/g, ''))?.upTo;
const marginPercentStr = upTo.replace(/[^0-9.]/g, '');
const marginPercent = parseFloat(marginPercentStr) / 100 || 0;
const acv = STATE.exampleACV;
const margin = acv * marginPercent;
const services = margin * STATE.servicesMultiplier;
html += '<div class="mt-6 grid grid-cols-1 sm:grid-cols-3 gap-4">';
html += `<div class="rounded-xl bg-gray-50 p-4"><div class="text-sm font-medium mb-1">Software Margin</div><div class="text-2xl font-semibold">$${margin.toLocaleString()}</div></div>`;
html += `<div class="rounded-xl bg-gray-50 p-4"><div class="text-sm font-medium mb-1">Est. Services Revenue</div><div class="text-2xl font-semibold">$${services.toLocaleString()}</div></div>`;
html += `<div class="rounded-xl bg-gray-50 p-4"><div class="text-sm font-medium mb-1">Total Partner Value</div><div class="text-2xl font-semibold">$${(margin + services).toLocaleString()}</div></div>`;
html += '</div></div>';
return html;
}
function renderDetailsContent(specific) {
let html = '<h2 class="text-xl font-medium mb-6 flex items-center gap-3"><i data-lucide="dollar-sign" class="h-6 w-6 stroke-[#2563eb]"></i>Partner Details</h2>';
if (specific) {
html += '<div class="space-y-4">';
html += `<div><span class="font-medium">Tier Eligibility:</span> ${specific.tierEligibility}</div>`;
html += `<div><span class="font-medium">Margin:</span> ${specific.margin}</div>`;
html += `<div><span class="font-medium">Deal Registration:</span> ${specific.dealRegistration}</div>`;
html += `<div><span class="font-medium">MDF Access:</span> ${specific.mdfAccess}</div>`;
html += `<div><span class="font-medium">Enablement:</span> ${specific.enablement}</div>`;
html += '</div>';
} else {
html += '<p class="text-gray-700 leading-relaxed">Details not available for this partner type.</p>';
}
return html;
}
function renderROEContent() {
let html = '<h2 class="text-xl font-medium mb-6 flex items-center gap-3"><i data-lucide="gavel" class="h-6 w-6 stroke-[#2563eb]"></i>Rules of Engagement</h2>';
html += '<div class="space-y-6">';
html += '<section class="rounded-2xl bg-white p-6 shadow-md">';
html += '<h3 class="text-lg font-medium mb-4">AMER Partner Lead & Deal Flow Scenarios</h3>';
html += '<div class="grid grid-cols-1 md:grid-cols-2 gap-4">';
STATE.model.roe.scenarios.forEach(s => {
html += `
<div class="rounded-xl bg-gray-50 p-4">
<h4 class="font-medium mb-2">${s.title}</h4>
<p class="text-sm text-gray-700 leading-relaxed">${s.description}</p>
</div>
`;
});
html += '</div>';
html += '</section>';
html += '<section class="rounded-2xl bg-white p-6 shadow-md">';
html += '<h3 class="text-lg font-medium mb-4">Core Principles</h3>';
html += '<ul class="space-y-4">';
STATE.model.roe.principles.forEach(p => {
html += `
<li>
<h4 class="font-medium">${p.principle}</h4>
<p class="text-sm text-gray-700">${p.description}</p>
<p class="text-xs text-gray-500">Intent: ${p.intent}</p>
</li>
`;
});