Comparison and Decision Guide

This content was generated with the assistance of AI and should be verified against the official Joomla documentation before being relied on in production.

This sub-section’s Joomla bibliography lists the reference material consulted while preparing these pages.

Joomla offers several ways to do almost everything, and most of the early decisions of a project are a choice between two or three of them. This page gives a table and a rule of thumb for each such choice, then says when Joomla is the wrong tool altogether. It was checked on 2026-10-30 against Joomla 6.2.x (6.2.0 was released on 2026-10-13) and PHP 8.3 or later. The 5.x series is in its security-only period: 5.4.10 was the last bugfix release and security fixes continue until 2027-10-12. Joomla 4.x reached end of life in October 2025, and 3.x before it, so this page does not recommend starting a new site on any version older than 6.

The running example is the Tallpine Hiking Club, a fictitious mountain club with trail reports, news, a board, partner banners, an English and German site and a member-only trail-conditions area. Each section ends with the choice the club makes. For cross-CMS metrics (market share, security record, talent pool, cost) see the CMS Comparison, which is not repeated here. The decisions below are about choices inside Joomla.

Core features versus extensions

Joomla core already contains a large part of what a content site needs: articles, categories, tags, custom fields, menus, contacts, banners, news feeds, Smart Search, multilingual associations, redirects, workflows, scheduled tasks, mail templates, multi-factor authentication, privacy tools and action logs, and the Web Services API. What it does not contain is a backup tool, a multisite feature, a shop, a forum or a visual page builder; these come from third-party extensions that are listed in the Joomla Extensions Directory (see Update Servers and the JED).

Question Prefer a core feature when Prefer an extension when

Does core do it?

A core component, plugin or option covers the need, even if it takes some configuration

Core has no equivalent (backup, shop, forum, gallery, event booking)

Maintenance

It is updated with Joomla and covered by the Joomla Security Strike Team

You accept a second update stream and a second vendor

Compatibility

It works on every Joomla release that the site runs

You must check each extension for a new major, and BC6 may hide gaps (see upgrading)

Exit

Content stays in core tables

Data may stay in the extension’s own tables, with a migration cost

Cost

Configuration time

Licence, updates, review and support

Before adopting an extension, check its Joomla and PHP compatibility in the changelog (not only on the directory page), the date of its last release, whether it ships an update server (so Joomla can tell you when a security release exists), and who maintains it. The checks are described in Extensions: Installing, Updating and Update Sites. Extensions are installed from the administrator, so every extension is also code that runs with full privileges on the server: install only what the site needs.

Rule of thumb. Use core whenever it covers eighty per cent of the need, and extend it with a small extension of your own when it does not. The club uses core for articles, tags, contacts, banners and Smart Search, and a backup extension because core has none (see Backups and Recovery). Shop extensions for Joomla exist, but selling is a different problem; if a shop is the main product, compare dedicated platforms first in the E-commerce comparison.

Articles with custom fields versus a custom component

The club publishes trail reports with a distance, an elevation gain, a difficulty, a GPX file and a season. Two designs fit.

  • Articles with custom fields. Create the fields distance-km, elevation-gain, difficulty, gpx-file and season in com_fields, assign them to the Trails categories, and let editors fill them in the article form. The values are stored in #__fields_values and shown by the Automatic Display setting or by a layout override. See Custom Fields and Categories, Custom Fields and Workflow Integration.

  • A custom component. Build com_tallpine with a trail entity, its own table, administrator list and edit views, a site router, access control, and optionally its own Web Services API endpoints. See Component MVC: Administrator and Component Site Views and Routing.

Criterion Articles and custom fields Custom component

Build effort

Hours, no code

Days or weeks: manifest, MVC, router, SQL, language files, tests

Gets for free

Categories, tags, access levels, versioning, workflows, Smart Search, multilingual associations, API endpoints for articles and fields

Only what you wire in: categories, custom fields and ACL integration are opt-in

Data model

One article with a flat set of fields; subforms for repeated groups

Real tables, foreign keys, indexes, queries tuned to the data

Queries and reports

Filtering by field values is limited and slow on large sets

Any SQL the database supports

Volume

Hundreds to a few thousand items

Tens of thousands of records or heavy joins

Maintenance

Joomla updates carry it

Your code on every Joomla major (see upgrade notes)

Risk

Fields are not a schema: renaming or retyping a field affects stored values

Every line is yours to secure and test

Rule of thumb. Start with articles and custom fields. Move to a custom component when the data has its own lifecycle, many records, relations or reporting, or when editors do not think of it as content. The club keeps trail reports as articles with fields, because editors, tags, workflow and search all expect articles. It builds com_tallpine only for the trail catalogue, an imported dataset of thousands of segments with closures from a park authority, which does not belong in the editorial article list. The component can still reuse categories and custom fields, so the choice is not all or nothing; see The Database API and Extension Types, Manifests and Packaging.

