Skip to main content

1. The moving parts, and how they talk to each other

There are three separate systems involved, and almost every bug in this stack comes from an assumption that two of them agree on a piece of data when they actually don't:

  • Your extension's package manifest — the XML file Joomla reads on install, and the one it copies into administrator/manifests/packages/ for later reference.
  • Akeeba Release System (ARS) — hosts your release files and generates the update-stream XML feed that Joomla's Extensions: Update page polls. ARS is also the gatekeeper: it decides, per download request, whether the requester is allowed to have the file.
  • Your storefront (J2Commerce, or whatever you use) — issues the actual Download ID / license key to a paying customer, and needs some way to tell ARS "this specific customer's key should be allowed to access this specific product's protected releases."
Customer's Joomla site
  │
  │ 1. "Check for Updates"  (Joomla's Updater service)
  ▼
Your update stream URL  (hosted by ARS, e.g. https://yoursite.com/updates/yourpkg.xml)
  │
  │ 2. Feed lists latest version + download URL + <element>
  ▼
Joomla matches <element> against the installed extension's real element
  │
  │ 3. If matched: appends the customer's Download ID (extra_query) and downloads
  ▼
ARS checks the download request against the Item's Access Level
  │
  │ 4. Valid key + sufficient access → 200 + file.  Otherwise → 403.
  ▼
Joomla installs the package

Every step above is a place we found a real, silent failure. We'll go through them in the order you're most likely to hit them.