Skip to content

Commit 5ce743c

Browse files
Update index.html
1 parent e2ca7a9 commit 5ce743c

1 file changed

Lines changed: 143 additions & 45 deletions

File tree

index.html

Lines changed: 143 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
3737
</main>
3838
<script>
3939
const STATE = {
40-
partnerType: 'Preferred',
40+
partnerType: 'Premier',
4141
commitment: 'Annual',
4242
dealType: 'Net New',
4343
newPartner: false,
4444
activeTab: 'overview',
4545
showBusinessPlanModal: false,
4646
showEvaluationModal: false,
4747
activeStep: 0,
48-
band: 'band2',
48+
band: 'band1',
4949
exampleACV: 100000,
5050
salesCycle: {
5151
stages: {
@@ -160,6 +160,61 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
160160
},
161161
rows: ["PQL", "Identification", "Qualification", "Development", "Proposal", "Closing", "ClosedWon", "Onboarding"],
162162
},
163+
msp: {
164+
overview: " MSP Partner Program - Invite Only\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 bands 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",
165+
requirements: [
166+
"Invitation and approval from Recast Channel Leadership",
167+
"Executed Master Partner or OEM Agreement",
168+
"Active go-to-market motion and enablement plan on file",
169+
"Quarterly alignment on co-sell activity or pipeline reviews (QBRs)",
170+
"Minimum monthly point commitment (entry tier: 300 points/month)",
171+
"Completion of required certifications for eligible product lines",
172+
"Agreement to Rules of Engagement and margin structure"
173+
],
174+
benefits: [
175+
"Registered deal margin (per Band definition)",
176+
"Renewal margin protection with activity compliance",
177+
"Monthly point-based pricing tiers with discounted rates at scale",
178+
"Recast partner portal access",
179+
"Prebuilt “Campaigns-in-a-Box” and brand kits",
180+
"Partner services packaging playbooks (SOWs, pricing templates)",
181+
"Self-service training and deployment kits",
182+
"Joint lead-gen campaigns and MDF eligibility (tier-based)",
183+
"Dedicated partner support lines for sales, SE, and services",
184+
"Recast Account Manager for joint planning",
185+
"Eligibility for Recast-sourced leads (with active plan and certs)"
186+
],
187+
onboarding: {
188+
steps: [
189+
"Partner invitation and agreement execution",
190+
"Assign internal Partner Sales Lead and Technical Lead",
191+
"Complete initial certification (sales + technical track)",
192+
"Define GTM and enablement plan with Recast Channel Manager",
193+
"Select monthly point commitment tier",
194+
"Gain access to:\n * Partner Portal\n * Deployment and packaging toolkits\n * Sales motion playbooks\n * Points-based pricing calculator",
195+
"Launch your first co-sell or registered opportunity",
196+
"Schedule first Quarterly Business Review (QBR)"
197+
],
198+
resources: [
199+
"New Partner Starter Kit",
200+
"Certification path guides",
201+
"Pricing and packaging calculator",
202+
"Application Workspace and Right Click Tool playbooks",
203+
"Partner FAQ and escalation contact list"
204+
]
205+
},
206+
roe: [
207+
"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.",
208+
"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).",
209+
"Discount Policy\nRecast will not discount or quote any PoR-owned customer below partner pricing unless pre-approved through a formal channel escalation.",
210+
"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)",
211+
"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",
212+
"Sales Collaboration\nRequirements vary by Band:\n* Band 1: partner-driven\n* Band 2: co-sell required\n* Band 3: Recast-owned",
213+
"Ethical Conduct\nAll partners must comply with Recast’s Code of Conduct, anti-poaching rules, and maintain professional behavior in joint accounts.",
214+
"Margin Band Enforcement\n* Bands 1–3 define margin eligibility\n* Margins reset if Band criteria are not met\n* Quarterly review of Band performance and partner tiering",
215+
"Governance\n* Lead registration valid for 30 days; can be renewed with pipeline activity\n* Band reviews occur quarterly\n* Escalation SLA: 5 business days to VP of Partner Programs"
216+
]
217+
},
163218
model: {
164219
tiers: {
165220
Registered: {
@@ -339,7 +394,17 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
339394
return 'band1';
340395
}
341396
function getPartnerData(type) {
342-
if (["Registered", "Preferred", "Premier"].includes(type)) {
397+
if (type === 'MSP') {
398+
return {
399+
overview: STATE.msp.overview,
400+
requirements: STATE.msp.requirements,
401+
benefits: STATE.msp.benefits,
402+
isStandard: false,
403+
isPremier: false,
404+
isPreferred: false,
405+
specific: STATE.model.other.partners.find(p => p.partnerType === type)
406+
};
407+
} else if (["Registered", "Preferred", "Premier"].includes(type)) {
343408
return {
344409
overview: STATE.model.tiers[type].overview,
345410
requirements: STATE.model.tiers[type].requirements,
@@ -350,7 +415,6 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
350415
specific: null
351416
};
352417
} else {
353-
const specific = STATE.model.other.partners.find(p => p.partnerType === type);
354418
const descIndex = ['MSP', 'Technology Partner (ISV)', 'OEM Partner', 'Distributor Partner'].indexOf(type);
355419
const desc = STATE.model.other.partnerTypesDescs[descIndex];
356420
return {
@@ -360,7 +424,7 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
360424
isStandard: false,
361425
isPremier: false,
362426
isPreferred: false,
363-
specific: specific
427+
specific: STATE.model.other.partners.find(p => p.partnerType === type)
364428
};
365429
}
366430
}
@@ -621,14 +685,24 @@ <h4 class="font-medium mb-2">${r.band} - Up to ${r.upTo}</h4>
621685
return html;
622686
}
623687
function renderROEContent() {
624-
let html = '<h2 class="text-2xl font-bold mb-6 flex items-center gap-3"><i data-lucide="gavel" class="h-6 w-6 stroke-[#0070F3]"></i>Rules of Engagement</h2>';
625-
html += '<div class="space-y-8">';
626-
html += renderROESection('Rules of Engagement (ROE)', renderPrinciplesTable());
627-
html += renderROESection('Margin Bands & Definitions', renderBandsTable());
628-
html += renderROESection('Partner Margin Governance', renderGovernanceTable());
629-
html += renderROESection('Example Summary Table', renderSummaryTable());
630-
html += '</div>';
631-
return html;
688+
if (STATE.partnerType === 'MSP') {
689+
let html = '<h2 class="text-2xl font-bold mb-6 flex items-center gap-3"><i data-lucide="gavel" class="h-6 w-6 stroke-[#0070F3]"></i>Rules of Engagement</h2>';
690+
html += '<ol class="space-y-6 list-decimal pl-6">';
691+
STATE.msp.roe.forEach(rule => {
692+
html += `<li class="text-[#4A5568]">${rule.replace(/\n/g, '<br>')}</li>`;
693+
});
694+
html += '</ol>';
695+
return html;
696+
} else {
697+
let html = '<h2 class="text-2xl font-bold mb-6 flex items-center gap-3"><i data-lucide="gavel" class="h-6 w-6 stroke-[#0070F3]"></i>Rules of Engagement</h2>';
698+
html += '<div class="space-y-8">';
699+
html += renderROESection('Rules of Engagement (ROE)', renderPrinciplesTable());
700+
html += renderROESection('Margin Bands & Definitions', renderBandsTable());
701+
html += renderROESection('Partner Margin Governance', renderGovernanceTable());
702+
html += renderROESection('Example Summary Table', renderSummaryTable());
703+
html += '</div>';
704+
return html;
705+
}
632706
}
633707
function renderROESection(title, tableHtml) {
634708
return `
@@ -727,39 +801,63 @@ <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0] flex items-center
727801
return html;
728802
}
729803
function renderOnboardingContent() {
730-
const steps = STATE.model.onboarding.steps;
731-
let buttonsHtml = '<div class="flex flex-wrap gap-3 mb-6">';
732-
steps.forEach((s, i) => {
733-
const active = STATE.activeStep === i;
734-
buttonsHtml += `
735-
<button
736-
data-step="${i}"
737-
class="${active ? 'bg-[#0070F3] text-white' : 'bg-white text-[#4A5568] hover:bg-[#E2E8F0]'} inline-flex items-center gap-2 rounded-full px-5 py-2.5 text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-[#0070F3] focus:ring-offset-2"
738-
>
739-
<i data-lucide="${active ? 'check-circle' : 'circle'}" class="h-4 w-4"></i>
740-
${s.name}
741-
</button>
742-
`;
743-
});
744-
buttonsHtml += '</div>';
745-
const items = steps[STATE.activeStep].items;
746-
let listHtml = '<ul class="space-y-4">';
747-
items.forEach((item) => {
748-
listHtml += `
749-
<li class="flex items-start gap-3">
750-
<div class="flex-shrink-0 mt-1 bg-[#0070F3] rounded-full p-1">
751-
<i data-lucide="check" class="h-3 w-3 stroke-white"></i>
752-
</div>
753-
<span class="text-[#4A5568]">${item}</span>
754-
</li>
804+
if (STATE.partnerType === 'MSP') {
805+
let html = '<h2 class="text-2xl font-bold mb-6 flex items-center gap-3"><i data-lucide="rocket" class="h-6 w-6 stroke-[#0070F3]"></i>Onboarding</h2>';
806+
html += '<h3 class="text-xl font-semibold mb-4">Onboarding Steps:</h3>';
807+
html += '<ol class="space-y-4 list-decimal pl-6">';
808+
STATE.msp.onboarding.steps.forEach(s => {
809+
html += `<li class="text-[#4A5568]">${s.replace(/\n/g, '<br>')}</li>`;
810+
});
811+
html += '</ol>';
812+
html += '<h3 class="text-xl font-semibold mt-8 mb-4">Resources Provided:</h3>';
813+
html += '<ul class="space-y-4">';
814+
STATE.msp.onboarding.resources.forEach(r => {
815+
html += `
816+
<li class="flex items-start gap-3">
817+
<div class="flex-shrink-0 mt-1 bg-[#0070F3] rounded-full p-1">
818+
<i data-lucide="check" class="h-3 w-3 stroke-white"></i>
819+
</div>
820+
<span class="text-[#4A5568]">${r}</span>
821+
</li>
822+
`;
823+
});
824+
html += '</ul>';
825+
return html;
826+
} else {
827+
const steps = STATE.model.onboarding.steps;
828+
let buttonsHtml = '<div class="flex flex-wrap gap-3 mb-6">';
829+
steps.forEach((s, i) => {
830+
const active = STATE.activeStep === i;
831+
buttonsHtml += `
832+
<button
833+
data-step="${i}"
834+
class="${active ? 'bg-[#0070F3] text-white' : 'bg-white text-[#4A5568] hover:bg-[#E2E8F0]'} inline-flex items-center gap-2 rounded-full px-5 py-2.5 text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-[#0070F3] focus:ring-offset-2"
835+
>
836+
<i data-lucide="${active ? 'check-circle' : 'circle'}" class="h-4 w-4"></i>
837+
${s.name}
838+
</button>
839+
`;
840+
});
841+
buttonsHtml += '</div>';
842+
const items = steps[STATE.activeStep].items;
843+
let listHtml = '<ul class="space-y-4">';
844+
items.forEach((item) => {
845+
listHtml += `
846+
<li class="flex items-start gap-3">
847+
<div class="flex-shrink-0 mt-1 bg-[#0070F3] rounded-full p-1">
848+
<i data-lucide="check" class="h-3 w-3 stroke-white"></i>
849+
</div>
850+
<span class="text-[#4A5568]">${item}</span>
851+
</li>
852+
`;
853+
});
854+
listHtml += '</ul>';
855+
return `
856+
<h2 class="text-2xl font-bold mb-6 flex items-center gap-3"><i data-lucide="rocket" class="h-6 w-6 stroke-[#0070F3]"></i>Onboarding Requirements</h2>
857+
${buttonsHtml}
858+
${listHtml}
755859
`;
756-
});
757-
listHtml += '</ul>';
758-
return `
759-
<h2 class="text-2xl font-bold mb-6 flex items-center gap-3"><i data-lucide="rocket" class="h-6 w-6 stroke-[#0070F3]"></i>Onboarding Requirements</h2>
760-
${buttonsHtml}
761-
${listHtml}
762-
`;
860+
}
763861
}
764862
function renderBusinessPlanModal() {
765863
return `

0 commit comments

Comments
 (0)