Child template versus copied template versus framework

Cassiopeia is the default site template. To make the club’s site look different there are four routes.

Criterion Child template Copied template Template framework or page builder

What it is

A template that names a parent (cassiopeia) and contains only the files that differ

A full copy of Cassiopeia renamed to a new name

A third-party template with its own control panel, layout builder and often its own plugins

Core updates

The parent is updated by Joomla; your files are kept apart

You never receive template fixes

Updated by the vendor, on the vendor’s schedule

Maintenance

Smallest: a few overrides, a stylesheet, positions

Highest: you own every file

Depends on the vendor’s Joomla 6 support and licence

Control

Overrides, user.css, a changed index.php, new positions

Total

Whatever the framework exposes

Lock-in

Low: removing the child returns to Cassiopeia

Low, but drifting

High: layouts live in the builder’s data

Best for

Almost every custom site

Rarely; a template unrelated to Cassiopeia is better built from scratch

Teams that want a visual builder and accept the vendor

Child templates have existed since Joomla 4.1, and Joomla 6.0 ships cassiopeia_extended as a core child template, so older material that calls them brand new is out of date. A child inherits every file of the parent except the files that share a name with a file in the child. The user guide states that child template files are not affected by Joomla updates. See Child Templates and Cassiopeia and Cassiopeia Extended.

<!-- templates/cassiopeia_tallpine/templateDetails.xml (excerpt) -->
<extension type="template" client="site">
    <name>cassiopeia_tallpine</name>
    <!-- a child is not itself a parent -->
    <inheritable>0</inheritable>
    <parent>cassiopeia</parent>
</extension>

A template that has nothing in common with Cassiopeia, or that is meant as a teaching example, is better written from scratch than copied; see Building a Template from Scratch. Third-party frameworks and builders such as Helix Ultimate, T4, Gantry 5, SP Page Builder and YOOtheme Pro are presented neutrally in Template Frameworks and Page Builders, with an audit procedure; their Joomla 6 compatibility is a statement by each vendor.

Rule of thumb. Create a child template of Cassiopeia. Copy a template only to freeze a design on purpose. Choose a framework only for a concrete feature you need and after checking its Joomla 6 support and its exit path. The club uses cassiopeia_tallpine.

Template override versus layout versus plugin

Three mechanisms change the output of an existing page without editing core files. They differ in what they replace and in where the change lives.

Criterion Template override Layout (or layout override) Plugin

What it changes

The HTML of one component view, module or plugin output, for one template

A reusable fragment of markup used by many screens (pagination, an image tag, a field block)

Behaviour or data: it runs on an event and can change content, add checks or inject output

Where it lives

templates/NAME/html/...

templates/NAME/html/layouts/...

A plugin extension, usually in the group of the event

Scope

Per template

Everywhere the layout is rendered, in that template

Site-wide, independent of the template

Survives a template change

No

No

Yes

Needs code

Markup only, some PHP

Markup only

PHP, with a manifest and an installer

Risk

The core file changes after an update and the override goes stale

Same

Runs on every request that triggers the event, so errors and slow code affect the whole site

An alternative layout is a variation of a view that a menu item or a module can select by name; it is created as an override with a different file name and chosen from the Layout list. See Template Overrides and Alternative Layouts and Layouts and Module Chromes for the search order and the screens. When the work is to change what data appears or to react to something happening, a plugin is the right place; see Plugin Development and Events.

Rule of thumb. If the change is about markup in one template, use an override. If the same fragment appears in many places, override the layout once. If the change is about behaviour or must survive a template switch, write a plugin. Prefer an override created from the Templates manager, so the Updated Files tab warns when the core file it copied has changed. The club overrides the article view and the custom-fields layout in its child template, and keeps the trail conditions notice in the plugin plg_content_tallpine_conditions, because it must also work if the template changes.

Modules versus plugins versus components

Joomla has four extension types for a developer to choose among (templates, languages and packages are the others), and the first three are easy to confuse.

Criterion Component Module Plugin

Role

A full application with its own pages, database tables and administrator screens

A block of output shown in a template position, on selected pages

Code that listens for an event in the Joomla lifecycle and acts

Has its own URL

Yes, through a menu item and the router

No; it appears inside a page

No

Has its own admin screens

Yes

A parameter form only

A parameter form only

Typical example

com_tallpine, the trail catalogue

mod_tallpine_nexthikes, a list of upcoming hikes

plg_content_tallpine_conditions, a trail closure notice

Runs

When a menu item or URL points to it

When its position is rendered on the page

When the event is triggered, on any page

Use it for

Data and workflows with pages of their own

Showing something on many pages

Cross-cutting behaviour, integration, validation

