✦ Premium · One-Time Payment

Your Complete
Sermon Prep Package

From passage to pulpit in minutes. AI-powered sermon prep built for pastors who take Scripture seriously.

Scripture Analysis Cross-References 3–5 Illustrations Full Outline Discussion Questions Worship Song Suggestions
⏱️

Saves 4–6 hours

What takes most pastors a week of research and outlining, delivered in under 2 minutes.

📖

Theologically grounded

Trained on biblical scholarship. Specify your tradition and denomination for tailored results.

✍️

Ready to personalize

A solid foundation you edit and make your own — not a generic sermon to read verbatim.

1
Your Details
2
Payment
3
Your Package

📝 Tell us about your sermon

Complete Package
$29
One-time · Instant delivery
🔒 Secure checkout ↩ 7-day refund ⚡ Instant delivery
📜

Your package will appear here

Fill out your sermon details and pay $29 to unlock your complete preparation package.

Preparing your package...

Analyzing scripture, finding cross-references, and building your outline. About 30–60 seconds.

📜 Your Sermon Prep Package ✓ Complete
🤖 AI-Generated Sermon Prep Package — verify all scripture references, cross-references, and theological claims independently before preaching
🔬 Want the deep background research?
Translation comparison, commentary context, parallel passages, and historical background — the Sermon Research Agent covers the study side. $19 one-time.
Get Research Brief — $19 →
⚠️ AI-generated content. May contain errors including incorrect scripture references. Verify all references and theological claims independently. Full Disclaimer
`; const blob = new Blob([html], { type: 'text/html' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `sermon-prep-${passage.replace(/[^a-z0-9]/gi, '-').toLowerCase()}.html`; a.click(); URL.revokeObjectURL(url); } function markStep(num, state) { const el = document.getElementById(`step${num}`); if (!el) return; el.className = 'spp-step ' + state; } // ── Error Report Modal ──────────────────────────────────────────────── function openErrorReport(outputType) { document.getElementById('error-report-modal').style.display = 'flex'; document.getElementById('error-report-type').value = outputType; document.getElementById('error-report-description').value = ''; document.getElementById('error-report-email').value = ''; document.getElementById('error-report-feedback').style.display = 'none'; document.getElementById('error-report-feedback').textContent = ''; } function closeErrorReport() { document.getElementById('error-report-modal').style.display = 'none'; } async function submitErrorReport(e) { e.preventDefault(); const description = document.getElementById('error-report-description').value.trim(); const email = document.getElementById('error-report-email').value.trim(); const outputType = document.getElementById('error-report-type').value; const btn = document.getElementById('error-report-submit'); const feedback = document.getElementById('error-report-feedback'); if (!description) { feedback.style.display = 'block'; feedback.style.color = '#e74c3c'; feedback.textContent = 'Please describe the error.'; return; } btn.disabled = true; btn.textContent = 'Submitting...'; feedback.style.display = 'none'; try { const res = await fetch('/api/error-reports', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ page_url: window.location.href, output_type: outputType, error_description: description, user_email: email || null }) }); const data = await res.json(); if (data.success) { feedback.style.display = 'block'; feedback.style.color = '#16a34a'; feedback.textContent = '✓ Report submitted. Thank you for helping improve accuracy!'; btn.textContent = 'Submitted'; setTimeout(closeErrorReport, 2500); } else { throw new Error(data.message || 'Submission failed'); } } catch (err) { feedback.style.display = 'block'; feedback.style.color = '#e74c3c'; feedback.textContent = err.message || 'Something went wrong. Please try again.'; btn.disabled = false; btn.textContent = 'Submit Report'; } } document.addEventListener('click', function(e) { const modal = document.getElementById('error-report-modal'); if (modal && e.target === modal) closeErrorReport(); });