Web Design

Drupal 9 Upgrade Guide: What It Means and How to Prepare

To prepare for the Drupal 8 to 9 upgrade: (1) Update Drupal 8 core and all contributed modules to their latest 8.x releases — many modules have already prepared for D9 compatibility in their latest 8.x releases; (2) Install and run the Upgrade Status module to identify deprecated API usage in custom modules and themes; (3) Update or replace contributed modules that don't have D9-compatible releases; (4) Fix deprecated API usage in custom modules — the Drupal Rector tool can automate many of these fixes; (5) Update your PHP version to 7.4 or 8.0 (Drupal 9 requires PHP 7.4+, Drupal 8 supported PHP 7.0); (6) Run the upgrade on a staging environment and verify all functionality before deploying to production.

Published: 2020-07-16 | Last Updated: 2020-07-16 | 8 min read

Key Takeaways

  • Drupal 9 is built from Drupal 8 with deprecated code removed — it's not a ground-up rewrite, making the upgrade more manageable than previous major versions.
  • Drupal 8 reaches end-of-life November 2, 2021 — security updates stop after this date.
  • The Upgrade Status module is the essential first step — it identifies all blocking issues before upgrade planning.
  • PHP version is a common upgrade blocker — Drupal 9 requires PHP 7.4+, while Drupal 8 supported PHP 7.0.
  • Contributed modules must have Drupal 9 compatible releases before upgrading — check drupal.org/project/[module] for D9 compatibility status.

Drupal 9 launched on June 3, 2020 — and with it, Drupal 8 received its end-of-life date: November 2, 2021. For organisations running Drupal 8, this creates a clear timeline for upgrading. Unlike previous major Drupal version migrations — which required migrating content and rebuilding functionality — the Drupal 8 to 9 upgrade is designed to be a relatively smooth in-place upgrade. This design choice was intentional. Drupal 9 was built inside Drupal 8 — the APIs and architecture are the same, with deprecated code removed and major third-party dependencies (Symfony, Twig) updated to their latest versions. Sites that kept pace with Drupal 8 deprecation notices throughout the 8.x release cycle should have minimal upgrade work. Sites that deferred maintenance and accumulated deprecated code usage have more work to do. This guide covers what Drupal 9 changes, how to assess your site's upgrade readiness, and what the upgrade process involves.

Definition: Deprecated API and What It Means for Drupal Upgrades

A Deprecated API is a function, class, or method that still exists in the current version of the software but is scheduled for removal in a future version. Drupal 8 included many deprecated APIs — functions and classes carried over from earlier versions that were marked for removal in Drupal 9. Throughout the Drupal 8 release cycle, the Drupal community produced replacement APIs and updated documentation encouraging developers to migrate away from deprecated usage. Drupal 9 removed these deprecated APIs — code that called deprecated functions in Drupal 8 generates PHP errors in Drupal 9. The Drupal Rector tool (drupal.org/project/drupal_rector) uses automated code refactoring to update many deprecated API usages to their Drupal 9 equivalents — significantly reducing manual custom module update work.

Assessing Your Drupal 8 Site's Upgrade Readiness

The Upgrade Status module produces a comprehensive readiness report — the severity of its findings determines your upgrade timeline and effort.

Install the Upgrade Status module (drupal/upgrade_status) on your Drupal 8 staging environment: `composer require drupal/upgrade_status`, then enable it in the module admin and navigate to Admin > Reports > Upgrade Status. The report checks: all installed contributed modules for Drupal 9 compatible releases (green = compatible, yellow = needs update, red = no D9 version available), all custom modules and themes for deprecated API usage (the more red items, the more custom code work required), and any third-party libraries or JavaScript that may need updates.

Contributed module compatibility is often the most variable factor. For popular modules (Views, Webform, Pathauto, Metatag, Token, Admin Toolbar), Drupal 9 compatible releases have been available for months ahead of the D9 launch. For less common contributed modules — particularly those with small maintainer teams or those solving niche use cases — D9 compatible releases may be delayed or unavailable. Where a D9-compatible release doesn't exist, options are: wait for the port (check the module's issue queue for D9 port progress), fund the port (the Drupal community supports sponsored module development), find an alternative module with the same functionality, or replace the module functionality with custom code.

PHP version compatibility is a frequently overlooked upgrade blocker. Drupal 9 requires PHP 7.4 as a minimum (and supports PHP 8.0+). Drupal 8 supported PHP 7.0, 7.1, 7.2, and 7.3 — sites on older hosting environments running PHP 7.2 or 7.3 need a PHP upgrade before upgrading Drupal. Check your current PHP version in Drupal Admin > Reports > Status Report. If your hosting environment doesn't support PHP 7.4 or 8.0, a hosting upgrade or migration may be required as part of the D9 upgrade project.

  • Install Upgrade Status module on staging — do not run on production
  • Check contributed module D9 compatibility — drupal.org/project/upgrade_status covers all installed modules
  • Check PHP version — Drupal 9 requires 7.4 minimum, 8.0+ recommended
  • Review custom module and theme deprecated API usage — the most variable upgrade effort factor
  • Run Drupal Rector on custom code — automates many deprecated API replacements

