YSM // YOUTH SOCCER MARKETING
Services Blog Resources Contact
'; html += '
'; html += '

Club Startup Plan

'; html += '
' + esc(cn) + '
'; html += '
Generated ' + esc(dateStr) + '
'; html += '
'; // 1. Research html += '

1. Market Research

'; var yesC = 0; for (var ri = 0; ri < researchItems.length; ri++) { if (state.researchChecklist[ri] === 'yes') yesC++; } if (yesC === 0 && Object.keys(state.researchChecklist).length === 0) { html += '

Checklist not started.

'; } else { var pctR = Math.round((yesC / researchItems.length) * 100); var rbadge = pctR >= 80 ? 'green' : pctR >= 50 ? 'amber' : 'red'; html += '' + yesC + ' of ' + researchItems.length + ' complete (' + pctR + '%)'; html += ''; for (var rj = 0; rj < researchItems.length; rj++) { var rv = state.researchChecklist[rj]; var rs = rv === 'yes' ? 'Yes' : rv === 'no' ? 'No' : '-'; html += ''; } html += '
Research ItemStatus
' + esc(researchItems[rj]) + '' + rs + '
'; } // 2. Club Identity html += '

2. Club Identity

'; if (ci.name || ci.primaryUSP || ci.philosophy) { html += '
'; html += '
' + esc(ci.name || 'Unnamed Club') + '
'; if (ci.primaryUSP) html += '

USP: ' + esc(ci.primaryUSP) + '

'; var ages = []; for (var ag = 0; ag < ageGroupOptions.length; ag++) { if (ci.ageGroups[ageGroupOptions[ag].key]) ages.push(ageGroupOptions[ag].label); } if (ages.length > 0) html += '

Age Groups: ' + esc(ages.join(', ')) + '

'; if (ci.model) html += '

Model: ' + esc(ci.model === 'inclusive' ? 'Inclusive (multiple teams per age group)' : 'Selective (tryout-based)') + '

'; if (ci.philosophy) html += '

Philosophy: ' + esc(ci.philosophy) + '

'; html += '
'; } else { html += '

Not yet defined.

'; } // 3. Affiliation html += '

3. Affiliation Pathway

'; if (state.affiliationQuiz.result) { var ar = affResultData[state.affiliationQuiz.result]; html += '
' + esc(ar.title) + '
'; html += '

' + esc(ar.why) + '

'; html += '

Next Steps

'; } else { html += '

Quiz not completed.

'; } // 4. Facility html += '

4. Facility Costs

'; var f = state.facility; var facAnnual = getFacilityAnnual(); var dlSharing = Math.max(1, num(f.teamsSharing)); var dlEffRate = num(f.costPerHour) / dlSharing; var weekly = dlEffRate * num(f.hoursPerWeek) * num(f.numTeams); var monthly = weekly * 4.33; var perTeam = num(f.numTeams) > 0 ? monthly / num(f.numTeams) : 0; html += '
'; html += '

Field Type: ' + esc(f.fieldType) + ' • Teams: ' + num(f.numTeams) + ' • Hours/team/week: ' + num(f.hoursPerWeek) + ' • Months: ' + num(f.monthsPerYear) + (dlSharing > 1 ? ' • Sharing: ' + dlSharing + ' teams/field' : '') + '

'; html += '
Weekly' + fmt(weekly) + '
'; html += '
Monthly' + fmt(monthly) + '
'; html += '
Annual' + fmt(facAnnual) + '
'; html += '
Per Team / Month' + fmt(perTeam) + '
'; html += '
'; // 5. Budget html += '

5. Budget Summary

'; var bb = state.budget; var nTeams = Math.max(1, num(f.numTeams)); var leagueTotal = num(bb.leagueFeesPerTeam) * nTeams; var tourneyTotal = num(bb.tournamentFeesPerTeam) * num(bb.tournamentsPerTeam) * nTeams; var coachTotal = num(bb.coachSalary) * num(bb.numCoaches); var totalExp = facAnnual + leagueTotal + tourneyTotal + coachTotal + num(bb.equipment) + num(bb.insurance) + num(bb.sanctioningFees) + num(bb.scholarshipFund); var totalRev = num(bb.numPlayers) * num(bb.playerFee); var netDl = totalRev - totalExp; html += '
'; html += '

Expenses

'; html += '
Facility' + fmt(facAnnual) + '
'; html += '
League Fees (' + nTeams + ' teams)' + fmt(leagueTotal) + '
'; html += '
Tournaments (' + num(bb.tournamentsPerTeam) + '/team x ' + nTeams + ' teams)' + fmt(tourneyTotal) + '
'; html += '
Coaching (' + num(bb.numCoaches) + ' coaches)' + fmt(coachTotal) + '
'; html += '
Equipment & Uniforms' + fmt(num(bb.equipment)) + '
'; html += '
Insurance' + fmt(num(bb.insurance)) + '
'; html += '
Sanctioning Fees' + fmt(num(bb.sanctioningFees)) + '
'; html += '
Scholarship Fund' + fmt(num(bb.scholarshipFund)) + '
'; html += '
Total Expenses' + fmt(totalExp) + '
'; html += '

Revenue

'; html += '
' + num(bb.numPlayers) + ' players x ' + fmt(num(bb.playerFee)) + '' + fmt(totalRev) + '
'; html += '
Net' + (netDl >= 0 ? '+' : '') + fmt(netDl) + '
'; if (num(bb.playerFee) > 0) { var bep = Math.ceil(totalExp / num(bb.playerFee)); html += '

Break-even: ' + bep + ' players at ' + fmt(num(bb.playerFee)) + '/player

'; } if (num(bb.numPlayers) > 0) { var sf = Math.ceil(totalExp / num(bb.numPlayers)); html += '

Suggested fee to break even: ' + fmt(sf) + '/player

'; } html += '
'; // 6. Your Why html += '

6. Your Why

'; if (state.fiveWhys.why5) { html += '
“' + esc(state.fiveWhys.why5) + '”
'; if (state.fiveWhys.why1) { html += '

Full Five Whys

'; for (var wi = 1; wi <= 5; wi++) { var wv = state.fiveWhys['why' + wi]; if (wv) html += '

' + wi + '. ' + esc(wv) + '

'; } } } else { html += '

Exercise not completed.

'; } // Next Steps html += '

Next Steps

'; var actions = []; if (yesC < researchItems.length) actions.push('Finish your market research: ' + (researchItems.length - yesC) + ' items remaining.'); if (!ci.name) actions.push('Name your club and define your USP in the Club Identity Builder.'); if (state.affiliationQuiz.result) { actions.push('Begin the ' + affResultData[state.affiliationQuiz.result].title + ' registration process.'); } else { actions.push('Take the Affiliation Pathway quiz to determine your sanctioning path.'); } actions.push('Secure field time: contact local park districts and turf facilities.'); if (netDl < 0) actions.push('Close the budget gap: increase player fees, add players, or reduce expenses.'); actions.push('Set a launch date and commit to it. Done is better than perfect.'); for (var ap = 0; ap < actions.length; ap++) { html += '
' + (ap + 1) + '

' + esc(actions[ap]) + '

'; } html += ''; html += '