Short answer: a small launcher loads on every page, and nothing else does until a visitor actually opens the chat.
What loads on a normal page view
A launcher of roughly 8 KB. That is the button in the corner and the logic to open it — nothing more.
The full chat interface downloads only when somebody clicks. Most visitors never do, so most visitors never download it. That is the whole point of splitting it in two.
Also worth knowing:
- No third-party requests. No external fonts, no CDN assets, no analytics, no trackers. Everything is served from your own domain.
- No phone-home. Updates come from WordPress.org like any other plugin.
What costs something on the server
Nothing on a normal page render. The launcher is static.
Chat requests cost a PHP request each, and they hold the connection open while the reply streams. That is normal for a chat and it is bounded by your rate limits.
Knowledge Base syncs run as background jobs, out of band. They do not run while somebody waits on a Save button.
The one thing to weigh: human handoff
If you turn on human handoff, open chat windows quietly poll for replies from your team. That is real traffic, and on a tight host it is the thing worth thinking about.
It is narrower than it sounds. Polling happens only:
- while handoff is switched on, and
- while a visitor has the chat window actually open, and
- while their browser tab is in the foreground, and
- for the first ten quiet minutes.
Nothing polls with the chat closed, in a background tab, or after ten minutes of silence. A developer can slow the interval further without touching plugin code.
If you are not using handoff, none of this applies — it is off until you switch it on.
Hiding the widget where it is not needed
The cheapest page is one with no launcher at all. To hide it everywhere, uncheck Show widget under Sohay → AI Settings.
To hide it selectively — keeping it on support and product pages, dropping it on landing pages and checkout:
add_filter( 'sohaychat_should_render_widget', function ( $enabled ) {
if ( ! $enabled ) { return false; }
return function_exists( 'is_shop' ) && ( is_shop() || is_product() );
} );
If you are measuring
Test with the chat closed, which is how nearly every visitor experiences the page. Opening the chat and then measuring tells you about the chat, not about your site.