WordPress site with an AI chat widget open, illustrating EU AI Act Article 50 chatbot disclosure requirements
/* mxchat-css */ /* MxChat — Fullwidth Theme Reset */ /* Generic WordPress themes */ .entry-content-wrap, .entry-content, .post-inner .entry-content, .container.site-content, article .entry-content, .content-area .site-main, .single-content .entry-content, .type-post .entry-content, .type-page .entry-content, .page .entry-content, .single .entry-content { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Outer wrappers that themes use to add spacing */ .site-main > article, .content-area, .site-content, #content, #primary, .hentry, .post, .page .post, .single .post { padding: 0 !important; margin-left: 0 !important; margin-right: 0 !important; max-width: 100% !important; } /* Astra */ .ast-container .entry-content, .site-content .ast-container, .ast-separate-container .ast-article-single, .ast-separate-container .ast-article-post, .ast-separate-container .ast-article-page { padding: 0 !important; margin: 0 auto !important; max-width: 100% !important; width: 100% !important; background: transparent !important; } .ast-separate-container .entry-content { margin: 0 !important; } /* GeneratePress */ .inside-article .entry-content, .generate-columns-container, .inside-article { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Kadence */ .kb-row-layout-wrap, .entry-content-wrap, .content-container.site-container { padding: 0 !important; max-width: 100% !important; width: 100% !important; } .content-style-unboxed .entry:not(.loop-entry), .content-style-boxed .entry:not(.loop-entry) { box-shadow: none !important; border-radius: 0 !important; margin: 0 !important; padding: 0 !important; } /* OceanWP */ .ocean-content .entry, #content-wrap .container { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Neve */ .nv-single-post-wrap .entry-content, .nv-content-wrap .entry-content { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Hello Elementor / Elementor default theme */ .site-main .elementor-section-wrap, .elementor-page .page-content .entry-content, .elementor-default .entry-content { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Bricks Builder */ .brxe-post-content .entry-content, .bricks-layout-wrapper .entry-content, .brxe-container .entry-content { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Divi */ .et_pb_post .entry-content, #main-content .container .entry-content, .et_full_width_page .entry-content { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Beaver Builder */ .fl-post-content .entry-content, .fl-content-full .entry-content { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Blocksy */ .entry-content[data-source], .site-main > article > .entry-content { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* Spectra / starter templates */ .uagb-body-wrapper .entry-content, .starter-template-content .entry-content { padding: 0 !important; max-width: 100% !important; width: 100% !important; } /* WordPress Block Themes (Twenty Twenty-Two → Twenty Twenty-Five) These use theme.json layout constraints rather than classic .entry-content, so the selectors above do not apply — neutralize them here. */ .wp-site-blocks, .wp-block-post-content, .wp-block-group.has-global-padding, .has-global-padding { padding-left: 0 !important; padding-right: 0 !important; max-width: 100% !important; } .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)), .wp-block-post-content > :where(:not(.alignleft):not(.alignright):not(.alignfull)) { max-width: 100% !important; margin-left: 0 !important; margin-right: 0 !important; } /* MxChat — CSS Isolation & Responsive Overrides */ .mxg-wrapper { box-sizing: border-box; } .mxg-wrapper *, .mxg-wrapper *::before, .mxg-wrapper *::after { box-sizing: inherit; } .mxg-wrapper img { max-width: 100%; height: auto; } .mxg-wrapper section { clear: both; } .mxg-row { display: flex; flex-wrap: wrap; } .mxg-col { min-width: 0; } .mxg-grid { display: flex; flex-wrap: wrap; } .mxg-container { box-sizing: border-box; width: 100%; } @media (max-width: 768px) { .mxg-row { flex-direction: column !important; gap: 24px !important; } .mxg-col { flex: 1 1 100% !important; width: 100% !important; max-width: 100% !important; } .mxg-hero-heading { font-size: 2.2rem !important; } .mxg-section-heading { font-size: 1.6rem !important; } .mxg-container { padding-left: 20px !important; padding-right: 20px !important; } .mxg-card { flex: 1 1 100% !important; } .mxg-grid { gap: 16px !important; } } @media (max-width: 480px) { .mxg-hero-heading { font-size: 1.75rem !important; } .mxg-section-heading { font-size: 1.35rem !important; } .mxg-container { padding-left: 16px !important; padding-right: 16px !important; } } /* MxChat — AI Generated Styles */ .mxg-container { max-width: 800px; margin: 0 auto; padding: 2rem 1.5rem 3rem; color: #1a1a2e; } .mxg-hero-heading { font-size: 2.5rem; font-weight: 800; line-height: 1.25; margin: 0 0 1rem; color: #0d1b4b; letter-spacing: -0.02em; } .mxg-subheading { font-size: 1.2rem; line-height: 1.7; color: #3d4a6b; margin: 0 0 1.25rem; font-weight: 400; } .mxg-meta { font-size: 0.875rem; color: #7a849e; margin: 0 0 2.5rem; display: flex; gap: 1.25rem; flex-wrap: wrap; align-items: center; } .mxg-meta-divider { color: #c5cce0; } .mxg-img { width: 100%; height: auto; border-radius: 10px; display: block; margin: 2rem 0; box-shadow: 0 4px 20px rgba(13, 27, 75, 0.10); } .mxg-section-heading { font-size: 1.75rem; font-weight: 700; color: #0d1b4b; margin: 2.75rem 0 1rem; line-height: 1.3; letter-spacing: -0.01em; } .mxg-subheading-h3 { font-size: 1.2rem; font-weight: 700; color: #1e2d5e; margin: 2rem 0 0.65rem; line-height: 1.4; } .mxg-p { font-size: 1.1rem; line-height: 1.85; color: #2c3452; margin: 0 0 1.35rem; } .mxg-ul { margin: 0.5rem 0 1.5rem 0; padding-left: 0; list-style: none; } .mxg-ul li { font-size: 1.05rem; line-height: 1.8; color: #2c3452; padding: 0.4rem 0 0.4rem 1.75rem; position: relative; } .mxg-ul li::before { content: "→"; position: absolute; left: 0; color: #3b6fd4; font-weight: 700; } .mxg-ol { margin: 0.5rem 0 1.5rem 0; padding-left: 1.5rem; } .mxg-ol li { font-size: 1.05rem; line-height: 1.8; color: #2c3452; padding: 0.3rem 0 0.3rem 0.5rem; } .mxg-blockquote { border-left: 4px solid #3b6fd4; background: #f0f4fc; margin: 2rem 0; padding: 1.25rem 1.5rem; border-radius: 0 8px 8px 0; } .mxg-blockquote p { font-size: 1.1rem; line-height: 1.75; color: #1e2d5e; margin: 0; font-style: italic; } .mxg-takeaway { background: linear-gradient(135deg, #e8f0fe 0%, #dceeff 100%); border: 1.5px solid #b3c9f7; border-radius: 12px; padding: 1.5rem 1.75rem; margin: 2.25rem 0; } .mxg-takeaway-heading { font-size: 1rem; font-weight: 800; color: #1a3a8f; text-transform: uppercase; letter-spacing: 0.07em; margin: 0 0 0.75rem; } .mxg-takeaway ul { margin: 0; padding-left: 0; list-style: none; } .mxg-takeaway ul li { font-size: 1.02rem; line-height: 1.75; color: #1e2d5e; padding: 0.3rem 0 0.3rem 1.6rem; position: relative; } .mxg-takeaway ul li::before { content: "✓"; position: absolute; left: 0; color: #2a5bd7; font-weight: 700; } .mxg-highlight { color: #1a3a8f; font-weight: 700; } .mxg-penalty-box { background: #fff8f0; border: 1.5px solid #f0b97a; border-radius: 12px; padding: 1.4rem 1.75rem; margin: 2rem 0; } .mxg-penalty-heading { font-size: 0.95rem; font-weight: 800; color: #b05e00; text-transform: uppercase; letter-spacing: 0.07em; margin: 0 0 0.65rem; } .mxg-penalty-box p { font-size: 1.05rem; line-height: 1.75; color: #5a3800; margin: 0; } .mxg-cta-box { background: linear-gradient(135deg, #0d1b4b 0%, #1e3a8a 100%); border-radius: 14px; padding: 2.25rem 2rem; margin: 3rem 0 1rem; text-align: center; } .mxg-cta-heading { font-size: 1.5rem; font-weight: 800; color: #ffffff; margin: 0 0 0.85rem; line-height: 1.3; } .mxg-cta-text { font-size: 1.05rem; line-height: 1.75; color: #c5d5f5; margin: 0 0 1.5rem; } .mxg-cta-link { display: inline-block; background: #ffffff; color: #0d1b4b; font-weight: 700; font-size: 1rem; padding: 0.8rem 1.75rem; border-radius: 8px; text-decoration: none; transition: background 0.2s ease, color 0.2s ease; } .mxg-cta-link:hover { background: #e8f0fe; color: #1a3a8f; } .mxg-divider { border: none; border-top: 1.5px solid #e4e9f5; margin: 2.5rem 0; } .mxg-tag { display: inline-block; background: #e8f0fe; color: #1a3a8f; font-size: 0.8rem; font-weight: 700; padding: 0.25rem 0.75rem; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 1rem; } .mxg-intro-note { font-size: 0.85rem; color: #7a849e; border-top: 1px solid #e4e9f5; margin-top: 3rem; padding-top: 1rem; font-style: italic; } @media (max-width: 768px) { .mxg-container { padding: 1.5rem 1.25rem 2.5rem; } .mxg-hero-heading { font-size: 2rem; } .mxg-subheading { font-size: 1.1rem; } .mxg-section-heading { font-size: 1.5rem; margin-top: 2.25rem; } .mxg-p { font-size: 1.05rem; } .mxg-takeaway { padding: 1.25rem 1.35rem; } .mxg-cta-box { padding: 1.75rem 1.35rem; } .mxg-cta-heading { font-size: 1.3rem; } .mxg-meta { gap: 0.75rem; } } @media (max-width: 480px) { .mxg-container { padding: 1.25rem 1rem 2rem; } .mxg-hero-heading { font-size: 1.65rem; letter-spacing: -0.01em; } .mxg-subheading { font-size: 1rem; } .mxg-section-heading { font-size: 1.3rem; margin-top: 2rem; } .mxg-subheading-h3 { font-size: 1.1rem; } .mxg-p, .mxg-ul li, .mxg-ol li { font-size: 1rem; } .mxg-blockquote p { font-size: 1rem; } .mxg-cta-heading { font-size: 1.15rem; } .mxg-cta-text { font-size: 0.98rem; } .mxg-img { border-radius: 8px; } .mxg-takeaway { padding: 1rem 1.1rem; } .mxg-penalty-box { padding: 1rem 1.1rem; } } /* MxChat — Hide Title */ .entry-title, .page-title, .post-title, .wp-block-post-title, .ast-title-with-post-meta-wrapper, .ast-the-title, .generate-page-header .page-hero, .entry-header .entry-title, .entry-hero .entry-title, .kadence-page-title, .wp-site-blocks .entry-title, .ocean-single-post-header, .page-header, .nv-page-title-wrap, .nv-post-title, .elementor-page-title, .et_pb_title_container .entry-title, .brxe-post-title, [data-hero] .page-title, .hero-section .page-title, .entry-header { display: none !important; } .mxg-container table.mxg-t { width:100%; border-collapse:collapse; margin:2rem 0; font-size:1rem; } .mxg-container table.mxg-t th { background:#1e2d5e; color:#fff; text-align:left; padding:0.85rem 1rem; font-weight:700; font-size:0.95rem; } .mxg-container table.mxg-t td { border-bottom:1px solid #dbe3f5; padding:0.85rem 1rem; vertical-align:top; line-height:1.6; color:#243055; } .mxg-container table.mxg-t tr:nth-child(even) td { background:#f6f8fd; } .mxg-container .mxg-tw { overflow-x:auto; -webkit-overflow-scrolling:touch; } .mxg-container code { background:#eef2fb; padding:2px 6px; border-radius:4px; font-size:0.92em; }
Compliance

EU AI Act Article 50: Your WordPress Chatbot Must Say It Is AI by August 2

The transparency rules become enforceable this Sunday. They reach well outside the EU — and almost no WordPress chatbot plugin complies out of the box, including ours.

Published 31 July 2026 | 10 minute read | EU AI Act · WordPress · Chatbots

A laptop showing a WordPress site with an AI chat widget open, illustrating EU AI Act Article 50 chatbot disclosure requirements

On 2 August 2026 — this Sunday — the transparency obligations in Article 50 of the EU AI Act become enforceable. If your WordPress site runs an AI chatbot and people in the EU can use it, the rule that matters to you is short: the person on the other end has to know they are talking to a machine.

That is a settings change, not a project. The reason it is worth twenty minutes of your Saturday is that most chat plugins ship a friendly, human-sounding greeting by default, and a friendly, human-sounding greeting is precisely the thing the article is aimed at. We checked our own chatbot before writing this, and as configured it would not have satisfied the requirement either. More on that below.

The short version

  • Deadline: 2 August 2026. No transition period for Article 50(1).
  • Requirement: people must be informed they are interacting with an AI system, at or before the first interaction.
  • Reach: extraterritorial. Being based in the US or UK does not take you out of scope.
  • Penalty tier: up to €15 million or 3% of worldwide annual turnover — not the €35 million / 7% figure being widely repeated.
  • Effort: for most WordPress owners, one line of text in a plugin setting.

What Article 50 actually says

It is worth reading the operative sentence rather than a summary of it, because the exact wording decides several arguments people are currently having. Article 50(1):

Providers shall ensure that AI systems intended to interact directly with natural persons are designed and developed in such a way that the natural persons concerned are informed that they are interacting with an AI system, unless this is obvious from the point of view of a natural person who is reasonably well-informed, observant and circumspect, taking into account the circumstances and the context of use.

And Article 50(5), which sets the timing and the standard of presentation:

The information referred to in paragraphs 1 to 4 shall be provided to the natural persons concerned in a clear and distinguishable manner at the latest at the time of the first interaction or exposure.

Two things follow immediately. First, “at the latest at the time of the first interaction” means the disclosure cannot live in your terms of service, your privacy policy, or a page the visitor would have to go looking for. It has to be in front of them when the conversation starts. Second, “clear and distinguishable” is a presentation standard, not just a content standard — grey six-point text under the send button is not a good-faith reading of it.

The penalty figure most coverage is getting wrong

You will see €35 million or 7% of global turnover attached to this deadline in a lot of write-ups. That is the AI Act’s top penalty tier, and it does not attach to Article 50. Transparency breaches sit in the lower band: up to €15 million, or 3% of total worldwide annual turnover, whichever is higher.

This is not a reason to relax. For most WordPress businesses the practical exposure was never going to be a headline fine anyway — it is a complaint from a user, a procurement questionnaire you cannot answer, or an enterprise customer’s legal team asking for evidence. But if you are budgeting attention, it helps to know which number is real. Quoting the wrong tier at your own board is an avoidable way to lose credibility.

Why this reaches WordPress sites outside the EU

The AI Act applies to providers placing AI systems on the EU market, and it also reaches non-EU providers where the use of the system’s output in the EU is foreseeable. A public chat widget on a public website is about as foreseeable as it gets: you are not choosing who visits.

The practical test is not where your company is registered. It is whether EU residents can reach your chatbot. If your site is publicly accessible, sells to the EU, has EU customers, or simply gets EU traffic, assume you are in scope. Geo-blocking the widget for EU visitors is technically an answer, but it is a worse one than adding a sentence.

Are you the “provider” or the “deployer”? The part most guides skip

Article 50(1) binds providers. Most WordPress site owners running an off-the-shelf plugin are, on the face of it, deployers. That distinction gets glossed over constantly, and it deserves a straight answer.

RoleDefinition (Article 3)Typical WordPress case
Provider Develops an AI system, or has one developed, and places it on the market or puts it into service under its own name or trademark, for payment or free of charge. The plugin vendor. Also, arguably, you — if you white-label the widget under your own brand.
Deployer Uses an AI system under its authority, except in the course of a personal, non-professional activity. A business running a chatbot plugin on its site under the vendor’s branding.

A point worth being precise about, because it is misreported: Article 25 — the provision that converts a deployer into a provider when they put their name on a system or substantially modify it — is scoped to high-risk AI systems. A customer-support chatbot is not high-risk; it is a transparency-obligation system. So Article 25 does not automatically make you a provider just because you renamed the widget.

That said, three things make the distinction a weak place to plant your flag. The definition of provider in Article 3(3) turns on putting a system into service under your own name or trademark, and that is exactly what renaming the widget “Acme Assistant” looks like. Deployers carry their own transparency duties under Article 50(4) for AI-generated content published to the public. And most decisively: the vendor cannot comply on your behalf. The plugin can ship a sensible default, but you are the one who edits the greeting, and if you replace it with something that reads as a person, no amount of upstream design saves it.

If your compliance strategy is a definitional argument about which noun you are, you are spending more on the argument than the fix costs.

Side-by-side comparison of a chat widget with no AI disclosure and one that clearly identifies itself as an AI assistant

“But it is obviously a bot” is a weaker defence than it sounds

Article 50(1) does carve out cases where AI involvement is obvious to a reasonably well-informed, observant and circumspect person, taking into account the circumstances and the context of use. People read that clause and conclude that everyone knows website chat widgets are bots.

Consider what the exemption is actually asking. Your widget probably carries your company’s name, opens with a warm first-person greeting, and may show an avatar. Many of them offer to fetch a human. That design exists to feel personal, which is the opposite of making machine involvement obvious — and the models behind them in 2026 hold a casual conversation well enough that the old tells are gone. A support widget that answers in fluent, contextual prose is a poor candidate for “obvious.”

There is also an asymmetry worth noticing. If you rely on the exemption and you are right, you saved one sentence. If you rely on it and you are wrong, you are defending a judgement call about your own users’ sophistication. That is a bad trade at that price. Our own view is that if you are weighing whether the exemption covers you, that hesitation is the answer.

We checked our own chatbot first, and it would have failed

Before publishing advice, we pulled the live configuration of the chatbot on this site. Here is what it was actually serving:

SurfaceWhat it saidDiscloses AI?
Opening message“Hi there! I’m here to help with all things MxChat — from discounts and product info to technical questions and setup guidance!”No
Pre-chat bubble“Hey! Want 15% OFF? Just ask me for it — seriously, that’s it!”No
Widget header“MxChat”No — a brand name is not a disclosure
Privacy notice“By chatting, you agree to our privacy policy.”No — that is a data-protection notice, a different obligation

Four surfaces, four opportunities to say “this is an AI assistant,” and none of them did. The privacy notice is the instructive one: it is enabled, it renders before the conversation, and it is doing a completely different job. Having a notice is not the same as having this notice.

The factory defaults are no better, and this is the part that generalises beyond us. A fresh install ships intro_message as “Hello! How can I assist you today?” — a sentence with no machine in it — and the privacy-notice toggle defaults to off, so a brand-new install displays no standing notice at all until someone turns it on.

That is not a criticism aimed at one plugin. It is roughly what every chat plugin ships, because until this Sunday there was no reason to ship anything else, and a greeting that sounds like a person tests better. The conclusion for site owners is the one that matters: “I installed a reputable plugin” is not a compliance position. Nobody’s defaults were written against this deadline. Go and look at yours.

The fix, concretely

In order of reliability:

  1. Put it in the opening message. This is the strongest placement because it renders before the visitor types anything, which is exactly the Article 50(5) timing test, and it survives theme changes and mobile layouts.
  2. Add it to the widget header. Persistent, visible for the whole conversation, and useful for anyone who scrolls back. Weak on its own — a header is easy to overlook — but good reinforcement.
  3. Turn on the pre-chat notice and make it carry the disclosure, not just a privacy-policy link. If you already display a notice for data protection, extend it; do not assume it counts as-is.

For MxChat specifically, the relevant settings are these:

SettingShips asSuggested change
intro_message“Hello! How can I assist you today?”“Hi — you’re chatting with an AI assistant. How can I help?”
top_bar_titleYour brand name“<Brand> AI Assistant”
privacy_toggleoffon
privacy_textPrivacy-policy link onlyLead with the AI disclosure, keep the policy link after it

Whatever plugin you run, the names will differ but the surfaces will not: there is a first message, a header, and usually a notice slot. If you are still choosing a plugin, this is now a reasonable thing to evaluate them on — see our comparison of WordPress chatbot plugins, and the MxChat core documentation for where these settings live.

A compliance checklist beside a laptop showing a WordPress admin screen, representing an AI Act chatbot audit

What a compliant disclosure looks like

WorksDoes not work
“You’re chatting with an AI assistant.” “Powered by advanced technology.”
“This is an automated AI chat. Ask for a human any time.” A disclosure that appears only after the user’s first message.
Named bots that stay honest: “I’m Ada, an AI assistant.” A human first name and photo with no other signal.
Disclosure in the visitor’s language on a multilingual site. Disclosure in your terms of service or privacy policy only.

You do not need legal register. “You’re chatting with an AI assistant” is clearer than any paragraph a lawyer would draft, and clarity is the actual standard. Nothing stops you from adding useful context — what it can do, how to reach a person — and users tend to prefer bots that are upfront, which is the rare case where the compliant version is also the better product. If you are weighing that trade-off seriously, our piece on AI chatbots versus human agents covers where the handoff belongs.

Clear, distinguishable — and accessible

Article 50(5)’s “clear and distinguishable” standard comes with accessibility expectations, and this is the part that gets skipped. A disclosure only counts if it is perceivable by the person it is aimed at:

  • Meet normal contrast ratios — do not style it as de-emphasised fine print.
  • Do not rely on colour or an icon alone. A small robot glyph is not a statement.
  • Keep it in the accessibility tree. If the disclosure is decorative markup or hidden with aria-hidden, a screen-reader user never receives it.
  • Translate it. If your site serves multiple languages, an English-only disclosure is not clear to a French visitor — and the EU is the jurisdiction in question.

If accessibility is already on your list this year, the two efforts overlap; our guide to ADA compliance plugins for WordPress covers the tooling.

Your checklist before Sunday

  1. Open your site in a private window and start a chat as a visitor would. Read what it actually says — not what you remember configuring.
  2. Add an AI disclosure to the opening message. This is the one that matters.
  3. Rename the widget header to include “AI” if it currently reads as a person or a bare brand name.
  4. Check whether your pre-chat notice is enabled, and whether it says anything about AI as opposed to data protection.
  5. Test on mobile, where truncation quietly removes text you assumed was visible.
  6. Check any second chatbot — a WooCommerce assistant, a docs bot, a support widget on a subdomain. Each is a separate surface.
  7. Screenshot the result and date it. If anyone asks later what you did and when, that file is the answer.

Two later dates are worth diarising while this is in front of you: 2 December 2026, when Article 50(2) marking obligations extend to systems already on the market, and 2 February 2027, the watermark-interoperability date for signatories to the associated Code of Practice. Neither changes what you should do this week.

If you are still budgeting a chatbot rather than adjusting one, our breakdown of what a chatbot actually costs is the companion piece — and if you are wondering whether WordPress core’s new AI layer changes the picture, we covered that in WordPress 7.0 put AI in core.

One sentence, one afternoon

Article 50 is the rare regulation whose core requirement is smaller than the effort of reading about it. Open your chatbot settings, put “you’re chatting with an AI assistant” where a visitor sees it first, and you have addressed the substance. We have filed the change for ours.

See how MxChat works on WordPress

This is practical guidance from a WordPress plugin team, not legal advice; if your exposure is significant, have counsel review your specific setup.

Disclosure is not the only deadline on the calendar. OpenAI shuts down two more chat models on 10 August 2026 — here is how to check whether your chatbot is pointed at one of them.

Similar Posts