A module uses the Dispatcher and Helper design (see Module Development), a plugin uses a services/provider.php and a class that implements SubscriberInterface with the concrete event classes of Joomla 5 and later, and a component uses the namespaced MVC (see Namespaces, Autoloading and Dependency Injection). A plugin placed in the wrong group is never loaded for its event, and a component is not needed when a module can show the same data. The related scheduled and command-line plugin types are covered in Scheduled Task Plugins and Console Command Plugins.

Rule of thumb. If the feature needs its own page, build a component. If it is a box on many pages, build a module. If it reacts to something, build a plugin. A single feature often needs more than one, which is why the club ships all of them in one package, pkg_tallpine, so they install, update and uninstall together; see Extension Types, Manifests and Packaging.

Web Services API versus a custom JSON view

Both return JSON to another program. Since Joomla 4.0 every site has a Web Services API application at /api/index.php/v1, which returns JSON:API documents, authenticates with an API token in the X-Joomla-Token header, and exposes endpoints for articles, categories, fields, users, menus, modules and more. The Developer Manual page for Web Services documents the article operations and points to a list of core endpoints.

Criterion Web Services API Custom JSON view in a component or com_ajax

Format

JSON:API media type, the same for every endpoint

Whatever you write

Authentication

API token or the configured authentication plugins, with the core.login.api permission

Session cookie and CSRF token, or something you build

Routing

Registered by a webservices plugin (createCRUDRoutes())

A route or a task of your component

Pagination, filters, errors

Built in

You implement them

Writes

POST, PATCH, DELETE with ACL checks

A controller task with your own checks

Best for

Headless front ends, scripts, integrations, mobile apps

A small response used by your own page’s JavaScript, behind the session

Effort

Almost none for core content; a plugin and a controller for your own entity

Low for one response, growing with each endpoint

On a fresh 6.2 install the API token plugin is enabled and the Basic Auth API plugin is disabled, so generate a token for a dedicated user and keep it on the server side of the front end. Never put a token in browser code. The following request reads the club’s trail reports.

# TALLPINE_API_TOKEN is read from the environment; it is never written into the repository.
curl --silent \
  --header "Accept: application/vnd.api+json" \
  --header "X-Joomla-Token: ${TALLPINE_API_TOKEN}" \
  "https://tallpine.example/api/index.php/v1/content/articles?filter[category]=12&page[limit]=10"

Rule of thumb. Use the Web Services API for anything that another application consumes, and for headless sites. Use a small custom view or com_ajax call only for a response that the site’s own page needs in the same session. The club’s "trail map" front end reads the API with a server-side token, and the nexthikes module does its small refresh through com_ajax.

When to enable Workflows

Workflows add stages and transitions to articles (and to other components that opt in), so that people can only move an item along the steps their permissions allow. They exist since Joomla 4.0, are off by default, and are switched on in the options of the Articles component. Joomla ships one workflow, the Basic Workflow, and the visual workflow editor arrived in Joomla 6.1. See Workflows for the screens and the plugins.

Situation Leave workflows off Enable workflows

Who publishes

One person, or a small group that trusts each other

Different people write, check and publish

Need to show who approved what

No

Yes

Restrict the publish step to a group

An access level and the Edit State permission are enough

Only a role with the transition permission may publish

Bulk import or API writes

Many items are changed at once, and each transition would be run by hand

Rarely

Super Users

They bypass the workflow anyway

They still can; the audit trail is the benefit for everyone else

Cost

None

More screens, permissions and states that can get stuck

Rule of thumb. Enable workflows when a second person must approve before an item is public, and not before. The club keeps the News category without workflows and gives the Trails categories a Draft, Review and Published workflow in which only the Trail Wardens group runs the publish transition. Permissions are in Users, Groups, Access Levels and ACL.

Staying on 5.4 versus upgrading to 6

Joomla ships a major version every two years, in October of odd years, with four minors, one every six months. The fourth minor (x.4) is a bridge release: it adds no features and is the only starting point for the next major. After x.4.0 there is one year of bugfixes and two years of security fixes. For 5.x the bugfix period ended with 5.4.10 on 2026-10-13, and security fixes continue until 2027-10-12. Joomla 6.x was released on 2025-10-14; the developer roadmap gives regular bugfix support for 6.x until 2028-10-17 and security-only support until 2029-10-16.

Upgrade path from Joomla 3.10 to 4.4, 5.4, 6.x and 7.0, with the bridge releases and the backward-compatibility plugins on each step
Criterion Stay on 5.4 for now Upgrade to 6

Support

Security fixes only, until 2027-10-12

Bugfixes and security fixes

Requirements

PHP 8.1 or later, as before

PHP 8.3 or later; check the database minimums in the Manual and the upgrade guide, which differ for MariaDB and PostgreSQL

Extensions

Everything that works today keeps working

