Generated with the help of an LLM.

Problem/Motivation

Drupal.org currently only learns about sites in the wild through Update Status requests: a pseudonymous site_key (an HMAC of the base URL keyed by the site's private key), the list of installed projects, and their versions. That is enough to count projects and not much else, and it can't distinguish between production and pre-production environments either.

#2940737: Add more telemetry to Drupal core has been collecting eight years of ideas for broader telemetry. At DrupalCon Rotterdam 2026 the maintainers asked for the smallest concrete step instead (see comment #56 there): let site owners choose to share their site's domain name and, separately, the site email address, with nothing else added.

This issue proposes an implementation for that incremental step.

What the Drupal Association would do with the data:

  • Provide more accurate reports of the count of live Drupal sites, specifically:
    • With Domain names
      • Separate production sites from local, CI and staging copies (localhost, *.ddev.site, *.test, bare IP addresses), which today inflate and blur usage statistics.
      • Count real sites more reliably than site_key, which changes whenever the base URL or private key changes.
      • Describe the Drupal user base by sector and region from the TLD (.gov, .edu, .ac.uk, country codes) without crawling.
      • Calibrate Drupal.org's usage numbers against third-party estimates, which undercount headless sites.
      • (potentially) Provide other forms of anonymized/aggregate reporting to the community
    • With site admin emails
      • Let the Association contact site owners directly about end-of-life and critical security notices for their major version; occasional community surveys; information about DA programs, such as DrupalCon, etc.
      • Start an outreach program to site-owners/end-users
      • Implement cost-recovery programs targeted towards site-owners/end-users to help support Drupal infra

What the Drupal Association would NOT do with the data:

  • Target any end-user based on content/political speech/etc with intent to cut them off from services
  • Use the data for anything other than strengthening our relationships with end-users, creating programs to foster support for the project, infra, and DA itself.

(The above two lists may not yet be comprehensive, but are directionally accurate to our intent).

Proposed resolution

Add two nullable boolean settings to update.settings: data_sharing.domain and data_sharing.site_mail. NULL means the site owner has not yet chosen.

This notice-period behavior would be a new pattern in core - so it probably deserves framework manager attention.

The checkbox defaults and the notice period length are constants in \Drupal\update\DataSharing. Changing the domain choice from opt-out to opt-in is a one-line change; with opt-in defaults the end of the notice period changes nothing.

The choice is presented in two places:

  • The installer's "Configure site" screen (interactive installs only, nested under "Check for updates automatically"), and the Update Status settings form, which shows the exact values that would be sent.
  • Sites installed non-interactively (Drush, hosting platforms) and existing sites updated to this version start in the undecided NULL state. They are given a message that the default settings will take effect in 30 days, or on save.

Values are sent only to the default Drupal.org update endpoint, never to a server configured through update.settings:fetch.url or an extension's project status url.

Option Core side Drupal.org side Trade-offs
A1. Append domain and site_mail to the existing release-history/drupal/current request Extra parameters for the drupal project only Extend existing log parsing No new requests. Mixes non-pseudonymous data into the request stream already parsed; the email lands in CDN and web logs as a query string.
A2. One extra GET per refresh to a synthetic endpoint, as recipe-applied does in #3489066: Add tracking for when recipes from Drupal.org are applied One new fetcher method and call site Static CDN response plus log analysis Keeps release-history semantics untouched; one request per cycle; the email is still a query string in logs.
B. One POST with a JSON body to a receiving service Same call site, different method body A real service with storage, retention and access controls Keeps the email out of access logs; the service must exist before end-to-end testing.

The MR implements option A2 as the proposal to review; A1 and B remain alternatives.

Remaining tasks

  • Decide the default for the domain choice: opt-out as proposed, or opt-in.
  • Decide the transport (A1, A2 or B).
  • Drupal Association: publish the data-use statement and link it from the UI text; update the Update Status module overview to describe the site key, the project list, and the two optional values.
  • Usability and accessibility review of the installer and settings UI, and of the final wording. The existing "anonymous information" text in the installer and the Update Status help needs rewording regardless.
  • Follow-up issue for the Drupal CMS installer, which does not use SiteConfigureForm.
  • Record the observed hostname for drush cron without --uri (same source as site_key; a known limitation, not a new one).
  • Drupal Association: stand up the receiving endpoint (https://updates.drupal.org/site-data, a synthetic 2xx response at the CDN as for recipe-applied) and exempt the path from the bot challenge, before this is committed. The endpoint returns 404 today.
  • Decide the notice period length (30 days proposed), and whether to send a one-time email to the Update Status notification addresses when it starts.
  • Change record.

User interface changes

New fieldset on the installer's "Configure site" screen, shown only when "Check for updates automatically" is checked. New fieldset on /admin/reports/updates/settings. New status report entry and admin page message while the choice is undecided. Updated wording for the existing "anonymous information" text in the installer and in the Update Status help.

API changes

Possibly one new method on \Drupal\update\UpdateFetcherInterface; see the MR. No other API changes.

Data model changes

update.settings gains data_sharing.domain and data_sharing.site_mail, nullable booleans. Both are NULL on existing sites after update and on non-interactive installs. A post-update hook adds the keys.

State key update.data_sharing_notice_start holds the notice period start.

Release notes snippet

Site owners can now choose whether their site shares its domain name and site email address with Drupal.org and the Drupal Association. Existing sites are asked to review the choice after updating; nothing is shared during a 30-day notice period, after which the recommended settings (share the domain, do not share the email address) apply until a choice is saved.

Issue fork drupal-3632720

Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

hestenet created an issue. See original summary.

hestenet’s picture

hestenet’s picture

Restating my answers to #2940737: Add more telemetry to Drupal core comments #57 to #65 here and in the issue summary.

What the Drupal Association would do with the data:

  • Provide more accurate reports of the count of live Drupal sites, specifically:
    • With Domain names
      • Separate production sites from local, CI and staging copies (localhost, *.ddev.site, *.test, bare IP addresses), which today inflate and blur usage statistics.
      • Count real sites more reliably than site_key, which changes whenever the base URL or private key changes.
      • Describe the Drupal user base by sector and region from the TLD (.gov, .edu, .ac.uk, country codes) without crawling.
      • Calibrate Drupal.org's usage numbers against third-party estimates, which undercount headless sites.
      • (potentially) Provide other forms of anonymized/aggregate reporting to the community
    • With site admin emails
      • Let the Association contact site owners directly about end-of-life and critical security notices for their major version; occasional community surveys; information about DA programs, such as DrupalCon, etc.
      • Start an outreach program to site-owners/end-users
      • Implement cost-recovery programs targeted towards site-owners/end-users to help support Drupal infra

What the Drupal Association would NOT do with the data:

  • Target any end-user based on content/political speech/etc with intent to cut them off from services
  • Use the data for anything other than strengthening our relationships with end-users, creating programs to foster support for the project, infra, and DA itself.

(The above two lists may not yet be comprehensive, but are directionally accurate to our intent).

hestenet’s picture

Issue summary: View changes

hestenet’s picture

Issue summary: View changes
hestenet’s picture

Issue summary: View changes
hestenet’s picture

Issue summary: View changes
hestenet’s picture

Some screenshots of what this looks like:

The warning message that appears prompting an admin to set the data sharing settings

The Update Status settings showing the new Data Sharing options in their default configuration

hestenet’s picture

Issue summary: View changes
catch’s picture

Not as a framework manager, just my personal opinion as a long term Drupal contributor: I disagree with opting existing sites into sharing their domain names via a notice period. This is very, very different from a checkbox being checked by default when you install a new site or whatever, and I would imagine many, many people would get annoyed.

As a framework manager: I can't find the issue, but we have one somewhere for 'choose your own adventure' updates - e..g the ability to prompt a site owner during the hook_update_N()/post update whether they want to apply a change or not. With that, it would be possible to add a confirmation step where the site owner makes an explicit (reversible) choice to opt in or out when they update their site. If the config can be true/false/null then that could be added after adding a UI for it - would only need to show the option for sites where it's null.

hestenet’s picture

As a framework manager: I can't find the issue, but we have one somewhere for 'choose your own adventure' updates - e..g the ability to prompt a site owner during the hook_update_N()/post update whether they want to apply a change or not. With that, it would be possible to add a confirmation step where the site owner makes an explicit (reversible) choice to opt in or out when they update their site. If the config can be true/false/null then that could be added after adding a UI for it - would only need to show the option for sites where it's null.

If that's a pattern that exists out there, I'd be very happy to try implementing that instead of the notice period version. Was just wracking my brain for how to handle the existing site use case.

catch’s picture

Couldn't find an actual issue for what I was talking about, only previous discussions, so opened one: #3633308: Interactive updates.

hestenet’s picture

Created an issue for the Drupal.org infrastructure side of the implementation: https://git.drupalcode.org/project/infrastructure/-/work_items/3606961

hestenet’s picture

dww’s picture

Trying to be civil. 😅 There's a lot not to like here for me personally:

  1. I definitely oppose any opt-out behavior for new telemetry as proposed. Anything new "we" start collecting should be opt-in.
  2. I'm trying to avoid having to read LLM output (either issue summaries or MR code). I kind of hate the default AI disclaimer now. It's too vague to be helpful (what kind of help did you get from your LLM? Did it write the code? The summary? Both? etc) and for me acts as a "stay away" sign.

Re point 1: I'm okay with a status report warning that your value for the new knobs is still NULL and you should go to the settings page to confirm your choice. But NULL should be treated as FALSE, and we should never send anything new until someone explicitly sets the knob to TRUE. Not even after 30 days.

I confess to have only skimmed the summary (wasn't clear if it was slop I'd have to parse or not) and haven't looked at the code at all. But as a subsystem maintainer, I wanted to try to weigh in early on the direction around consent.

Thanks,
-Derek

catch’s picture

I'm okay with a status report warning that your value for the new knobs is still NULL and you should go to the settings page to confirm your choice. But NULL should be treated as FALSE, and we should never send anything new until someone explicitly sets the knob to TRUE. Not even after 30 days.

Yep this is what I was getting at with #11. Or some kind of explicit opt in/out/later as part of an interactive update. But nothing that leads to it being on due to inaction.

dww’s picture

Re: #11 and #17: Yup, that all sounds good. Glad we're in agreement on this much. 😅