Skip to content
Shahid Malla

How to Upgrade Laravel to 13: Steps, Breaking Changes and AI Help

A step-by-step Laravel 13 upgrade: how many major versions to hop, the PHP 8.3 minimum, the breaking changes that actually bite, Laravel Boost and Shift compared, and what Filament needs. Sources read 1 November 2026.

· Published · 11 min read · 8 steps

Upgrading Laravel to 13 is a short job on a healthy Laravel 12 app and a long one on anything older. Laravel 13 needs PHP 8.3 or newer. Move one major version at a time, bump laravel/framework to ^13.0, and work through the official upgrade guide. Laravel's own estimate for the 12 to 13 step is ten minutes.

Upgrading Laravel to 13 means moving an application onto the laravel/framework ^13.0 release line, which Laravel published on 17 March 2026. It is a Composer dependency change followed by a pass over the documented breaking changes, not a rewrite. Laravel ships one major version a year and says it aims to let you move to a new major release "in one day or less".

Five-step Laravel 13 upgrade workflow: check versions, raise PHP, clear blockers, hop one major version, test and ship, looping back for older versions
The order this guide follows, which is the order I do the work in. Source: shahidmalla.com.

Which Laravel version are you on, and how many hops is that?

Find out first, because the number of major versions between you and 13 is the whole estimate. Run composer show laravel/framework in the project root. Laravel's release notes then tell you where that leaves you: bug fixes for 18 months and security fixes for 2 years from each major release.

VersionPHP supportedReleasedBug fixes untilSecurity fixes until
Laravel 108.1 - 8.314 February 20236 August 20244 February 2025
Laravel 118.2 - 8.412 March 20243 September 202512 March 2026
Laravel 128.2 - 8.524 February 202513 August 202624 February 2027
Laravel 138.3 - 8.517 March 2026Q3 202717 March 2028

Laravel 10 and 11 get no more security fixes at all; Laravel 12 has under four months left; Laravel 13 is covered until 17 March 2028.

Each major version has its own guide and estimate: the 10 to 11 guide says 15 minutes, the 11 to 12 guide 5 minutes, the 12 to 13 guide 10 minutes. Those cover the mechanical edits, not your code, packages or tests, which is where the hours go. Hop in order and commit after each one.

Does your server's PHP meet the Laravel 13 minimum?

Laravel 13 requires PHP 8.3 and supports up to 8.5. If you are on 8.2 that is a separate project to finish first, and it is the most common reason a Laravel 13 upgrade stalls. Pick the branch by how long it is supported. These dates are from the PHP supported versions page, read on 1 November 2026.

PHP branchActive support untilSecurity fixes untilWorks with Laravel 13?
8.231 December 2024 (ended)31 December 2026No, below the minimum
8.331 December 2025 (ended)31 December 2027Yes, the minimum
8.431 December 202631 December 2028Yes
8.531 December 202731 December 2029Yes, the maximum

PHP 8.3 clears the bar but left active support on 31 December 2025, and 8.4 leaves it on 31 December 2026. By that test 8.5 has the longest runway, and Laravel 13 supports it. Composer's documentation shows prohibits working on platform requirements as well as packages:

composer prohibits php 8.5

Anything it lists will not install on that PHP version. Raising PHP on the server is its own job with its own risks, and I wrote that up in updating PHP on a server safely.

Will your packages let you move to Laravel 13?

This decides the schedule, and Composer answers it in one command. The Composer CLI documentation says prohibits, also spelled why-not, "tells you which packages are blocking a given package from being installed".

composer prohibits laravel/framework 13.0
composer prohibits laravel/framework 13.0 --tree

Run it before you edit anything. An empty result means nothing stands in the way. A list means each named package needs a newer release, a replacement or removal. --tree prints the chain, so you can see whether the blocker is one you chose or something three levels down. --locked reads composer.lock instead of the installed files.

Filament is the admin panel package I run into most often on Laravel projects, so check it directly.

What you are checkingFilament v4Filament v5
Laravel constraint in filament/support^11.28 | ^12.0 | ^13.0^11.28 | ^12.0 | ^13.0
Livewire floor^3.8.7^4.4.8
Requirements in its own upgrade guidePHP 8.2+, Laravel v11.28+, Tailwind CSS v4.1+ for custom themes (v4 guide)PHP 8.2+, Laravel v11.28+, Livewire v4.0+, Tailwind CSS v4.0+

The illuminate/contracts line decides whether Filament installs on Laravel 13, and both branches allow it. Plugins are the real risk: Filament's own upgrade guide warns that "some plugins you're using may not be available in v5 just yet" and suggests removing, swapping or waiting for them. If you are moving Filament too, its script does the repetitive edits:

composer require filament/upgrade:"^5.0" -W --dev
vendor/bin/filament-v5
# Run the commands output by the upgrade script, they are unique to your app
composer require filament/filament:"^5.0" -W --no-update
composer update

Do not run the Filament upgrade and the Laravel upgrade in the same commit. One at a time, tests in between, so a failure has one obvious cause.