Each extension must be checked; the compatibility plugin Backward Compatibility 6 covers removed legacy classes only for a time

Effort

None now, a larger jump later

A planned project: staging, backup, extension audit

Risk

Falling behind: an unsupported site cannot take security fixes

Removed 6.0 features; a pre-update check that the project describes as not a reliable source of truth

Best for

A site whose critical extensions have no 6.x release yet, with a dated plan

Every site that can move; new sites start on 6

An upgrade starts from the latest 5.4.x. Update to it, disable the old backward-compatibility plugin, enable Backward Compatibility 6 (the two cannot both be on), and switch the update channel to Joomla Next. The Joomla 6.0 removals matter for custom code: JPATH_PLATFORM is no longer defined without BC6, AdminModel::getItem() returns stdClass, and the legacy J* aliases such as JFactory and JText are in BC6 only and off by default on new installs. Automated Core Updates, available since 5.4, are on by default for new installs and off for upgraded sites. For the procedure, the removals and the recovery path see Upgrading Joomla 5 to 6, Deprecations and Preparing for Joomla 7 and Versions, Release Cycle and Support. Sites on 4.x or 3.x first reach 5.4: see Upgrading Joomla 4 to 5 and Migrating from Joomla 3.

Rule of thumb. A new site starts on 6.2. An existing 5.4 site should plan the upgrade within its security window rather than wait for its last month, and should not upgrade production before the extension audit and a staging rehearsal. The club’s site runs 6.2 from the start; a partner club site still on 5.4 has until 2027-10-12 and plans for early 2027. Older books such as Developing Extensions for Joomla! 5 (2023) and Joomla! 4 Masterclass (2023) target platforms that are now security-only or end of life, so their code and screens need the corrections listed in Where Older Books and Tutorials Are Outdated.

Decision tree

flowchart TD A["New web project"] --> B{"Content-driven, with roles, languages or a custom data model?"} B -->|"no, a few pages"| W["Small brochure site: WordPress or Webflow"] B -->|"yes"| C{"Mostly application logic: carts, accounts, dashboards, custom flows?"} C -->|"yes"| L["Application framework such as Laravel, with or without a CMS"] C -->|"no"| D{"Does core already cover the content model?"} D -->|"yes"| E["Joomla core: articles, categories, tags, custom fields"] D -->|"no"| F["Custom component com_tallpine, or an extension"] E --> G{"Several people approve before publishing?"} F --> G G -->|"yes"| H["Enable Workflows"] G -->|"no"| I["Leave Workflows off"] H --> J{"Another application consumes the content?"} I --> J J -->|"yes"| K["Web Services API and a headless front end"] J -->|"no"| M["Child template of Cassiopeia, with overrides"] K --> N{"Existing site on Joomla 5.4?"} M --> N N -->|"yes"| O["Plan the upgrade to 6 before 2027-10-12"] N -->|"no"| P["Start on Joomla 6.2"]

When Joomla is not the right tool

Joomla pays back its learning curve when a site has structured content, access levels, multiple languages and a long life, and when the team wants a PHP CMS with a built-in administrator and API. It is a poor fit in these cases.

  • A small brochure site with a handful of pages, edited by one person, and no custom data. Hosting, updates and a developer cost more than the site needs. Look at the WordPress or Webflow sub-sections, which also compare their own strengths, and at Drupal when the content model, roles and workflows are more demanding than Joomla’s core offers. The CMS Comparison has the cross-CMS metrics.

  • A complex application where the work is business logic, not content: transactions, dashboards, workflows without editors. Use an application framework; see the PHP and Laravel section. Joomla can still serve the content part of such a system through its Web Services API.

  • A shop as the main product. Joomla shop extensions exist, but compare dedicated platforms first in the E-commerce comparison.

  • Many sites from one codebase. Joomla has no multisite feature in core; options are separate installations or a shared single install with workarounds (see Multi-site Options and Scaling).

  • No technical skills or hosting to apply security releases promptly. Automated Core Updates cover minor, patch and security releases but need a publicly reachable site, the Default update channel and 5.4 or later.

  • A planned AI-centred product. Nothing AI-related ships in core as of 6.2; the roadmap lists MCP servers and an AI framework as plans (see AI, MCP and the Roadmap).

Common mistakes

  • Building a custom component for content that articles with custom fields would handle, and then re-implementing categories, versioning and search.

  • Installing an extension without checking its Joomla 6 compatibility or whether it provides an update server.

  • Copying Cassiopeia instead of creating a child template, and then missing every template fix.

  • Editing a core file instead of using an override, so the next update erases the change.

  • Enabling Workflows for a team of one, then wondering why articles are stuck in a stage.

  • Putting an API token in browser JavaScript for a headless front end.

  • Staying on 5.4 with no dated plan, or upgrading production without a staging rehearsal and a backup.