NetSendo
Platform Updates

NetSendo v2.11.2: Live Webinar Chat & Timezone Fixes

NetSendo Team6 min read

Imagine your auto-webinar is running and the room looks right: the video plays and the countdown works. But the chat panel says "Loading chat…" and never loads. Your scripted questions never show up, viewers can't ask anything, and the room shows "0 viewers". On top of that, a session booked for 19:00 starts at 20:00.

NetSendo v2.11.2 is a maintenance release that fixes these problems. It makes the webinar room chat work, corrects timezone handling across the webinar module and fixes date calculations that broke after the upgrade to Carbon 3.

TL;DR: NetSendo v2.11.2 makes the webinar room chat work, with polling, moderation, slow mode and chat scripts that play back on each viewer's own session clock. It fixes webinar times that were stored as UTC instead of the webinar's timezone and corrects watch-time tracking, so the "attended" list is accurate. It also fixes signed Carbon 3 date differences that broke the subscribed_days_ago automation condition, Brain's CRON priorities and Google Calendar reminders. Hosts should re-check upcoming live and hybrid webinars.

🚀 What's New in v2.11.2

💬

Webinar Chat Now Works

The room now has a public chat endpoint, with polling, posting and moderation.

🕖

Correct Timezones

Times you enter are read in the webinar's timezone and stored in UTC.

⏱️

Accurate Watch Time

Watch time is counted per visit, so only people who watched the minimum count as attended.

🧮

Carbon 3 Date Fixes

Automation conditions, CRON scoring and calendar reminders calculate time correctly again.

The Webinar Room Chat

The room at /webinar/{slug}/watch/{token} had a chat panel, but no code or endpoint behind it. Now the room checks for new messages every 4 seconds and sends messages to the same address. Posting is rate-limited per registration:

GET  /webinar/{slug}/chat/{token}   # fetch messages (every 4 s)
POST /webinar/{slug}/chat/{token}   # send a message (rate-limited)

For auto and hybrid webinars, the chat script plays back on each viewer's own session clock. Think of it as subtitles synced to each viewer's playback:

  • A line set at 00:25 appears 25 seconds after that viewer's session started.
  • Viewers who join late see what was "said" before they arrived.
  • Lines that aren't due yet are never sent to the browser, so a viewer can't read ahead in the page source.
  • "Show randomly" lines are chosen once per viewer, so they don't change between polls.

The Studio's chat modes now apply in the room:

  • Host only: viewers can't send messages.
  • Q&A only: messages are saved as questions.
  • Moderated / require approval: other viewers don't see a message until you approve it. A message waiting for approval is no longer shown to other viewers first.
  • Slow mode: viewers have to wait between messages.

Recordings show the Studio's viewer count (base ± variance) instead of "0 viewers". If you turn Chat enabled off, the panel is removed from the room, and rooms that are already open drop it at the next poll. The Studio no longer shows the raw webinars.chat.disabled key, and its chat texts are translated into all four languages.

Timezone Handling

Two timezone bugs affected webinar times. The panel sends the start time without a timezone, and it was read as UTC. A Warsaw webinar set for 19:00 therefore started at 20:00 in winter (21:00 in summer). Meanwhile, the sign-up page and emails printed the stored digits and still said 19:00.

The time you enter is now read in the webinar's timezone (or your account's timezone if the webinar doesn't have one) and stored in UTC. Auto-webinar slots now include their UTC offset:

{
  "slot": "2026-11-12T18:40:00+01:00"
}

A value that includes an offset, such as 2026-11-20T18:00:00Z, keeps it. The edit form now shows which timezone you're editing in, and creating a webinar with a start time that has already passed is refused. Every place that shows the time converts it to the right timezone: the sign-up page, the thank-you screen, the watch page, the emails, the page builder's date blocks and the {{webinar_date}} and {{webinar_time}} tokens.

⚠️ Hosts: re-check upcoming live and hybrid webinars. Webinars scheduled before this version keep their stored time, which is the time the countdown and reminders already used. A webinar entered as 19:00 in Warsaw now shows as 20:00 everywhere. If you meant 19:00, open the webinar, set 19:00 again and save.

Carbon 3 Date Calculations