The Drupal 8 to 9 Upgrade Process

The upgrade sequence: update D8 to latest minor version, fix all deprecated API usage, update composer dependencies, run the upgrade, and verify functionality on staging before production deployment.

Step 1: Update Drupal 8 core to the latest 8.9.x release (the final Drupal 8 minor version, maintained until D8 EOL). Run `composer update drupal/core-recommended drupal/core-composer-scaffold --with-all-dependencies` to update core and all dependencies. Then update all contributed modules to their latest 8.x releases — many latest 8.x module releases are also compatible with Drupal 9, so this step pre-resolves some D9 compatibility issues.

Step 2: Fix deprecated API usage. Install the Drupal Rector tool and run it against your custom modules: `vendor/bin/rector process web/modules/custom`. Rector applies automated fixes for many common deprecated usages. Review the changes it makes and test that custom module functionality still works after the automated refactoring. For remaining deprecated usages that Rector doesn't handle, update manually following the deprecation notices (Drupal.org deprecation notices include the recommended replacement for each deprecated function).

Step 3: Upgrade Drupal core from 8.x to 9.x by updating the composer.json version constraint and running composer update. On staging, run `drush updb` to apply any database updates. Run `drush cr` to rebuild caches. Verify all pages load without PHP errors, all contributed modules function correctly, and custom functionality is intact. Run your full test suite if you have one. After staging verification is complete, deploy to production during a maintenance window.

Experience Signal

The Drupal 8 to 9 upgrades that go smoothest are the ones on sites that maintained Drupal core and contributed module updates throughout the 8.x release cycle — sites that ran the latest 8.x minor releases had already resolved many deprecation warnings progressively, making the final D9 upgrade a minor step. The more challenging upgrades are on sites that went 12–18 months without core updates and have accumulated multiple version gaps in contributed modules, plus significant deprecated API usage in custom code that was never addressed. The lesson: ongoing maintenance is significantly less expensive than deferred major version upgrades.

Frequently Asked Questions

The Drupal 8 to 9 upgrade is significantly less disruptive than previous major version migrations (Drupal 6 to 7, or 7 to 8) because Drupal 9 was built into Drupal 8 — it's essentially Drupal 8 with deprecated code removed and third-party dependencies updated (Symfony 4/5 instead of Symfony 3, Twig 2/3 instead of Twig 1). For a Drupal 8 site with: up-to-date core, all contributed modules compatible with Drupal 9, and no deprecated API usage in custom code, the upgrade can be straightforward. For sites with custom modules using deprecated APIs or contributed modules not yet ported to Drupal 9, the upgrade involves fixing or replacing that code before upgrading.

Sources

Running Drupal 8 and Need to Upgrade?

Webnixon manages Drupal 8 to 9 upgrades — from Upgrade Status assessment through deprecated API remediation, contributed module updates, and production deployment with full functionality verification.

Book a Drupal Upgrade Consultation

About the author

David Okafor

David Okafor

Developer

David is a full-stack developer at Webnixon with expertise in React, WordPress, and custom web application development. He contributes to complex front-end builds, API integrations, and performance-focused engineering for Webnixon clients. He writes about web development best practices, WordPress, and the technical side of building fast, maintainable websites.

Related Articles

Why Enterprises and Governments Choose Drupal: A Business Decision Guide

Web Design

Why Enterprises and Governments Choose Drupal: A Business Decision Guide

Drupal is used by the White House, NASA, the University of Oxford, and thousands of government and enterprise organisations worldwide. It's not the easiest content management system to build with — but for organisations with complex content structures, strict security requirements, and high scalability demands, it's frequently the most capable option available.

September 14, 2017Jai Paek9 min read
Drupal vs WordPress: Which CMS Is Right for Your Organisation?

Web Design

Drupal vs WordPress: Which CMS Is Right for Your Organisation?

WordPress and Drupal are the two most widely deployed open-source CMS platforms in the world. WordPress powers over 33% of all websites. Drupal is the CMS of choice for governments, universities, and enterprise organisations with complex content requirements. Here's how to choose between them.

April 18, 2019Jim Yang10 min read
Website Accessibility: What WCAG 2.1 Means for Your Business Website

Web Design

Website Accessibility: What WCAG 2.1 Means for Your Business Website

Web accessibility — designing websites so that people with disabilities can use them — is a legal requirement in Canada, the EU, and parts of the US, and increasingly a procurement requirement in enterprise and government RFPs. Here's what WCAG 2.1 requires and how to audit your website against it.

January 16, 2020Jai Paek9 min read