Skip to content

Commit 76219a8

Browse files
Update index.html
1 parent 402b509 commit 76219a8

1 file changed

Lines changed: 90 additions & 0 deletions

File tree

index.html

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
4242
dealType: 'Net New',
4343
newPartner: false,
4444
activeStep: 0,
45+
showROE: false,
4546
model: {
4647
tiers: {
4748
Registered: {
@@ -140,6 +141,33 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
140141
]},
141142
],
142143
},
144+
roe: {
145+
principles: [
146+
{ principle: "Deal Registration is Mandatory", description: "All partner-led opportunities must be registered and approved in the Recast Partner Portal to qualify for margin.", intent: "Protect partner investment in identifying and developing opportunities." },
147+
{ principle: "Partner of Record Protection", description: "Once approved, the partner remains the Partner of Record (PoR) for the customer lifecycle, including renewals and expansions.", intent: "Reinforce long-term partner loyalty and recurring revenue visibility." },
148+
{ principle: "Conflict Resolution", description: "In cases of overlapping claims, Recast Channel Leadership will evaluate based on deal registration timestamp, documented activity, and customer attestation.", intent: "Maintain fairness and avoid channel conflict." },
149+
{ principle: "Sales Collaboration", description: "Partners must collaborate with Recast Sales for pricing and technical validation before final proposal submission.", intent: "Ensure consistency of messaging and technical accuracy." },
150+
{ principle: "Ethical Conduct", description: "All partners must adhere to Recast’s Code of Conduct and anti-bribery/anti-poaching policies.", intent: "Protect the integrity of the channel ecosystem." },
151+
{ principle: "Renewal Ownership", description: "Partner of Record retains renewal rights unless customer explicitly reassigns.", intent: "Encourage customer retention and lifecycle focus." },
152+
],
153+
bands: [
154+
{ band: "Band 1 – Full-Cycle Ownership", criteria: ["Partner sources and registers the lead.","Drives opportunity end-to-end (qualification → demo → close).","Requires minimal Recast sales or technical support.","Must be Preferred or Premier tier."], eligible: "Preferred, Premier", margin: "30%", example: "A Premier partner identifies an opportunity with a 1,000-user customer, performs demo, and closes deal without Recast sales involvement." },
155+
{ band: "Band 2 – Joint Engagement", criteria: ["Partner sources or registers opportunity.","Recast supports with presales, demo, or technical validation.","Partner co-sells with Recast sales team.","Must be Registered, Preferred, or Premier tier."], eligible: "Registered, Preferred, Premier", margin: "15%", example: "Partner brings opportunity but requests Recast SE to lead demo and pricing discussion." },
156+
{ band: "Band 3 – Transactional / Referral", criteria: ["Partner identifies or influences opportunity but Recast leads sale.","No significant partner engagement beyond intro or transaction.","Typically applies to LARs, transactional resellers, or referral agents.","Margin discretionary, subject to sales approval."], eligible: "Registered, LAR, Referral", margin: "5% (discretionary)", example: "Large LAR adds Recast SKU to customer renewal, minimal engagement." },
157+
],
158+
governance: [
159+
{ element: "Eligibility Window", definition: "Deal registration valid for 6 months (renewable upon active pipeline evidence)." },
160+
{ element: "Tier Multiplier", definition: "Preferred partners may receive a +2% bonus on renewal deals; Premier may receive +5%." },
161+
{ element: "Renewal Margin", definition: "Renewal margin standardized at 10% unless expansion occurs (then revert to Band 2)." },
162+
{ element: "Band Review", definition: "Margin bands reviewed quarterly to align with GTM priorities." },
163+
{ element: "Escalation Path", definition: "Channel disputes escalated to Director, Channel Programs within 5 business days." },
164+
],
165+
summary: [
166+
{ tier: "Premier", engagement: "Full-cycle (Band 1)", involvement: "Light-touch", range: "25–30%", notes: "Top-tier, full control of sales motion" },
167+
{ tier: "Preferred", engagement: "Joint sale (Band 2)", involvement: "Moderate", range: "10–15%", notes: "Co-sell and presales collaboration" },
168+
{ tier: "Registered / LAR", engagement: "Transactional (Band 3)", involvement: "High-touch / Recast-led", range: "0–5%", notes: "Finder’s fee or referral incentive" },
169+
],
170+
},
143171
}
144172
};
145173
const TIERS = ["Registered", "Preferred", "Premier"];
@@ -248,6 +276,13 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
248276
render();
249277
});
250278
}
279+
const roeButton = document.getElementById("roeButton");
280+
if (roeButton) {
281+
roeButton.addEventListener("click", () => {
282+
STATE.showROE = !STATE.showROE;
283+
render();
284+
});
285+
}
251286
}
252287
if (STATE.tab === "onboarding") {
253288
document.querySelectorAll("[data-step]").forEach((btn) => {
@@ -336,6 +371,10 @@ <h3 class="text-lg font-semibold">What you get</h3>
336371
<p class="mt-3 text-xs text-[#4A5568]">“Up to” indicates the maximum eligible margin given qualifiers & program standing.</p>
337372
`;
338373
}
374+
let roeHtml = '';
375+
if (STATE.showROE) {
376+
roeHtml = renderROE();
377+
}
339378
return `
340379
<div class="rounded-2xl border border-[#E2E8F0] bg-white p-5 shadow-md">
341380
<div class="flex items-start justify-between flex-col sm:flex-row gap-4">
@@ -356,6 +395,57 @@ <h3 class="text-lg font-semibold">Margins</h3>
356395
</div>
357396
</div>
358397
<div class="mt-3">${contentHtml}</div>
398+
<div class="mt-4">
399+
<button id="roeButton" class="rounded-full bg-[#0070F3] px-4 py-2 text-sm text-white hover:bg-[#005AD0] focus:outline-none focus:ring-2 focus:ring-[#0070F3] focus:ring-offset-2">
400+
${STATE.showROE ? 'Hide' : 'Show'} Rules of Engagement
401+
</button>
402+
</div>
403+
</div>
404+
${roeHtml}
405+
`;
406+
}
407+
function renderROE() {
408+
let principlesTable = '<table class="min-w-full divide-y divide-[#E2E8F0]"><thead><tr><th class="px-6 py-3 text-left text-sm font-semibold">Principle</th><th class="px-6 py-3 text-left text-sm font-semibold">Description</th><th class="px-6 py-3 text-left text-sm font-semibold">Intent</th></tr></thead><tbody class="divide-y divide-[#E2E8F0]">';
409+
STATE.model.roe.principles.forEach((p) => {
410+
principlesTable += `<tr><td class="px-6 py-4 text-sm font-medium">${p.principle}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${p.description}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${p.intent}</td></tr>`;
411+
});
412+
principlesTable += '</tbody></table>';
413+
let bandsTable = '<table class="min-w-full divide-y divide-[#E2E8F0]"><thead><tr><th class="px-6 py-3 text-left text-sm font-semibold">Band</th><th class="px-6 py-3 text-left text-sm font-semibold">Qualification Criteria</th><th class="px-6 py-3 text-left text-sm font-semibold">Partner Type Eligible</th><th class="px-6 py-3 text-left text-sm font-semibold">Margin (up to)</th><th class="px-6 py-3 text-left text-sm font-semibold">Example Scenario</th></tr></thead><tbody class="divide-y divide-[#E2E8F0]">';
414+
STATE.model.roe.bands.forEach((b) => {
415+
let criteriaHtml = '<ul class="list-disc pl-5 space-y-1">';
416+
b.criteria.forEach((c) => { criteriaHtml += `<li class="text-sm text-[#4A5568]">${c}</li>`; });
417+
criteriaHtml += '</ul>';
418+
bandsTable += `<tr><td class="px-6 py-4 text-sm font-medium">${b.band}</td><td class="px-6 py-4">${criteriaHtml}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${b.eligible}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${b.margin}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${b.example}</td></tr>`;
419+
});
420+
bandsTable += '</tbody></table>';
421+
let governanceTable = '<table class="min-w-full divide-y divide-[#E2E8F0]"><thead><tr><th class="px-6 py-3 text-left text-sm font-semibold">Element</th><th class="px-6 py-3 text-left text-sm font-semibold">Definition</th></tr></thead><tbody class="divide-y divide-[#E2E8F0]">';
422+
STATE.model.roe.governance.forEach((g) => {
423+
governanceTable += `<tr><td class="px-6 py-4 text-sm font-medium">${g.element}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${g.definition}</td></tr>`;
424+
});
425+
governanceTable += '</tbody></table>';
426+
let summaryTable = '<table class="min-w-full divide-y divide-[#E2E8F0]"><thead><tr><th class="px-6 py-3 text-left text-sm font-semibold">Partner Tier</th><th class="px-6 py-3 text-left text-sm font-semibold">Engagement Type</th><th class="px-6 py-3 text-left text-sm font-semibold">Typical Recast Involvement</th><th class="px-6 py-3 text-left text-sm font-semibold">Margin Range</th><th class="px-6 py-3 text-left text-sm font-semibold">Notes</th></tr></thead><tbody class="divide-y divide-[#E2E8F0]">';
427+
STATE.model.roe.summary.forEach((s) => {
428+
summaryTable += `<tr><td class="px-6 py-4 text-sm font-medium">${s.tier}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${s.engagement}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${s.involvement}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${s.range}</td><td class="px-6 py-4 text-sm text-[#4A5568]">${s.notes}</td></tr>`;
429+
});
430+
summaryTable += '</tbody></table>';
431+
return `
432+
<div class="mt-4 space-y-8">
433+
<div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
434+
<h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Rules of Engagement (ROE)</h3>
435+
<div class="overflow-x-auto">${principlesTable}</div>
436+
</div>
437+
<div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
438+
<h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Margin Bands & Definitions</h3>
439+
<div class="overflow-x-auto">${bandsTable}</div>
440+
</div>
441+
<div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
442+
<h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Partner Margin Governance</h3>
443+
<div class="overflow-x-auto">${governanceTable}</div>
444+
</div>
445+
<div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
446+
<h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Example Summary Table</h3>
447+
<div class="overflow-x-auto">${summaryTable}</div>
448+
</div>
359449
</div>
360450
`;
361451
}

0 commit comments

Comments
 (0)