Carbon 3 returns signed differences. $later->diffInDays($earlier) is now negative, while Carbon 2 always returned a positive number. That broke several features:

  • subscribed_days_ago never matched, so automations that used it never ran. It now counts whole days since the subscriber joined the event's list.
  • Brain's CRON gave the lowest urgency to the agents that had been idle the longest. An agent last run 14 days ago scored −16 instead of 25. Urgency now grows with the days since the agent's last successful run.
  • Google Calendar reminders for CRM tasks arrived as "0 minutes before". Tasks that have a reminder but no due date now sync with the calendar's default reminders.
  • Leaving the webinar room returned HTTP 500, because the watch time was negative and MySQL refused it for an unsigned column.
  • Importing a live session's chat into an auto-webinar chat script failed because every message got a negative show time. Messages now keep their offset from the session's start.
  • "Avg. duration" in Settings → CRON is no longer negative.

💼 Benefits & Use Cases

🎓

SaaS: Evergreen Onboarding Webinars

Run an auto-webinar every day that feels like a live session:

  • Script common questions at the moments they come up in the demo.
  • Use Q&A-only mode to collect real objections from trial users.
  • Tag people who actually attended and send them a conversion sequence based on accurate watch time.
🛒

E-commerce: Time-Based Nurturing

Use the fixed subscribed_days_ago condition to:

  • Send a loyalty discount 30 days after a subscriber joins.
  • Invite older subscribers to a product-launch webinar at the right local time.
🏢

Agencies: Multi-Timezone Clients

Each client's webinar now uses its own timezone, from the sign-up page through the reminder emails and calendar file. That means fewer support tickets from attendees who showed up an hour early or late.

🛠️ Step-by-Step: Upgrade and Verify

  1. Back Up Your Database

    Take a MySQL dump before you upgrade. This is always a good habit on self-hosted installs.

  2. Pull the New Version

    Update your Docker deployment:

    docker compose pull
    docker compose up -d

    The automatic migration adds the new webinar_registrations.visit_started_at column.

  3. Audit Upcoming Webinars

    Open each upcoming live or hybrid webinar. The edit form now shows its timezone. If the time is wrong, enter it again and save.

  4. Configure the Chat

    In the Studio, check that Chat enabled is on, choose a chat mode and set slow mode if you need it.

  5. Test as a Viewer

    Register with a test email, join the room and check that the scripted lines appear at the right moments and that messages you post follow your moderation settings.

  6. Re-check Automations

    Rules that use subscribed_days_ago will start matching now. Review them so a backlog of matching subscribers doesn't get messages you don't want them to receive.

ℹ️ Note: Auto-webinar sessions booked before this release keep their stored times. Only new bookings use the corrected slot timezone.

🎯 Expert Tips

1
Script the First Two Minutes Densely

Since viewers who join late see earlier lines, a busy opening makes the room feel active for everyone.

2
Combine Moderation with Slow Mode

For larger live sessions, moderated chat with slow mode keeps spam down and the review queue manageable.

3
Recycle Your Best Live Chats

Chat import works again, so you can copy a successful live session's chat into an auto-webinar script. Message timing is kept.

4
Set the Timezone Explicitly

Give every webinar and schedule its own timezone instead of relying on account defaults, especially for agency setups.

5
Check Custom Code for Carbon 3

If you have custom extensions, search for diffIn* calls and wrap them in abs() or reverse the operands where you need a positive value.

Other fixes: public webinar pages now declare their actual language instead of always lang="pl", the thank-you screen shows the time as "12.11.2026 · 21:25" in every language, and the room's "your browser cannot play this video" text is translated.

✅ Conclusion

v2.11.2 makes NetSendo webinars more reliable. The chat works and auto-webinar scripts play back on each viewer's own timeline. Webinar times follow the timezone you set, and the "attended" list reflects actual watch time. Because NetSendo is self-hosted, your webinar data, chat logs and subscriber lists stay on your own server.

Ready to Upgrade?

Update to v2.11.2 and re-check your upcoming webinars:

Explore more integrations, and if NetSendo helps your business, star us on GitHub.

#webinars#release-notes#timezones#automation#bug-fixes#self-hosted
Share