@extends('layouts.public') @section('title', 'Self-Hosted Email Marketing Platform') @section('pageId', 'home-1') @section('content') @php try { $heroDescription = (string) \App\Models\Setting::get('home_1_hero_description', 'Host it yourself, run it as SaaS, or manage clients. MailPurse gives you complete control over your email infrastructure with enterprise-grade features.'); $heroScrollText = (string) \App\Models\Setting::get('home_1_hero_scroll_text', ''); $heroButtonText = (string) \App\Models\Setting::get('home_1_hero_button_text', 'Get Started Free'); $heroButtonType = (string) \App\Models\Setting::get('home_1_hero_button_type', 'link'); $heroButtonUrl = (string) \App\Models\Setting::get('home_1_hero_button_url', route('register')); $heroImagePath = (string) \App\Models\Setting::get('home_1_hero_image', ''); } catch (\Throwable $e) { $heroDescription = 'Host it yourself, run it as SaaS, or manage clients. MailPurse gives you complete control over your email infrastructure with enterprise-grade features.'; $heroScrollText = ''; $heroButtonText = 'Get Started Free'; $heroButtonType = 'link'; $heroButtonUrl = route('register'); $heroImagePath = ''; } $brandingDisk = (string) config('filesystems.branding_disk', 'public'); $heroImageUrl = (is_string($heroImagePath) && trim($heroImagePath) !== '') ? \Illuminate\Support\Facades\Storage::disk($brandingDisk)->url($heroImagePath) : null; $heroButtonUrl = is_string($heroButtonUrl) && trim($heroButtonUrl) !== '' ? $heroButtonUrl : route('register'); $heroButtonType = in_array($heroButtonType, ['link', 'video'], true) ? $heroButtonType : 'link'; try { $logoPaths = \App\Models\Setting::get('home_1_logos', []); } catch (\Throwable $e) { $logoPaths = []; } $logoPaths = is_array($logoPaths) ? $logoPaths : []; $logoUrls = []; foreach ($logoPaths as $p) { if (!is_string($p) || trim($p) === '') { continue; } $logoUrls[] = \Illuminate\Support\Facades\Storage::disk($brandingDisk)->url($p); } try { $featuresTitle = (string) \App\Models\Setting::get('home_1_features_title', 'Everything you need to run email marketing at scale'); $featuresSubtitle = (string) \App\Models\Setting::get('home_1_features_subtitle', "Whether you're sending for yourself or running a full SaaS business, MailPurse has you covered."); $features1Title = (string) \App\Models\Setting::get('home_1_features_1_title', 'Multi-Tenant SaaS Ready'); $features1Description = (string) \App\Models\Setting::get('home_1_features_1_description', 'Run your own email marketing SaaS. Manage customers, plans, billing, and permissions from a powerful admin panel.'); $features2Title = (string) \App\Models\Setting::get('home_1_features_2_title', 'Campaigns & Automation'); $features2Description = (string) \App\Models\Setting::get('home_1_features_2_description', 'Create one-time campaigns, recurring sends, or automated drip sequences. Drag-and-drop editor with responsive templates.'); $features3Title = (string) \App\Models\Setting::get('home_1_features_3_title', 'List Management'); $features3Description = (string) \App\Models\Setting::get('home_1_features_3_description', 'Unlimited lists with custom fields, tags, and segments. Import/export CSV, double opt-in, and GDPR compliance built-in.'); $features4Title = (string) \App\Models\Setting::get('home_1_features_4_title', 'Multiple Delivery Servers'); $features4Description = (string) \App\Models\Setting::get('home_1_features_4_description', 'Connect Amazon SES, Mailgun, SendGrid, Postmark, SparkPost, or any SMTP. Load balance and rotate for maximum deliverability.'); $features5Title = (string) \App\Models\Setting::get('home_1_features_5_title', 'Real-Time Analytics'); $features5Description = (string) \App\Models\Setting::get('home_1_features_5_description', 'Track opens, clicks, bounces, and unsubscribes in real-time. Detailed reports with geographic and device insights.'); $features6Title = (string) \App\Models\Setting::get('home_1_features_6_title', 'Built-in Billing'); $features6Description = (string) \App\Models\Setting::get('home_1_features_6_description', 'Accept payments via Stripe, PayPal, or Paystack. Create plans, manage subscriptions, generate invoices automatically.'); $aiBadge = (string) \App\Models\Setting::get('home_1_ai_badge', 'AI-Powered'); $aiTitle = (string) \App\Models\Setting::get('home_1_ai_title', 'Write better emails with AI'); $aiSubtitle = (string) \App\Models\Setting::get('home_1_ai_subtitle', 'Generate compelling subject lines, email copy, and calls-to-action in seconds.'); $ai1Title = (string) \App\Models\Setting::get('home_1_ai_1_title', 'AI Content Generator'); $ai1Description = (string) \App\Models\Setting::get('home_1_ai_1_description', 'Describe what you want to say and let AI craft the perfect email copy. Supports multiple tones and styles.'); $ai2Title = (string) \App\Models\Setting::get('home_1_ai_2_title', 'Subject Line Optimizer'); $ai2Description = (string) \App\Models\Setting::get('home_1_ai_2_description', 'Generate multiple subject line variations optimized for opens. A/B test with confidence.'); $howTitle = (string) \App\Models\Setting::get('home_1_how_title', 'Get started in minutes'); $howSubtitle = (string) \App\Models\Setting::get('home_1_how_subtitle', 'Deploy on your own server and start sending emails right away.'); $how1Title = (string) \App\Models\Setting::get('home_1_how_1_title', 'Install & Configure'); $how1Description = (string) \App\Models\Setting::get('home_1_how_1_description', 'Upload to your server, run the installer, and configure your settings. Works on any PHP 8.2+ hosting.'); $how2Title = (string) \App\Models\Setting::get('home_1_how_2_title', 'Connect Email Providers'); $how2Description = (string) \App\Models\Setting::get('home_1_how_2_description', 'Add your delivery servers — Amazon SES, Mailgun, SendGrid, or any SMTP. Configure sending domains.'); $how3Title = (string) \App\Models\Setting::get('home_1_how_3_title', 'Start Sending'); $how3Description = (string) \App\Models\Setting::get('home_1_how_3_description', 'Create lists, import subscribers, design campaigns, and start sending. Or invite customers to your SaaS.'); } catch (\Throwable $e) { $featuresTitle = 'Everything you need to run email marketing at scale'; $featuresSubtitle = "Whether you're sending for yourself or running a full SaaS business, MailPurse has you covered."; $features1Title = 'Multi-Tenant SaaS Ready'; $features1Description = 'Run your own email marketing SaaS. Manage customers, plans, billing, and permissions from a powerful admin panel.'; $features2Title = 'Campaigns & Automation'; $features2Description = 'Create one-time campaigns, recurring sends, or automated drip sequences. Drag-and-drop editor with responsive templates.'; $features3Title = 'List Management'; $features3Description = 'Unlimited lists with custom fields, tags, and segments. Import/export CSV, double opt-in, and GDPR compliance built-in.'; $features4Title = 'Multiple Delivery Servers'; $features4Description = 'Connect Amazon SES, Mailgun, SendGrid, Postmark, SparkPost, or any SMTP. Load balance and rotate for maximum deliverability.'; $features5Title = 'Real-Time Analytics'; $features5Description = 'Track opens, clicks, bounces, and unsubscribes in real-time. Detailed reports with geographic and device insights.'; $features6Title = 'Built-in Billing'; $features6Description = 'Accept payments via Stripe, PayPal, or Paystack. Create plans, manage subscriptions, generate invoices automatically.'; $aiBadge = 'AI-Powered'; $aiTitle = 'Write better emails with AI'; $aiSubtitle = 'Generate compelling subject lines, email copy, and calls-to-action in seconds.'; $ai1Title = 'AI Content Generator'; $ai1Description = 'Describe what you want to say and let AI craft the perfect email copy. Supports multiple tones and styles.'; $ai2Title = 'Subject Line Optimizer'; $ai2Description = 'Generate multiple subject line variations optimized for opens. A/B test with confidence.'; $howTitle = 'Get started in minutes'; $howSubtitle = 'Deploy on your own server and start sending emails right away.'; $how1Title = 'Install & Configure'; $how1Description = 'Upload to your server, run the installer, and configure your settings. Works on any PHP 8.2+ hosting.'; $how2Title = 'Connect Email Providers'; $how2Description = 'Add your delivery servers — Amazon SES, Mailgun, SendGrid, or any SMTP. Configure sending domains.'; $how3Title = 'Start Sending'; $how3Description = 'Create lists, import subscribers, design campaigns, and start sending. Or invite customers to your SaaS.'; } try { $faqTitle = (string) \App\Models\Setting::get('home_faq_title', 'Frequently asked questions'); $faqSubtitle = (string) \App\Models\Setting::get('home_faq_subtitle', 'Quick answers to common questions.'); $faq1Question = (string) \App\Models\Setting::get('home_faq_1_question', 'What are the server requirements?'); $faq1Answer = (string) \App\Models\Setting::get('home_faq_1_answer', 'PHP 8.2+, MySQL database, and a web server (Apache/Nginx). Redis is recommended for queues. Works on shared hosting, VPS, or dedicated servers.'); $faq2Question = (string) \App\Models\Setting::get('home_faq_2_question', 'Can I run this as a SaaS for my clients?'); $faq2Answer = (string) \App\Models\Setting::get('home_faq_2_answer', 'Absolutely! MailPurse is built for multi-tenancy. Create customer accounts, define plans with limits, accept payments via Stripe/PayPal/Paystack, and let customers manage their own lists and campaigns.'); $faq3Question = (string) \App\Models\Setting::get('home_faq_3_question', 'Which email providers are supported?'); $faq3Answer = (string) \App\Models\Setting::get('home_faq_3_answer', 'Amazon SES, Mailgun, SendGrid, Postmark, SparkPost, and any standard SMTP server. You can configure multiple providers and rotate between them for better deliverability.'); $faq4Question = (string) \App\Models\Setting::get('home_faq_4_question', 'Is there a limit on subscribers or emails?'); $faq4Answer = (string) \App\Models\Setting::get('home_faq_4_answer', 'No limits from our side. You can send as many emails as your server and email provider allow. The only limits are what you define in your customer plans.'); } catch (\Throwable $e) { $faqTitle = 'Frequently asked questions'; $faqSubtitle = 'Quick answers to common questions.'; $faq1Question = 'What are the server requirements?'; $faq1Answer = 'PHP 8.2+, MySQL database, and a web server (Apache/Nginx). Redis is recommended for queues. Works on shared hosting, VPS, or dedicated servers.'; $faq2Question = 'Can I run this as a SaaS for my clients?'; $faq2Answer = 'Absolutely! MailPurse is built for multi-tenancy. Create customer accounts, define plans with limits, accept payments via Stripe/PayPal/Paystack, and let customers manage their own lists and campaigns.'; $faq3Question = 'Which email providers are supported?'; $faq3Answer = 'Amazon SES, Mailgun, SendGrid, Postmark, SparkPost, and any standard SMTP server. You can configure multiple providers and rotate between them for better deliverability.'; $faq4Question = 'Is there a limit on subscribers or emails?'; $faq4Answer = 'No limits from our side. You can send as many emails as your server and email provider allow. The only limits are what you define in your customer plans.'; } try { $pricingBadge = (string) \App\Models\Setting::get('home_pricing_badge', 'Our Pricing'); $pricingTitle = (string) \App\Models\Setting::get('home_pricing_title', 'Choose Your Perfect Plan'); $pricingSubtitle = (string) \App\Models\Setting::get('home_pricing_subtitle', 'Pick the MailPurse plan that fits your email marketing goals'); $pricingToggleMonthly = (string) \App\Models\Setting::get('home_pricing_toggle_monthly', 'Pay Monthly'); $pricingToggleAnnual = (string) \App\Models\Setting::get('home_pricing_toggle_annual', 'Pay Annually'); $pricingToggleSave = (string) \App\Models\Setting::get('home_pricing_toggle_save', '(save 20%)'); $pricingPopularBadge = (string) \App\Models\Setting::get('home_pricing_popular_badge', 'Popular'); $pricingCardCtaText = (string) \App\Models\Setting::get('home_pricing_card_cta_text', 'Get Started'); $pricingCard1Title = (string) \App\Models\Setting::get('home_pricing_card_1_title', 'Starter'); $pricingCard1Description = (string) \App\Models\Setting::get('home_pricing_card_1_description', 'For individuals, and early-stage startups'); $pricingCard2Title = (string) \App\Models\Setting::get('home_pricing_card_2_title', 'Growth'); $pricingCard2Description = (string) \App\Models\Setting::get('home_pricing_card_2_description', 'For individuals, and early-stage startups'); $pricingCard3Title = (string) \App\Models\Setting::get('home_pricing_card_3_title', 'Scale'); $pricingCard3Description = (string) \App\Models\Setting::get('home_pricing_card_3_description', 'For individuals, and early-stage startups'); $pricingCard1CtaText = (string) \App\Models\Setting::get('home_pricing_card_1_cta_text', $pricingCardCtaText); $pricingCard2CtaText = (string) \App\Models\Setting::get('home_pricing_card_2_cta_text', $pricingCardCtaText); $pricingCard3CtaText = (string) \App\Models\Setting::get('home_pricing_card_3_cta_text', $pricingCardCtaText); $ctaTitle = (string) \App\Models\Setting::get('home_cta_title', 'Take control of your email marketing'); $ctaSubtitle = (string) \App\Models\Setting::get('home_cta_subtitle', 'Stop paying monthly fees. Own your platform, own your data, and scale without limits.'); $ctaPrimaryText = (string) \App\Models\Setting::get('home_cta_primary_text', 'Get Started Free'); $ctaPrimaryUrl = (string) \App\Models\Setting::get('home_cta_primary_url', route('register')); $ctaSecondaryText = (string) \App\Models\Setting::get('home_cta_secondary_text', 'View on CodeCanyon'); $ctaSecondaryUrl = (string) \App\Models\Setting::get('home_cta_secondary_url', 'https://codecanyon.net/item/mailpurse-selfhosted-email-automation-marketing-saas/61213414'); } catch (\Throwable $e) { $pricingBadge = 'Our Pricing'; $pricingTitle = 'Choose Your Perfect Plan'; $pricingSubtitle = 'Pick the MailPurse plan that fits your email marketing goals'; $pricingToggleMonthly = 'Pay Monthly'; $pricingToggleAnnual = 'Pay Annually'; $pricingToggleSave = '(save 20%)'; $pricingPopularBadge = 'Popular'; $pricingCardCtaText = 'Get Started'; $pricingCard1Title = 'Starter'; $pricingCard1Description = 'For individuals, and early-stage startups'; $pricingCard2Title = 'Growth'; $pricingCard2Description = 'For individuals, and early-stage startups'; $pricingCard3Title = 'Scale'; $pricingCard3Description = 'For individuals, and early-stage startups'; $pricingCard1CtaText = $pricingCardCtaText; $pricingCard2CtaText = $pricingCardCtaText; $pricingCard3CtaText = $pricingCardCtaText; $ctaTitle = 'Take control of your email marketing'; $ctaSubtitle = 'Stop paying monthly fees. Own your platform, own your data, and scale without limits.'; $ctaPrimaryText = 'Get Started Free'; $ctaPrimaryUrl = route('register'); $ctaSecondaryText = 'View on CodeCanyon'; $ctaSecondaryUrl = 'https://codecanyon.net/item/mailpurse-selfhosted-email-automation-marketing-saas/61213414'; } $ctaPrimaryUrl = is_string($ctaPrimaryUrl) && trim($ctaPrimaryUrl) !== '' ? $ctaPrimaryUrl : route('register'); $ctaSecondaryUrl = is_string($ctaSecondaryUrl) && trim($ctaSecondaryUrl) !== '' ? $ctaSecondaryUrl : 'https://codecanyon.net/item/mailpurse-selfhosted-email-automation-marketing-saas/61213414'; $pricingPlansMonthly = \App\Models\Plan::query() ->where('is_active', true) ->where('billing_cycle', 'monthly') ->orderBy('price') ->limit(3) ->get(); $pricingPlansYearly = \App\Models\Plan::query() ->where('is_active', true) ->where('billing_cycle', 'yearly') ->orderBy('price') ->limit(3) ->get(); $pricingAnnualDefault = $pricingPlansMonthly->count() === 0 && $pricingPlansYearly->count() > 0; try { $pricingSectionBadge = (string) \App\Models\Setting::get('pricing_section_badge', $pricingBadge); $pricingSectionTitle = (string) \App\Models\Setting::get('pricing_section_title', $pricingTitle); $pricingSectionSubtitle = (string) \App\Models\Setting::get('pricing_section_subtitle', $pricingSubtitle); $pricingSectionToggleMonthly = (string) \App\Models\Setting::get('pricing_section_toggle_monthly', $pricingToggleMonthly); $pricingSectionToggleAnnual = (string) \App\Models\Setting::get('pricing_section_toggle_annual', $pricingToggleAnnual); $pricingSectionToggleSave = (string) \App\Models\Setting::get('pricing_section_toggle_save', $pricingToggleSave); $pricingSectionPopularBadge = (string) \App\Models\Setting::get('pricing_section_popular_badge', $pricingPopularBadge); } catch (\Throwable $e) { $pricingSectionBadge = $pricingBadge; $pricingSectionTitle = $pricingTitle; $pricingSectionSubtitle = $pricingSubtitle; $pricingSectionToggleMonthly = $pricingToggleMonthly; $pricingSectionToggleAnnual = $pricingToggleAnnual; $pricingSectionToggleSave = $pricingToggleSave; $pricingSectionPopularBadge = $pricingPopularBadge; } @endphp
Self-Hosted · Your Data, Your Control

