Public Speaking Engagement Contract Points Generator
The subject matter the speaker is expected to cover.
When are payments due? (e.g., Deposit, Final Payment)
What costs will the organizer cover? (e.g., Flight class, hotel nights)
Who owns the presentation slides and content?
Can the event be recorded? If so, how can the video be used?
Specify AV needs (microphone, screen ratio, internet, etc.).
What happens if the organizer cancels the engagement?
What happens in case of uncontrollable events (e.g., illness, natural disaster)?
Review your generated contract points below.
Click "Next" or "Previous" to refresh this preview.
Organizer: ${escapeHTML(data.org)}
Event: ${escapeHTML(data.event)}
Date: ${escapeHTML(data.date)}
Agreed Topic: ${escapeHTML(data.topic)}
2. Financial Terms (USD $)
Fee: ${escapeHTML(data.fee)}
Payment Schedule:
${formatTextToP(data.paymentTerms)}Travel/Accommodation:
${formatTextToP(data.travelCovered)}Incidentals/Expense Limit: ${escapeHTML(data.expensesLimit)}
3. Content & Intellectual Property (IP)
IP Rights:
${formatTextToP(data.ip)}Recording/Distribution Rights:
${formatTextToP(data.recording)}Promotional Material Use:
${formatTextToP(data.materials)}4. Logistics & Contingency
Technical Requirements:
${formatTextToP(data.techNeeds)}Cancellation (Organizer):
${formatTextToP(data.cancellation)}Force Majeure / Inability to Perform:
${formatTextToP(data.forceMajeure)} `; }; // --- Download Functions --- const getTxtContent = () => { const data = getContractData(); let content = `PUBLIC SPEAKING ENGAGEMENT CONTRACT POINTS\n`; content += `================================================\n\n`; content += `1. PARTIES & ENGAGEMENT OVERVIEW\n`; content += `------------------------------------------------\n`; content += `Speaker: ${data.speaker}\n`; content += `Organizer: ${data.org}\n`; content += `Event: ${data.event}\n`; content += `Date: ${data.date}\n`; content += `Topic: ${data.topic}\n\n`; content += `2. FINANCIAL TERMS (USD $)\n`; content += `------------------------------------------------\n`; content += `Fee: ${data.fee}\n`; content += `Payment Schedule:\n${formatTextPlain(data.paymentTerms)}\n`; content += `Travel/Accommodation:\n${formatTextPlain(data.travelCovered)}\n`; content += `Expense Limit: ${data.expensesLimit}\n\n`; content += `3. CONTENT & IP RIGHTS\n`; content += `------------------------------------------------\n`; content += `IP Rights:\n${formatTextPlain(data.ip)}\n`; content += `Recording Rights:\n${formatTextPlain(data.recording)}\n`; content += `Material Use:\n${formatTextPlain(data.materials)}\n\n`; content += `4. LOGISTICS & CONTINGENCY\n`; content += `------------------------------------------------\n`; content += `Technical Needs:\n${formatTextPlain(data.techNeeds)}\n`; content += `Cancellation:\n${formatTextPlain(data.cancellation)}\n`; content += `Force Majeure:\n${formatTextPlain(data.forceMajeure)}\n\n`; content += `NOTE: This is not a legal contract. Consult an attorney for final drafting.`; return content; }; const downloadTxt = () => { const txtContent = getTxtContent(); const blob = new Blob([txtContent], { type: 'text/plain;charset=utf-8' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = `contract_points_${inputs.event.value.replace(/ /g, '_') || 'speaking'}.txt`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(a.href); }; const downloadPDF = () => { if (typeof window.jspdf === 'undefined' || typeof window.jspdf.jsPDF === 'undefined') { alert('Error: jsPDF library not loaded.'); return; } const { jsPDF } = window.jspdf; const doc = new jsPDF('p', 'mm', 'a4'); const data = getContractData(); const margin = 20; const pageWidth = doc.internal.pageSize.getWidth(); const usableWidth = pageWidth - (margin * 2); let yPos = 25; const addSectionTitle = (title) => { if (yPos > 265) { doc.addPage(); yPos = 20; } yPos += 5; doc.setFontSize(14); doc.setFont(undefined, 'bold'); doc.setTextColor(156, 39, 176); // Purple doc.text(title, margin, yPos); yPos += 6; doc.setDrawColor(200, 200, 200); doc.setLineWidth(0.5); doc.line(margin, yPos, pageWidth - margin, yPos); yPos += 5; }; const addText = (label, text, isList = false) => { if (yPos > 275) { doc.addPage(); yPos = 20; } doc.setFontSize(10); doc.setFont(undefined, 'bold'); doc.setTextColor(44, 62, 80); const labelText = `${label} `; doc.text(labelText, margin, yPos); doc.setFont(undefined, 'normal'); doc.setTextColor(52, 73, 94); if (isList) { const lines = text.split('\n').filter(line => line.trim() !== ''); lines.forEach(line => { yPos = addText('•', line.trim(), false); }); } else { const splitText = doc.splitTextToSize(text, usableWidth - doc.getTextWidth(labelText)); doc.text(splitText, margin + doc.getTextWidth(labelText), yPos); yPos += (splitText.length * 5) + 2; } return yPos; }; const addListClause = (title, text) => { if (yPos > 270) { doc.addPage(); yPos = 20; } doc.setFontSize(11); doc.setFont(undefined, 'bold'); doc.setTextColor(52, 73, 94); doc.text(title, margin, yPos); yPos += 5; const lines = text.split('\n').filter(line => line.trim() !== ''); lines.forEach(line => { doc.setFont(undefined, 'normal'); doc.setFontSize(10); const bullet = '•'; const bulletWidth = doc.getTextWidth(bullet + ' '); const splitText = doc.splitTextToSize(line.trim(), usableWidth - bulletWidth - 5); if (yPos + (splitText.length * 4) > 275) { doc.addPage(); yPos = 20; } doc.text(bullet, margin + 2, yPos); doc.text(splitText, margin + 2 + bulletWidth, yPos); yPos += (splitText.length * 4) + 2; }); yPos += 3; }; // 1. TITLE doc.setFontSize(22); doc.setFont(undefined, 'bold'); doc.setTextColor(44, 62, 80); doc.text(`SPEAKING ENGAGEMENT CONTRACT POINTS`, pageWidth / 2, yPos, { align: 'center' }); yPos += 12; // 2. OVERVIEW addSectionTitle('1. PARTIES & ENGAGEMENT OVERVIEW'); yPos = addText('Speaker:', data.speaker, yPos); yPos = addText('Organizer:', data.org, yPos); yPos = addText('Event:', data.event, yPos); yPos = addText('Date:', data.date, yPos); yPos = addText('Agreed Topic:', data.topic, yPos); // 3. FINANCIAL addSectionTitle('2. FINANCIAL TERMS'); yPos = addText('Fee:', data.fee, yPos); addListClause('Payment Schedule:', data.paymentTerms); addListClause('Travel & Accommodation:', data.travelCovered); yPos = addText('Expense Limit:', data.expensesLimit, yPos); // 4. IP addSectionTitle('3. CONTENT & IP RIGHTS'); addListClause('IP Rights:', data.ip); addListClause('Recording/Distribution:', data.recording); addListClause('Promotional Use:', data.materials); // 5. LOGISTICS addSectionTitle('4. LOGISTICS & CONTINGENCY'); addListClause('Technical Requirements:', data.techNeeds); addListClause('Cancellation Clause:', data.cancellation); addListClause('Force Majeure:', data.forceMajeure); // 6. FOOTER doc.setFontSize(8); doc.setFont(undefined, 'italic'); doc.setTextColor(150, 150, 150); doc.text("Disclaimer: This document is an outline of business terms only and is NOT a legally binding contract. Consult an attorney for formal legal drafting.", margin, 290); doc.save(`contract_points_${data.event.replace(/ /g, '_') || 'speaking'}.pdf`); }; // --- Event Listeners --- tabButtons.forEach((btn, index) => { btn.addEventListener('click', () => showTab(index + 1)); }); nextBtn.addEventListener('click', () => showTab(currentTab + 1)); prevBtn.addEventListener('click', () => showTab(currentTab - 1)); downloadPdfBtn.addEventListener('click', downloadPDF); downloadTxtBtn.addEventListener('click', downloadTxt); // --- Initialization --- // Pre-populate with US-centric sample data inputs.speaker.value = "Dr. Eliza Vance"; inputs.org.value = "FutureTech Conference Inc."; inputs.event.value = "Annual Innovation Keynote"; inputs.date.value = "November 10, 2026"; inputs.topic.value = "The ethics of AI in research and development."; inputs.fee.value = "$15,000.00"; inputs.paymentTerms.value = "50% deposit due 30 days after signing.\nFinal 50% due on the day of the event."; inputs.travelCovered.value = "Business Class flights from Chicago, IL.\n3 nights at the Hilton Hotel, fully covered."; inputs.expensesLimit.value = "$750 (Meals and ground transport)"; inputs.ip.value = "Speaker retains all intellectual property rights.\nOrganizer receives a limited, non-commercial license for presentation use only."; inputs.recording.value = "Recording is permitted.\nOrganizer may use the video for internal training indefinitely.\nExternal marketing use requires written speaker approval."; inputs.materials.value = "Organizer may use speaker bio, photo, and approved quotes for marketing materials only."; inputs.techNeeds.value = "High-resolution LED screen (16:9 ratio).\nWireless lapel microphone.\nDedicated stage lighting (no backlighting)."; inputs.cancellation.value = "If Organizer cancels less than 60 days out, 75% of the full fee is due.\nIf Speaker cancels due to illness, the event must be rescheduled within 90 days."; inputs.forceMajeure.value = "If Force Majeure prevents the event, all fees paid are fully refundable.\nBoth parties are relieved of obligations."; showTab(1); });