Which upgrade route should you take: by hand, Shift or an AI agent?

Three routes exist, and the Laravel documentation names two of them. Pick on how many hops you have and whether your test suite is trustworthy.

RouteWhat it doesBest forWhat it will not do
By handYou edit composer.json and walk the upgrade guideOne hop, few packagesFind anything for you; you read every impact note
Laravel ShiftPaid service that automates the mechanical editsSeveral hops from an old versionAct as a first-party product, or skip your review and tests
Laravel BoostFirst-party MCP server with guided upgrade promptsTeams already in Claude Code, Cursor or CodexOwn the review; an agent proposes, you approve

The upgrade guide calls Shift "a community-maintained service that automates Laravel upgrades". Its prices are per major version, so an old app pays for each hop:

Bar chart of Laravel Shift list prices read 1 November 2026: $39 to reach Laravel 10, $39 to reach 11, $29 to reach 12 and $19 to reach 13
Laravel Shift list prices, one Shift per major version, in US dollars. Source: the Shifts page on laravelshift.com, read 1 November 2026.

In figures, on the Shifts page on 1 November 2026: the Shift to Laravel 10.x costs $39, to 11.x $39, to 12.x $29 and to 13.x $19. A Laravel 11 app therefore pays $48 to reach 13 and a Laravel 10 app pays $87. The same page offers purchasing power parity pricing in some countries, and lists a free Laravel PreShift that reports what your upgrade involves before you buy anything.

The AI route is newer. The upgrade guide calls Laravel Boost "a first-party MCP server that provides your AI assistant with guided upgrade prompts": install it in a Laravel 12 app, then run the /upgrade-laravel-v13 slash command in Claude Code, Cursor, OpenCode, Gemini or VS Code. It needs laravel/boost ^2.0.

composer require laravel/boost --dev
php artisan boost:install

The Boost documentation lists what the agent gets: MCP tools that read your PHP and Laravel versions, installed packages, schema, last error and recent log entries, plus a documentation API with "over 17,000 pieces of Laravel-specific information", so the agent checks the version it is editing instead of guessing. Run php artisan boost:update after the bump so the guidelines match, and keep the agent in a reviewable loop, as in my Claude Code workflow for client projects.

How do you run the Laravel 12 to 13 upgrade?

Edit the constraints in composer.json, run composer update, then walk the breaking changes. The guide's high-impact dependency edits:

PackageNew constraint for Laravel 13
laravel/framework^13.0
laravel/boost^2.0
laravel/tinker^3.0
phpunit/phpunit^12.0
pestphp/pest^4.0

If you also create new apps on that machine, the guide says to refresh the installer with composer global update laravel/installer, or update Herd. Start from a fresh branch and a green suite: on a red suite you cannot tell which failures the upgrade caused.

Which Laravel 13 breaking changes actually bite?

The quiet ones cause more trouble than the loud ones. Laravel grades every documented change by likelihood of impact, and says the focus of this cycle was "minimizing breaking changes", so most applications upgrade without much code moving.

ImpactChangeWhat you do
HighCSRF middleware renamed VerifyCsrfToken to PreventRequestForgery, with origin checks on the Sec-Fetch-Site headerUpdate direct references, above all withoutMiddleware calls. Old names remain as deprecated aliases
MediumCache config gains serializable_classes set to falseIf you cache PHP objects, list those classes or switch to arrays
Mediumupsert() on MySQL or MariaDB throws InvalidArgumentException when uniqueBy is emptyPass a non-empty uniqueBy, even though those drivers ignore its value
LowJobAttempted swaps $exceptionOccurred for $exception; QueueBusy renames $connection to $connectionNameUpdate any listener reading those properties
LowDefault cache, Redis and session key prefixes move from underscores to hyphensSet CACHE_PREFIX, REDIS_PREFIX and SESSION_COOKIE to keep the old values
LowBootstrap 3 pagination views renamed to pagination::bootstrap-3Update references to the old pagination::default names

Two more bite after deployment rather than during it.

  • Session serialization. The Laravel 13 skeleton sets serialization to json in config/session.php. The guide is explicit: syncing that file and changing php to json "will invalidate all active user sessions". Keep php to upgrade without logging everyone out, or move to json deliberately and warn your users.
  • Global helper collisions. Laravel 13 depends on symfony/polyfill-php85, which on PHP below 8.5 defines array_first() and array_last(). The guide warns these can conflict with laravel/helpers or your own helpers, and that the historical array_first() took a callback while the polyfill version does not. Use Arr::first() instead.

Lower down sit changes that only show up in tests: Container::call respects nullable class defaults, custom Str factories reset between tests, domain routes take precedence over non-domain routes, and Js::from uses unescaped Unicode. None break a boot; all can turn a passing assertion red.

How do you test and ship the upgrade without breaking production?