The email marketing platform you actually own

{{ $heroDescription }}

@if(is_string($heroScrollText) && trim($heroScrollText) !== '')

{{ $heroScrollText }}

@endif
100% Self-Hosted
White-Label Ready
One-Time Purchase
@if(!empty($heroImageUrl))
@endif
@if(isset($logoUrls) && count($logoUrls) > 0)
@foreach($logoUrls as $url) @endforeach
@else

Integrates with your favorite email providers

Amazon SES
Mailgun
SendGrid
Postmark
Any SMTP
@endif

{{ $featuresTitle }}

{{ $featuresSubtitle }}

{{ $features1Title }}

{{ $features1Description }}

{{ $features2Title }}

{{ $features2Description }}

{{ $features3Title }}

{{ $features3Description }}

{{ $features4Title }}

{{ $features4Description }}

{{ $features5Title }}

{{ $features5Description }}

{{ $features6Title }}

{{ $features6Description }}

{{ $aiBadge }}

{{ $aiTitle }}

{{ $aiSubtitle }}

{{ $ai1Title }}

{{ $ai1Description }}

{{ $ai2Title }}

{{ $ai2Description }}

{{ $howTitle }}

{{ $howSubtitle }}

1

{{ $how1Title }}

{{ $how1Description }}

2

{{ $how2Title }}

