Virtual Products Management Pro - Downloadable Files per Combination with Versions and GitHub Sync
PrestaShop 9 treats Virtual product and Product with combinations as mutually exclusive — so a product sold in several editions or licence tiers cannot normally carry a file per variant. This module manages downloadable files independently of that restriction, giving every combination its own file, version number and changelog. Manage the whole catalogue from one page instead of opening products one at a time, link a combination to a GitHub repository and pull the file, version and changelog with one button, and email past buyers when a new version lands. For PrestaShop 1.7 – 9.
The PrestaShop 9 problem this exists to solve
In PrestaShop 9, "Virtual product" and "Product with combinations" are mutually exclusive product types. That is fine until you sell software, e-books, samples or licences in more than one variant — Standard and Pro, single-seat and team, Windows and macOS — because the moment you need combinations, the built-in virtual-product file field is gone.
This module manages downloadable files outside PrestaShop's virtual-product system entirely. Create the product as Product with combinations, define the variants, and upload a file to each one. Every combination gets its own file, its own version number and its own changelog.
One page instead of one product at a time
Files for the whole catalogue live on a single screen. Expand a product, see its combinations, upload or replace a file, set the version, write the changelog. Seven counters across the top tell you where you stand at a glance — virtual files, products, combination files, simple files, missing files, total downloads and customers — so a product whose file never got uploaded shows up in red there rather than being discovered by a customer.
Each file also carries its own download limit, validity in days and expiry date, so a licence can be time-boxed rather than handed over indefinitely. Any downloadable format works: ZIP, PDF, MP3, FLAC, EPUB, or anything else you sell.
Link a combination to GitHub and stop uploading
Every combination works in one of two modes: Upload File, or GitHub Repository. Switch it to GitHub, give it an owner/repo and optionally a branch or tag, and one Fetch / Sync from GitHub button pulls the file, the version and the changelog together — packaging the release, extracting the version, and reading the recent commit subjects server-side, rather than just filling a box in your browser.
Private repositories are supported through a Personal Access Token. Set a default token once for the whole shop, and override it per product where a different repository needs different credentials.
A Recent Sync Log table records what actually happened per run — product, combination, status, message and date — showing the old → new version transition, or explicitly "no version change" when a run found nothing. A Last automatic run timestamp sits above it, so you can tell at a glance whether the scheduled sync has genuinely fired or has never run at all.
One honest caveat: the hourly sync rides on PrestaShop's own cron-task system, which needs a real external cron on your server to trigger it. Until that is wired up, the manual Fetch / Sync button does the same job on demand — and the Last automatic run line will keep saying never, which is exactly the point of showing it.
Tell your customers there is an update
Each combination has its own Notify Customers button, which emails the customers who bought that product to tell them a new version is available. For anything sold as a licence or a tool, that single button is the difference between a customer who upgrades and one who forgets they own it.
Customers get a proper downloads area
Buyers see their files in their account and on the order detail page, with the version they are entitled to. It is the ordinary PrestaShop account experience, extended to cover per-combination files that the core cannot represent.
What version 1.5.x fixed
Version 1.5.2 fixed a set of real defects worth knowing about, because they are the kind that hide for months.
The changelog field could never be updated by sync. Both sync paths omitted changelog from their UPDATE statement, so once a combination's row existed the field froze at whatever had last been typed by hand — and neither path fetched changelog content from GitHub server-side at all. Sync now pulls the resolved ref's recent commit subjects itself and saves them in the same operation, on both the manual and automatic paths.
The manual and automatic sync paths had diverged. The manual endpoint reimplemented the GitHub calls, the zip handling and the version extraction independently, so a fix applied to one silently did not apply to the other. The manual path now delegates to the shared sync class — while still taking the repo and ref from the form you are looking at, so try before you save keeps working.
Hourly sync always logged "success" with no detail, even when nothing changed, which made the log useless for telling a quiet run from a silent failure. And fresh installs never registered the cron hook — only the configuration page's self-heal block did, so the hourly sync could not fire until an admin happened to open that page. Install now registers it directly.
One thing to plan for
Because the product is not flagged as Virtual in PrestaShop, the standard shipping calculation still applies to it. To keep these products free of shipping charges, assign them to a carrier with a zero-cost / free-shipping rule. It is a one-time setup step, and the module's own configuration page says so plainly rather than leaving you to discover it on a live order.
Compatibility
PrestaShop 1.7, 8 and 9, in eight languages: Dutch, English, French, German, Italian, Polish, Spanish and Turkish. Multistore aware. Uninstalling removes the module's data and the virtual files it manages, which the uninstall confirmation states outright — so take a copy first if you intend to reinstall.
Frequently asked questions
Why do I need this on PrestaShop 9?
Because PS 9 makes Virtual product and Product with combinations mutually exclusive. If you sell a downloadable product in several editions or tiers, the core cannot give each variant its own file. This module can.
Can each combination have a different file and version?
Yes — its own file, its own version number and its own changelog. That is the point of the module.
How does the GitHub sync work?
Switch a combination to GitHub Repository mode, give it an owner/repo plus an optional branch or tag, and press Fetch / Sync from GitHub — it pulls the file, version and changelog in one go. Private repositories work through a Personal Access Token, set once as a shop default and overridable per product. The hourly automatic sync additionally needs PrestaShop's cron task runner driven by a real cron on your server.
Will my customers know when I ship an update?
Yes, if you press Notify Customers on the combination — it emails the customers who bought that product.
Will these products be charged shipping?
They can be, because PrestaShop does not see them as virtual. Assign them to a carrier with a free-shipping rule and the charge disappears.
What file types are supported?
ZIP, PDF, MP3, FLAC, EPUB and any other downloadable format.
How do I spot a product whose file is missing?
The counters at the top of the page include a Missing Files figure, so a gap shows up there rather than in a customer complaint.
What happens if I uninstall?
The module's data and the virtual files it manages are deleted — the confirmation says so. Keep a copy of anything you will need again.
-
CompatibilityPrestashop 1.6
Prestashop 1.7
Prestashop 8
Prestashop 9 -
Available Module TranslationsDutch
English
French
German
Italian
Polish
Portuguese
Spanish
Turkish
MEG Venture
4 other products in the same category
| Version | 1.5.2 |
|---|---|
| Last updated | 2026-07-30 |
| Changelog | - [2026-07-30] Add missing translation keys for virtual product combination module in Turkish - [2026-07-27] Fix GitHub sync never persisting changelog updates (v1.5.2) - [2026-07-24] Add translations for Virtual Products Management Pro module in Dutch, Polish, and Turkish - [2026-07-23] fix: correct upgrade function name for version 1.4.12 to prevent upgrade failures - [2026-07-23] Fix protected-property access when loading the sync class in syncall.php - [2026-07-23] Fix "Class VirtualProductCombinationGithubSync not found" in syncall.php - [2026-07-23] Fix Sync All Now hitting admin dispatcher instead of front controller - [2026-07-23] Fix boolean passed as log message in syncall.php - [2026-07-23] Fix SQL syntax error: duplicate LIMIT 1 in notification queries - [2026-07-23] Fix root cause: version extraction bailed out before opening the zip - [2026-07-23] Fix literal backslash-n in version-change confirm dialog - [2026-07-23] Add composer.json and ultra-permissive fallback for version extraction - [2026-07-23] Add dual-method brute-force version extraction as fallback - [2026-07-23] Improve version extraction with comprehensive PHP parsing - [2026-07-23] Improve version extraction regex to handle more module formats - [2026-07-23] Fix version change detection and add manual sync trigger button - [2026-07-23] Add version detection and auto-send notifications for GitHub sync - [2026-07-23] Implement automatic GitHub synchronization feature with logging - [2026-07-23] Populate translation files with complete translatable strings - [2026-07-23] Populate translation files with complete translatable strings - [2026-07-23] Populate translation files with complete translatable strings - [2026-07-23] Add authentic translations for FR, DE, PL, NL, TR, IT, ES - [2026-07-23] Populate translation files with complete translatable strings - [2026-07-23] Populate translation files with complete translatable strings - [2026-07-23] Add missing translation files (fr, de, pl, nl, tr, it, es) - [2026-07-22] feat: Repackage GitHub zipball for PrestaShop compatibility - [2026-07-22] feat: Add GitHub integration for virtual product combinations - [2026-07-07] v1.4.17: Block native virtual files on product page - [2026-07-07] Fix virtual product notice on creation and ProductDownload save error - [2026-07-06] Batch-load GitHub URLs and PATs for products from admin panel configuration |
• [2026-07-07] Fix virtual product notice on creation and ProductDownload save error
• [2026-07-06] Batch-load GitHub URLs and PATs for products from admin panel configuration
• [2026-07-04] Add GitHub URL and PAT handling in product data retrieval and save methods
• [2026-07-04] Enhance language handling in product data retrieval and save methods, adding GitHub URL persistence and improving data accuracy in admin UI
• [2026-06-29] Improve SQL query in getVirtualData to filter out orphaned combination rows, ensuring accurate data in admin UI
• [2026-06-29] Enhance logging in getVirtualData success callback to include matched product count for improved debugging
• [2026-06-29] Add logging to getVirtualData success callback for improved debugging
• [2026-06-29] Refactor getVirtualData method to query product download data directly, ensuring fresh results and improved data accuracy
• [2026-06-29] Enhance save method to return fresh data immediately after saving, improving user experience and data accuracy
• [2026-06-29] Update response handling in getVirtualData and save methods for improved JSON output and error visibility
• [2026-06-29] Enhance save method response by including database error details and verification data for improved debugging and transparency
• [2026-06-29] Add cache: false to AJAX request for improved data freshness
• [2026-06-29] Improve save method response handling and logging for better error visibility
• [2026-06-29] Remove limit from changelog version query to retrieve all entries for accurate version comparison
• [2026-06-29] Improve error handling in save method and update AJAX response to JSON format
• [2026-06-29] Enhance KPI metrics in admin panel by adding total files, products covered, combination files, simple files, missing files, total downloads, and customers with downloads.
• [2026-06-26] Add conditions to filter active product downloads in getProductDownloads method
• [2026-06-26] Increase the number of commits fetched from GitHub API from 5 to 30
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] order detail page fix
• [2026-06-24] My Downloads page link is fixed
• [2026-06-24] Order detail page download link display problem is solved
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-29] Enhance logging in getVirtualData success callback to include matched product count for improved debugging
• [2026-06-29] Add logging to getVirtualData success callback for improved debugging
• [2026-06-29] Refactor getVirtualData method to query product download data directly, ensuring fresh results and improved data accuracy
• [2026-06-29] Enhance save method to return fresh data immediately after saving, improving user experience and data accuracy
• [2026-06-29] Update response handling in getVirtualData and save methods for improved JSON output and error visibility
• [2026-06-29] Enhance save method response by including database error details and verification data for improved debugging and transparency
• [2026-06-29] Add cache: false to AJAX request for improved data freshness
• [2026-06-29] Improve save method response handling and logging for better error visibility
• [2026-06-29] Remove limit from changelog version query to retrieve all entries for accurate version comparison
• [2026-06-29] Improve error handling in save method and update AJAX response to JSON format
• [2026-06-29] Enhance KPI metrics in admin panel by adding total files, products covered, combination files, simple files, missing files, total downloads, and customers with downloads.
• [2026-06-26] Add conditions to filter active product downloads in getProductDownloads method
• [2026-06-26] Increase the number of commits fetched from GitHub API from 5 to 30
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] order detail page fix
• [2026-06-24] My Downloads page link is fixed
• [2026-06-24] Order detail page download link display problem is solved
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] .
• [2026-06-24] feat: Ensure download hashes are generated for orders before payment confirmation
• [2026-06-24] feat: Implement download hash generation for existing orders and enhance "My Downloads" functionality
• [2026-06-24] feat: Update alignment styles for "My Downloads" link in account page
• [2026-06-24] feat: Update "My Downloads" link styling and improve account page block description
• [2026-06-24] feat: Update ecotax calculations to support PrestaShop 9 compatibility and enhance "My Downloads" link styling
Comments (6)
Your review appreciation cannot be sent
Report comment
Report sent
Your report cannot be sent