Treat it as a deployment, not a maintenance task. This is the checklist I work through on a client Laravel upgrade.

  • Branch from a green suite on the version you run today.
  • Back up the database and confirm you can restore it somewhere else.
  • Upgrade PHP on its own, and run the suite before touching Laravel.
  • One major version per commit, with composer prohibits laravel/framework <next>.0 before each.
  • Diff config/ against the Laravel 13 skeleton and decide each change on purpose, above all session.php and cache.php.
  • Exercise what tests rarely cover: login, password reset email, payment webhook, queue worker, scheduled commands, uploads.
  • Deploy to staging on production's PHP version and run the queue and scheduler there for a day.
  • Ship in a low-traffic window with the previous release ready to redeploy.

Check the database too. Laravel's database documentation lists first-party support for MariaDB 10.3+, MySQL 5.7+, PostgreSQL 10.0+, SQLite 3.26.0+ and SQL Server 2017+. The DELETE change is the one to watch: Laravel 13 compiles ORDER BY and LIMIT into joined deletes, and the upgrade guide names MySQL, and MariaDB before 11.8.1, as engines that do not support that syntax and may now throw a QueryException instead of running an unbounded delete.

When should you not upgrade to Laravel 13 yet?

When something upstream of the framework is not ready. The upgrade itself is cheap; the conditions around it are what cost money.

Decision flow for Laravel 13: out of security support means upgrade now, old PHP means raise PHP first, blocked packages or red tests come first, otherwise go
Should you upgrade to Laravel 13 now? Answer in order; the first answer that reaches an outcome decides. Source: my own rules, written 1 November 2026.

In words: out of security support, upgrade now, one hop at a time. Server stuck below PHP 8.3, raise PHP first. composer prohibits names a blocker, clear it first. Tests red today, fix that first. Otherwise plan the upgrade into this sprint.

Three situations where waiting is the right call:

  • A paid package has no Laravel 13 release. You cannot patch what you do not own. Ask the vendor for a date before booking the work.
  • You are mid-release on something else. A framework bump during a feature freeze gives every bug two possible causes.
  • Nobody can test it. With no suite and no staging copy, build those first. That is the larger project, and it pays for itself on every upgrade after this one.

Waiting is not free either. Laravel 12 loses security fixes on 24 February 2027, and an unsupported framework is the kind of thing a security questionnaire asks about. If you are still choosing a stack, my SaaS MVP tech stack guide covers how those choices affect upgrades later.

What else do people ask about upgrading Laravel to 13?

Is Laravel 13 a big upgrade?

No, by Laravel's own account: the release notes say "most Laravel applications may upgrade to Laravel 13 without changing much application code". The documented high-impact items are the dependency bumps, the installer refresh and the CSRF middleware rename.

What PHP version does Laravel 13 need?

PHP 8.3 is the minimum and 8.5 the highest supported, so on 8.2 you raise PHP first. PHP 8.3 left active support on 31 December 2025 and 8.4 leaves it on 31 December 2026, so 8.5 is the supported branch with the most life left.

How long does upgrading to Laravel 13 take?

Laravel's estimate for the 12 to 13 step is ten minutes, covering the documented edits only. The real time goes into packages that are not ready, a PHP upgrade if you need one, and a full test and staging run. I do not publish an average, because it depends on your packages and your number of hops.

Can you skip from Laravel 10 straight to Laravel 13?

Laravel publishes one upgrade guide per major version, so the documented path is 10 to 11, 11 to 12, then 12 to 13. Composer may resolve a direct jump, but you would be debugging three sets of breaking changes at once.

Does Filament work with Laravel 13?

The filament/support package on both the v4 and v5 branches declares illuminate/contracts as ^11.28|^12.0|^13.0, so Filament itself allows Laravel 13. Run composer prohibits laravel/framework 13.0 anyway: third-party plugins are usually what is not ready.

Should I use Laravel Shift or Laravel Boost?

They solve different halves. Shift is a paid community service that automates the mechanical edits, which suits several hops from an old version; Boost is first-party and gives an AI assistant guided prompts plus tools to read your real versions, schema and logs. Both still need your review and a test run.

If your Laravel app is several versions behind, or the upgrade keeps getting pushed because nobody wants to own the risk, that is work I take on as a Laravel developer and alongside ongoing SaaS development: a free scoping call of about 30 minutes, a written quote within one business day, and $55-$65 per hour or a fixed price per scope.

Last reviewed 1 November 2026. Disclosure: I sell Laravel development, upgrades and maintenance, so I am not neutral. I am CTO at ElySpace, a freelance developer for Marmaids LLC, and founder of WHMCSPilot and MagizAI. I am not affiliated with, paid by or endorsed by Laravel, Laravel Shift or Filament. Versions, dates, prices and commands come from laravel.com, php.net, getcomposer.org, laravelshift.com, filamentphp.com and the Filament source repository as I read them on 1 November 2026; prices are list prices in US dollars before tax.

Share this article

Shahid Malla

Written by

Shahid Malla

Freelance WHMCS developer and web designer with 13+ years of client work. CTO at ElySpace, freelance developer for Marmaids LLC, and founder of WHMCSPilot and MagizAI.

Got a project like this?

Tell me what you need and I will send a written quote within one business day.