{{ $how2Description }}

3

{{ $how3Title }}

{{ $how3Description }}

"Finally, an email marketing platform I can host myself. No more monthly fees eating into margins, no more data privacy concerns. MailPurse just works."
Marketing Agency Owner
Managing 50+ client accounts
{{ $pricingSectionBadge }}

{{ $pricingSectionTitle }}

{{ $pricingSectionSubtitle }}

{{ $pricingSectionToggleMonthly }} {{ $pricingSectionToggleAnnual }} {{ $pricingSectionToggleSave }}
@foreach($pricingPlansMonthly as $idx => $plan) @php $isFeatured = ($plan->is_popular ?? false) === true; if (!$isFeatured && $pricingPlansMonthly->where('is_popular', true)->count() === 0) { $isFeatured = $idx === 1; } $cycle = $plan->billing_cycle === 'yearly' ? 'year' : 'month'; $ctaText = is_string($plan->cta_text ?? null) && trim((string) $plan->cta_text) !== '' ? (string) $plan->cta_text : 'Get Started'; $planFeatures = $plan->features ?? null; $pros = []; $cons = []; if (is_array($planFeatures) && (array_key_exists('pros', $planFeatures) || array_key_exists('cons', $planFeatures))) { $pros = is_array($planFeatures['pros'] ?? null) ? $planFeatures['pros'] : []; $cons = is_array($planFeatures['cons'] ?? null) ? $planFeatures['cons'] : []; } elseif (is_array($planFeatures)) { $pros = $planFeatures; } @endphp
@if($isFeatured)
{{ $pricingSectionPopularBadge }}
@endif
@if($isFeatured) @elseif($idx === 0) @else @endif

