diff --git a/admin.php b/admin.php
index 7298848..d23b7fb 100644
--- a/admin.php
+++ b/admin.php
@@ -2,6 +2,7 @@
session_start();
require_once 'db/config.php';
require_once 'includes/admin_auth.php';
+require_once 'includes/webinar_email.php';
admin_require_login();
@@ -30,7 +31,7 @@ $records_per_page = 15;
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? max(1, (int) $_GET['page']) : 1;
$selected_webinar_id = isset($_GET['webinar_id']) && is_numeric($_GET['webinar_id']) ? max(0, (int) $_GET['webinar_id']) : 0;
-$webinars = $pdo->query('SELECT id, title, scheduled_at FROM webinars ORDER BY scheduled_at DESC, id DESC')->fetchAll(PDO::FETCH_ASSOC);
+$webinars = $pdo->query('SELECT id, title, description, presenter, scheduled_at FROM webinars ORDER BY scheduled_at DESC, id DESC')->fetchAll(PDO::FETCH_ASSOC);
$where_parts = ['a.deleted_at IS NULL'];
$params = [];
@@ -113,6 +114,17 @@ foreach ($webinars as $webinar) {
}
}
+$preview_webinar = $selected_webinar ?? ($webinars[0] ?? null);
+$preview_email_payload = null;
+$preview_scope_note = null;
+
+if ($preview_webinar) {
+ $preview_email_payload = webinar_build_email_payload('there', $preview_webinar, true);
+ $preview_scope_note = $selected_webinar
+ ? 'This preview matches the correction email for the selected webinar.'
+ : 'Preview shows the correction email template for the most recent webinar. When "All webinars" is selected, each attendee still receives the version for their own webinar.';
+}
+
$chart_labels = json_encode(array_column($chart_data, 'registration_day'));
$chart_values = json_encode(array_column($chart_data, 'user_count'));
$export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . urlencode((string) $selected_webinar_id) : '');
@@ -314,6 +326,50 @@ $export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . u
border-radius: 16px;
margin-top: 1.2rem;
}
+ .email-preview-card {
+ margin-bottom: 1.5rem;
+ }
+ .email-preview-badges {
+ display: flex;
+ gap: 0.55rem;
+ flex-wrap: wrap;
+ }
+ .email-preview-meta {
+ display: grid;
+ gap: 0.45rem;
+ margin-bottom: 1rem;
+ color: var(--text-soft);
+ }
+ .email-preview-frame-wrap {
+ overflow: hidden;
+ border-radius: 20px;
+ border: 1px solid var(--line);
+ background: rgba(255, 255, 255, 0.08);
+ }
+ .email-preview-frame {
+ width: 100%;
+ min-height: 920px;
+ border: 0;
+ background: #ffffff;
+ }
+ .email-text-details {
+ margin-top: 1rem;
+ }
+ .email-text-details summary {
+ cursor: pointer;
+ font-weight: 700;
+ color: var(--text-main);
+ }
+ .email-text-preview {
+ margin: 0.85rem 0 0;
+ padding: 1rem;
+ border-radius: 16px;
+ border: 1px solid var(--line);
+ background: rgba(221, 226, 253, 0.08);
+ color: var(--text-soft);
+ white-space: pre-wrap;
+ word-break: break-word;
+ }
code {
color: var(--accent-soft, #bbc8fb);
}
@@ -328,6 +384,9 @@ $export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . u
.form-control {
min-width: 210px;
}
+ .email-preview-frame {
+ min-height: 760px;
+ }
}
@@ -360,13 +419,49 @@ $export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . u
Reset
-
+
Download CSV
+
View site
Log out
+
Sends the corrected webinar time, Google Meet link, Google Calendar button, and .ics file to all active attendees.
+
+
+
+
+
Correction email preview
+
+
+
+ Recipients:
+ Preview webinar:
+
+
+
+
+
+
+
+ Show plain-text version
+
+
+
+
+
Total registrations
diff --git a/assets/pasted-20260325-163454-1eca4df8.png b/assets/pasted-20260325-163454-1eca4df8.png
new file mode 100644
index 0000000..3471661
Binary files /dev/null and b/assets/pasted-20260325-163454-1eca4df8.png differ
diff --git a/includes/webinar_email.php b/includes/webinar_email.php
new file mode 100644
index 0000000..c4efc7f
--- /dev/null
+++ b/includes/webinar_email.php
@@ -0,0 +1,176 @@
+We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.';
+ $noteHtml = 'If you already saved the older calendar event, please remove it and add the updated one from this email.
';
+ $headline = 'Updated Webinar Details';
+ $introText = 'We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.';
+ $noteText = 'If you already saved the older calendar event, please remove it and add the updated one from this email.';
+ } else {
+ $subject = "Confirmation: You're Registered for {$eventTitle}";
+ $introHtml = 'Thank you for registering for the ' . $safeTitle . ' webinar.
We are excited to have you join us for this professional vibe-coding session.
';
+ $noteHtml = 'Your webinar link is below, and you can add the corrected event to your calendar right now.
';
+ $headline = "You're Registered!";
+ $introText = 'Thank you for registering for the ' . $eventTitle . ' webinar. We are excited to have you join us for this professional vibe-coding session.';
+ $noteText = 'Your webinar link is below, and you can add the corrected event to your calendar right now.';
+ }
+
+ $bodyHtml = <<
+
+
+
+
+ {$safeTitle}
+
+
+
+
+
+
+
+
+
+ {$headline}
+ |
+
+
+
+ Hello {$safeFirstName},
+ {$introHtml}
+
+ Webinar details
+ {$safeDateLong} | {$safeBerlinLabel} | {$safeNewYorkLabel} | {$safeLosAngelesLabel}
+
+ Join the live session here:
+ {$safeJoinUrl}
+ {$noteHtml}
+
+ Join Webinar
+ Add to Google Calendar
+
+
+ Download calendar file (.ics)
+
+ You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.
+ |
+
+
+ |
+ © 2026 AppWizzy. All rights reserved.
+ You can visit our website for more information.
+ |
+
+
+ |
+
+
+
+
+HTML;
+
+ $textBody = implode("
+
+", [
+ 'Hello ' . (trim($firstName) !== '' ? trim($firstName) : 'there') . ',',
+ $introText,
+ 'Webinar details: ' . $schedule['date_long'] . ' | ' . $schedule['berlin_label'] . ' | ' . $schedule['new_york_label'] . ' | ' . $schedule['los_angeles_label'],
+ 'Join webinar: ' . $joinUrl,
+ $noteText,
+ 'Add to Google Calendar: ' . $googleLink,
+ 'Download calendar file (.ics): ' . $outlookLink,
+ ]);
+
+ return [
+ 'subject' => $subject,
+ 'html' => $bodyHtml,
+ 'text' => $textBody,
+ 'schedule' => $schedule,
+ 'google_link' => $googleLink,
+ 'outlook_link' => $outlookLink,
+ 'join_url' => $joinUrl,
+ 'event_title' => $eventTitle,
+ ];
+}
diff --git a/mail/mail.log b/mail/mail.log
index 3b8563d..82e8ffd 100644
--- a/mail/mail.log
+++ b/mail/mail.log
@@ -33677,3 +33677,354 @@ CLIENT -> SERVER: .
SERVER -> CLIENT: 250 Ok 0100019d1ba46d9e-2657f32b-c66e-4498-80c2-1f0e6199d3e7-000000
CLIENT -> SERVER: QUIT
SERVER -> CLIENT: 221 Bye
+SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-8G5AYW8II Gml5Eqe0G82LibJ6JrqC
+CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-STARTTLS
+250-AUTH PLAIN LOGIN
+250 Ok
+CLIENT -> SERVER: STARTTLS
+SERVER -> CLIENT: 220 Ready to start TLS
+CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-AUTH PLAIN LOGIN
+250 Ok
+CLIENT -> SERVER: AUTH LOGIN
+SERVER -> CLIENT: 334 VXNlcm5hbWU6
+CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 334 UGFzc3dvcmQ6
+CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 235 Authentication successful.
+CLIENT -> SERVER: MAIL FROM:
+SERVER -> CLIENT: 250 Ok
+CLIENT -> SERVER: RCPT TO:
+SERVER -> CLIENT: 250 Ok
+CLIENT -> SERVER: DATA
+SERVER -> CLIENT: 354 End data with .
+CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:33:41 +0000
+CLIENT -> SERVER: To: builderbotflores@gmail.com
+CLIENT -> SERVER: From: Flatlogic Team Customer Success
+CLIENT -> SERVER: Reply-To: support@flatlogic.com
+CLIENT -> SERVER: Subject: Updated webinar time and join link for Building Scalable Apps with AppWizzy
+CLIENT -> SERVER: Message-ID: <1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4@vm-39074.dev.flatlogic.app>
+CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer)
+CLIENT -> SERVER: MIME-Version: 1.0
+CLIENT -> SERVER: Content-Type: multipart/alternative;
+CLIENT -> SERVER: boundary="b1_1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4"
+CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
+CLIENT -> SERVER:
+CLIENT -> SERVER: This is a multi-part message in MIME format.
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4
+CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii
+CLIENT -> SERVER:
+CLIENT -> SERVER: Hello Flores,
+CLIENT -> SERVER:
+CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Webinar details: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join webinar: https://meet.google.com/ohs-ayvx-dqg
+CLIENT -> SERVER:
+CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Add to Google Calendar: https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC
+CLIENT -> SERVER:
+CLIENT -> SERVER: Download calendar file (.ics): data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4
+CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Building Scalable Apps with AppWizzy
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Updated Webinar Details
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Hello Flores,
+CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Webinar details
+CLIENT -> SERVER: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join the live session here:
+CLIENT -> SERVER: https://meet.google.com/ohs-ayvx-dqg
+CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join Webinar
+CLIENT -> SERVER: Add to Google Calendar
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Download calendar file (.ics)
+CLIENT -> SERVER:
+CLIENT -> SERVER: You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: |
+CLIENT -> SERVER: © 2026 AppWizzy. All rights reserved.
+CLIENT -> SERVER: You can visit our website for more information.
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4--
+CLIENT -> SERVER:
+CLIENT -> SERVER: .
+SERVER -> CLIENT: 250 Ok 0100019d25d83f3f-598e01c6-5430-4f5d-8189-3b733f243fbd-000000
+CLIENT -> SERVER: QUIT
+SERVER -> CLIENT: 221 Bye
+SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-8G5AYW8II ecwRSm3nfW7Dw92OjHWx
+CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-STARTTLS
+250-AUTH PLAIN LOGIN
+250 Ok
+CLIENT -> SERVER: STARTTLS
+SERVER -> CLIENT: 220 Ready to start TLS
+CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-AUTH PLAIN LOGIN
+250 Ok
+CLIENT -> SERVER: AUTH LOGIN
+SERVER -> CLIENT: 334 VXNlcm5hbWU6
+CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 334 UGFzc3dvcmQ6
+CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 235 Authentication successful.
+CLIENT -> SERVER: MAIL FROM:
+SERVER -> CLIENT: 250 Ok
+CLIENT -> SERVER: RCPT TO:
+SERVER -> CLIENT: 250 Ok
+CLIENT -> SERVER: DATA
+SERVER -> CLIENT: 354 End data with .
+CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:33:55 +0000
+CLIENT -> SERVER: To: builderbotflores@gmail.com
+CLIENT -> SERVER: From: Flatlogic Team Customer Success
+CLIENT -> SERVER: Reply-To: support@flatlogic.com
+CLIENT -> SERVER: Subject: Updated webinar time and join link for Building Scalable Apps with AppWizzy
+CLIENT -> SERVER: Message-ID:
+CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer)
+CLIENT -> SERVER: MIME-Version: 1.0
+CLIENT -> SERVER: Content-Type: multipart/alternative;
+CLIENT -> SERVER: boundary="b1_da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0"
+CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
+CLIENT -> SERVER:
+CLIENT -> SERVER: This is a multi-part message in MIME format.
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0
+CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii
+CLIENT -> SERVER:
+CLIENT -> SERVER: Hello Flores,
+CLIENT -> SERVER:
+CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Webinar details: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join webinar: https://meet.google.com/ohs-ayvx-dqg
+CLIENT -> SERVER:
+CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Add to Google Calendar: https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC
+CLIENT -> SERVER:
+CLIENT -> SERVER: Download calendar file (.ics): data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0
+CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Building Scalable Apps with AppWizzy
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Updated Webinar Details
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Hello Flores,
+CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Webinar details
+CLIENT -> SERVER: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join the live session here:
+CLIENT -> SERVER: https://meet.google.com/ohs-ayvx-dqg
+CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join Webinar
+CLIENT -> SERVER: Add to Google Calendar
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Download calendar file (.ics)
+CLIENT -> SERVER:
+CLIENT -> SERVER: You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: |
+CLIENT -> SERVER: © 2026 AppWizzy. All rights reserved.
+CLIENT -> SERVER: You can visit our website for more information.
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0--
+CLIENT -> SERVER:
+CLIENT -> SERVER: .
+SERVER -> CLIENT: 250 Ok 0100019d25d87450-e128af55-2ecd-4b71-a4c2-cca740e0fc0f-000000
+CLIENT -> SERVER: QUIT
+SERVER -> CLIENT: 221 Bye
+SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-FZY12I9II sSFAlJVyj7Iv2WiFNoBz
+CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-STARTTLS
+250-AUTH PLAIN LOGIN
+250 Ok
+CLIENT -> SERVER: STARTTLS
+SERVER -> CLIENT: 220 Ready to start TLS
+CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-AUTH PLAIN LOGIN
+250 Ok
+CLIENT -> SERVER: AUTH LOGIN
+SERVER -> CLIENT: 334 VXNlcm5hbWU6
+CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 334 UGFzc3dvcmQ6
+CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 235 Authentication successful.
+CLIENT -> SERVER: MAIL FROM:
+SERVER -> CLIENT: 250 Ok
+CLIENT -> SERVER: RCPT TO:
+SERVER -> CLIENT: 250 Ok
+CLIENT -> SERVER: DATA
+SERVER -> CLIENT: 354 End data with .
+CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:35:06 +0000
+CLIENT -> SERVER: To: builderbotflores@gmail.com
+CLIENT -> SERVER: From: Flatlogic Team Customer Success
+CLIENT -> SERVER: Reply-To: support@flatlogic.com
+CLIENT -> SERVER: Subject: Updated webinar time and join link for Building Scalable Apps with AppWizzy
+CLIENT -> SERVER: Message-ID:
+CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer)
+CLIENT -> SERVER: MIME-Version: 1.0
+CLIENT -> SERVER: Content-Type: multipart/alternative;
+CLIENT -> SERVER: boundary="b1_kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M"
+CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
+CLIENT -> SERVER:
+CLIENT -> SERVER: This is a multi-part message in MIME format.
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M
+CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii
+CLIENT -> SERVER:
+CLIENT -> SERVER: Hello Flores,
+CLIENT -> SERVER:
+CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Webinar details: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join webinar: https://meet.google.com/ohs-ayvx-dqg
+CLIENT -> SERVER:
+CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Add to Google Calendar: https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC
+CLIENT -> SERVER:
+CLIENT -> SERVER: Download calendar file (.ics): data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M
+CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Building Scalable Apps with AppWizzy
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Updated Webinar Details
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Hello Flores,
+CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Webinar details
+CLIENT -> SERVER: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join the live session here:
+CLIENT -> SERVER: https://meet.google.com/ohs-ayvx-dqg
+CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
+CLIENT -> SERVER:
+CLIENT -> SERVER: Join Webinar
+CLIENT -> SERVER: Add to Google Calendar
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: Download calendar file (.ics)
+CLIENT -> SERVER:
+CLIENT -> SERVER: You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: |
+CLIENT -> SERVER: © 2026 AppWizzy. All rights reserved.
+CLIENT -> SERVER: You can visit our website for more information.
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: |
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: --b1_kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M--
+CLIENT -> SERVER:
+CLIENT -> SERVER: .
+SERVER -> CLIENT: 250 Ok 0100019d25d98c95-df6cc150-7c16-427c-994a-8c4f741fc790-000000
+CLIENT -> SERVER: QUIT
+SERVER -> CLIENT: 221 Bye
diff --git a/register.php b/register.php
index 548df20..d774fb3 100644
Binary files a/register.php and b/register.php differ
diff --git a/resend_webinar_email.php b/resend_webinar_email.php
new file mode 100644
index 0000000..48c2b3a
--- /dev/null
+++ b/resend_webinar_email.php
@@ -0,0 +1,73 @@
+ 0) {
+ $sql .= ' AND a.webinar_id = ?';
+ $params[] = $selectedWebinarId;
+ }
+
+ $sql .= ' ORDER BY a.created_at DESC, a.id DESC';
+
+ $stmt = $pdo->prepare($sql);
+ $stmt->execute($params);
+ $attendees = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+ if (!$attendees) {
+ admin_set_flash('No active attendees were found for the selected webinar.');
+ header('Location: admin.php' . ($selectedWebinarId > 0 ? '?webinar_id=' . urlencode((string) $selectedWebinarId) : ''));
+ exit;
+ }
+
+ $sentCount = 0;
+ $failedCount = 0;
+
+ foreach ($attendees as $attendee) {
+ $payload = webinar_build_email_payload((string) ($attendee['first_name'] ?? ''), $attendee, true);
+ $result = MailService::sendMail((string) $attendee['email'], $payload['subject'], $payload['html'], $payload['text']);
+
+ if (!empty($result['success'])) {
+ $sentCount++;
+ } else {
+ $failedCount++;
+ error_log('Correction email failed for attendee #' . (int) $attendee['id'] . ': ' . ($result['error'] ?? 'unknown error'));
+ }
+ }
+
+ $scope = $selectedWebinarId > 0 ? 'selected webinar' : 'all active webinars';
+ $message = "Correction email sent to {$sentCount} attendee(s) for the {$scope}.";
+ if ($failedCount > 0) {
+ $message .= " {$failedCount} email(s) failed to send. Check the mail log for details.";
+ }
+
+ admin_set_flash($message);
+} catch (Throwable $e) {
+ error_log('Failed to send correction emails: ' . $e->getMessage());
+ admin_set_flash('Could not send the correction email right now. Please try again.');
+}
+
+header('Location: admin.php' . ($selectedWebinarId > 0 ? '?webinar_id=' . urlencode((string) $selectedWebinarId) : ''));
+exit;