{{ $plan->name }}

{{ $plan->description }}

{{ $plan->currency }} {{ number_format((float) $plan->price, 2) }} /{{ $cycle }}
{{ $ctaText }}

Features

    @foreach($pros as $feature) @if(is_string($feature) && trim($feature) !== '')
  • {{ $feature }}
  • @endif @endforeach @foreach($cons as $feature) @if(is_string($feature) && trim($feature) !== '')
  • {{ $feature }}
  • @endif @endforeach
@endforeach
@foreach($pricingPlansYearly as $idx => $plan) @php $isFeatured = ($plan->is_popular ?? false) === true; if (!$isFeatured && $pricingPlansYearly->where('is_popular', true)->count() === 0) { $isFeatured = $idx === 1; } $cycle = $plan->billing_cycle === 'yearly' ? 'year' : 'month'; $ctaText = is_string($plan->cta_text ?? null) && trim((string) $plan->cta_text) !== '' ? (string) $plan->cta_text : 'Get Started'; $planFeatures = $plan->features ?? null; $pros = []; $cons = []; if (is_array($planFeatures) && (array_key_exists('pros', $planFeatures) || array_key_exists('cons', $planFeatures))) { $pros = is_array($planFeatures['pros'] ?? null) ? $planFeatures['pros'] : []; $cons = is_array($planFeatures['cons'] ?? null) ? $planFeatures['cons'] : []; } elseif (is_array($planFeatures)) { $pros = $planFeatures; } @endphp
@if($isFeatured)
{{ $pricingSectionPopularBadge }}
@endif
@if($isFeatured) @elseif($idx === 0) @else @endif

{{ $plan->name }}

{{ $plan->description }}

{{ $plan->currency }} {{ number_format((float) $plan->price, 2) }} /{{ $cycle }}
{{ $ctaText }}

Features

    @foreach($pros as $feature) @if(is_string($feature) && trim($feature) !== '')
  • {{ $feature }}
  • @endif @endforeach @foreach($cons as $feature) @if(is_string($feature) && trim($feature) !== '')
  • {{ $feature }}
  • @endif @endforeach
@endforeach

{{ $faqTitle }}

@if(is_string($faqSubtitle) && trim($faqSubtitle) !== '')

{{ $faqSubtitle }}

@endif
{{ $faq1Answer }}
{{ $faq2Answer }}
{{ $faq3Answer }}
{{ $faq4Answer }}

{{ $ctaTitle }}

{{ $ctaSubtitle }}

@endsection @push('scripts') @endpush