A PPL shipping plugin for VirtueMart. Customers pick a PPL pick-up point, ParcelBox or AlzaBox from a map right in the cart; the shop then exports shipments straight into PPL (one by one or in bulk) and prints labels — no retyping into the PPL customer portal.
| Requirement | Version |
|---|---|
| Joomla | 4.x, 5.x |
| VirtueMart | 4.x |
| PHP | 8.0+ |
| MySQL | 5.7+ / MariaDB 10.3+ |
| Current version | 1.2.20 |
- Requirements
- Credentials from PPL
- Installation
- Enabling the plugin
- Global configuration
- Creating a shipment method
- Delivery type and product code
- Pick-up point map
- Shipping price
- Exporting shipments to PPL
- Bulk export
- Printing labels
- Cash on delivery
- Cancelling a shipment
- Shipment overview and pickup
- Test environment
- Order status after export
- Uninstalling
- Troubleshooting
1. Requirements
- Joomla 4.x or 5.x (VirtueMart does not support Joomla 6 yet)
- VirtueMart 4.x
- PHP 8.0 or newer, with the cURL extension
- MySQL 5.7+ / MariaDB 10.3+
- An active PPL customer account with a transport contract
- Enabled access to the CPL API (myAPI2) and your own map widget API key
2. Credentials from PPL
The plugin uses two independent sets of credentials. Do not mix them up — each is obtained elsewhere and serves a different purpose.
| Credential | Where to get it | What it is for |
|---|---|---|
| Client ID | On request from your PPL sales representative | Logging in to the CPL API (shipment export, labels) |
| Client Secret | Same place, together with the Client ID | The secret half of the login, never leaves your server |
Widget API key (ak_…) | Yourself, at klient.ppl.cz/widgetadmin | Showing the pick-up point map on the storefront |
| Product codes | GET /codelist/product, or your PPL sales representative | Determine which service carries the parcel |
Client ID and Client Secret (CPL API)
These are not self-service — you cannot generate them in the customer portal. Ask your PPL sales representative (or customer support) to enable OAuth 2.0 access to the CPL API (myAPI2) and issue your client credentials. Include your PPL customer number and mention that this is an e-shop integration using SemaShipping PPL, an approved solution by Semakin.cz — PPL has the solution on record, which speeds the request up.
- Credentials for production and for the test environment are separate. If you want to test first, ask for both at once and mention that this is an e-shop integration.
- The plugin keeps the access token and only renews it once it expires (30 minutes of validity). PPL allows just 12 issued tokens per minute, which is why the token is not requested on every call.
Map widget API key
This one you create yourself:
- Log in to
klient.ppl.cz/widgetadminwith the same credentials as the PPL customer portal. - Create a new widget and generate an API key for it — it starts with the
ak_prefix. - Add the domains the map is allowed to load on.
Mind the domains. The widget loads only on domains explicitly listed for the key. Wildcards (
*) do not work yet, andexample.comandwww.example.comcount as two different domains — add both. If you test on a staging domain or a subdomain, add that one too.
Product codes
The product code determines the service used to send the parcel and depends on your contract with PPL. It is set per shipment method (see section 7).
The most common codes:
| Code | Service |
|---|---|
SMAR | PPL Parcel CZ Smart — delivery to a pick-up point |
SBOX | PPL Parcel CZ Smart To Box — delivery to a box |
PRIV | PPL Parcel CZ Private — delivery to a private address |
BUSS | PPL Parcel CZ Business — delivery to a business address |
The actual list of products on your account is returned by GET /codelist/product in the CPL API. If you are unsure, ask your PPL sales representative which products you have contracted.
Check these first
- Your VirtueMart vendor address is complete — the plugin sends it to PPL as the sender address, and PPL rejects a shipment without one.
- Your account has cash on delivery enabled, if you plan to offer it.
3. Installation
- Download the installation ZIP
plg_vmshipment_semappl_X.Y.Z.zip. - Log in to the Joomla administration.
- Go to System → Install → Extensions.
- Upload the ZIP file.
- A confirmation message appears once the plugin is installed.
Upgrade: the same procedure as installation. Joomla uses
method="upgrade"and keeps all existing data and settings.
The package also contains the system plugin plg_system_semappl, which is installed and enabled automatically. It provides the PPL menu in the VirtueMart order list (see section 11).
4. Enabling the plugin
After installation the shipment plugin must be enabled manually:
- Go to Extensions → Plugins.
- Search for
semapplorPPL. - Click the name SemaShipping PPL – parcel shipping (DHL Group) for VirtueMart (group
vmshipment) and set Status = Enabled. - Save.
The system plugin
plg_system_semapplenables itself during installation — you do not need to switch it on.
The plugin alone shows nothing on the storefront. Shipping appears only once you create a shipment method in VirtueMart (see section 6).
5. Global configuration
In the plugin settings (Extensions → Plugins → click the name) fill in the parameters shared by all shipment methods built on this plugin:
| Parameter | Description |
|---|---|
| API environment | Production for live operation, Test for trying things out. See section 16. |
| Client ID | Identifier for the CPL API issued by PPL support. |
| Client Secret | The secret belonging to the Client ID. Stays on the server, never reaches the storefront. |
| Map widget API key | The ak_… key from klient.ppl.cz/widgetadmin. It appears in the page HTML — it is not secret, the list of allowed domains protects it. |
| Send weight to PPL | PPL does not want the weight in the shipment data by default. Enable it only when sending the weight has been explicitly agreed with PPL. Defaults to No. |
| Default weight (kg) | Fallback shipment weight when it cannot be calculated from the products. Used only when sending the weight is enabled. Defaults to 1 kg. |
| Cash on delivery payment IDs | Comma separated IDs of VirtueMart payment methods that are COD (see section 13). |
| Label format | PDF for ordinary printers, ZPL for thermal printers. Also PNG, JPEG, SVG. |
| Label page size | A4 = four labels per sheet, Default = one label per page. |
| Starting position on the sheet | 1–4. Lets you print onto a partially used A4 sheet. |
| Default status for export | The VirtueMart order status code the bulk export list is taken from. Defaults to C (confirmed). Separate several statuses with commas — C,Q picks up confirmed and pending orders in one go. |
| Order status after export | Status code the order moves to once the shipment gets its number. Empty = leave the status alone (default). See section 17. |
Without the Client ID and Client Secret you cannot export or print labels. Without the widget API key customers will not see the map. Both are required.
Sender address
PPL requires a sender address on every shipment. The plugin takes it from the VirtueMart vendor address (Vendor → billing address), so you usually do not have to fill in anything.
The Sender address tab is there to override that — use it only if you ship from somewhere other than the shop's billing address (an external warehouse, for example). An empty field always means "take it from VirtueMart".
| Field | Note |
|---|---|
| Sender name | Company or name printed on the label. |
| Name suffix | Second name line, e.g. a branch designation. |
| Street and number, City, Postcode, Country (ISO) | Postcode and country are mandatory for PPL. Country as two letters, e.g. CZ. |
| Contact person, Phone, E-mail | Contact for the driver and for shipment queries. |
Check that the VirtueMart vendor address is a real Czech address. The sample address shipped with VirtueMart (Sample Company, Seattle) passes unnoticed inside VirtueMart, but PPL rejects the export with
Sender.Country: Invalid value.
6. Creating a shipment method
One plugin installation can back any number of shipment methods — typically one for pick-up points and one for home delivery.
- In the VirtueMart administration go to Shop → Shipment Methods.
- Click New.
- Fill in:
- Shipment Name: the name customers see (e.g. "PPL — pick-up point")
- Published: Yes
- Shipment Method: choose SemaShipping PPL – parcel shipping (DHL Group) for VirtueMart
- Switch to the Configuration tab.
- Set the parameters from the following sections.
- Save.
7. Delivery type and product code
Every method has two key parameters that must match each other.
Delivery type
| Option | Behaviour |
|---|---|
| Pick-up point / box | A button and the PPL map appear in the cart. The customer must choose a location or the order cannot be completed. |
| Home delivery | Just a radio button with the price, no map. The address comes from the order — shipping address, or billing when there is none. |
PPL product code
A text field for the transport service code. It must match the delivery type:
| Delivery type | Use the code |
|---|---|
| Pick-up point / box | SMAR (pick-up points), SBOX (boxes only) |
| Home delivery | PRIV (private addresses), BUSS (businesses) |
Mismatched combinations (e.g.
PRIVon a method with a map) fail on export. The list of products on your account is returned byGET /codelist/product— see section 2.
Next to it sits the PPL product code for cash on delivery field. Leave it empty — the plugin derives the COD code by itself. Fill it in only if your contract uses non-standard codes; see section 13 for details.
Other method restrictions
| Parameter | Description |
|---|---|
| Countries | Countries the method is offered for. |
| Blocked countries | Countries the method is not offered for. |
| Minimum / maximum weight | Order weight range in which the method appears. |
| Weight unit | KG or LB. |
8. Pick-up point map
The plugin uses the PPL map widget 2.0. It opens as an overlay after clicking the "Choose a pick-up point" button.
Map settings per method
| Parameter | Description |
|---|---|
| Widget country | ISO code of the country whose locations the map offers (e.g. CZ, SK). Defaults to CZ. |
| Displayed location types | All (ParcelShop, ParcelBox, AlzaBox) / ParcelShops only / Boxes only. |
| Cash on delivery locations only | Limits the map to locations that accept cash on delivery. Enable it for a method used together with COD. |
What the plugin stores from the selection
The location code, name, type (ParcelShop / ParcelBox / AlzaBox) and address. The code is what goes to PPL; the rest is for display — to the customer in the order summary, to you in the administration.
The selection survives cart changes
The chosen location is kept in the session. When the customer changes the payment, the shipping method or the cart contents, the selection stays. It is cleared once the order is placed.
Widget version 1.x is discontinued on 31 August 2026. This plugin uses version 2.0 exclusively, so the end of support does not affect you — just remember that the
ak_…key is mandatory for version 2.0.
9. Shipping price
| Parameter | Description |
|---|---|
| Shipment cost | The base price. |
| Packaging fee | Added to the shipping cost. |
| Tax rule | The VirtueMart tax rule for the shipping price. |
| Free shipping from | Order amount from which shipping is free. Empty = never. |
The resulting price is Shipment cost + Packaging fee, or 0 once the free shipping threshold is reached.
10. Exporting shipments to PPL
How PPL processes shipments
Unlike most carriers, PPL accepts shipments in batches and processes them in the background. The plugin submits a batch, receives its identifier and then asks PPL whether it is finished. This usually takes a few seconds.
That is why an order has three possible states in the administration:
| State | What it means | What to do |
|---|---|---|
| Not exported | The shipment has not been sent to PPL yet | The Create shipment in PPL button |
| PPL is processing the batch | The batch was submitted, the shipment number has not arrived yet | The Refresh status button |
| Done | The shipment has a number | The Download label button |
Exporting a single order
- Open the order in VirtueMart → Orders.
- In the shipping panel click Create shipment in PPL.
- Once finished, the shipment number and the label button appear.
If you see a message that PPL is still processing the batch, wait a few seconds and click Refresh status.
What gets sent to PPL
- The order number as the shipment reference
- Recipient name and address, phone, e-mail
- For a business order the company goes on the first line and the person's name becomes the contact
- The pick-up location code (for methods with a map)
- The order number once more as the external number (code
CUST) — PPL prints it on the label and passes it on to invoicing - Cash on delivery, when the order is a COD order
- The customer note
The sender address is always sent — PPL rejects a request without it. The plugin takes it from the VirtueMart vendor and the global configuration can override it.
When the export fails
The error message from PPL is shown right in the administration. A shipment PPL rejects does not exist on their side, so the order returns to the not exported state and you can retry once the data is fixed.
11. Bulk export
After installation, a PPL button appears in the toolbar of VirtueMart → Orders. It opens a menu with every function of the extension:
| group | items |
|---|---|
| Shipments | Export to PPL · Download labels · Cancel in PPL |
| Pickup | Order pickup · Scheduled pickups |
| Overview | Pending shipments · Refresh states |
| — | Help |
The menu is deliberately collapsed under a single button: shops commonly use several carriers, and if every extension added its own buttons the toolbar would not cope. Hovering over an item shows a short tooltip explaining what it does.
Close the menu by clicking outside it or with Esc; it closes by itself once an action starts, so that it does not cover the result.
The last item, Help, opens a panel listing every function with its description — the same text as the tooltips, only in one place. It also notes that shipments created by the extension are not visible in the PPL client portal and links to the page explaining how to obtain credentials.
Export to PPL
Sends all not yet exported orders in the chosen status as a single batch. The result is listed above the order list — shipment numbers for successes, the reason for failures. An error on one order does not stop the others.
The order status the list is taken from is set in the global configuration (Default status for export, C by default). You may list several statuses separated by commas (C,Q) — orders in any of them are then included in the batch.
Download labels
Downloads labels for every shipment that exists at PPL and is not cancelled — regardless of the order status. It is deliberately the same selection that Pending shipments shows: what is in that list gets printed.
It cannot be tied to the order status: export moves the order to the post-export status straight away, so it would drop out of the selection exactly when the label is needed.
At most 50 batches are downloaded at once, newest first. Several batches come as a ZIP — PPL cannot merge them into one PDF.
When there are no labels to download, a message says so — previously nothing visible happened.
Standalone bulk export page
If you need to switch between order statuses, open the Open bulk export link at the bottom of the plugin settings. The page does the same and adds a status filter.
12. Printing labels
A single shipment
The Download label button in the order detail.
Several shipments at once
The Download labels button in the order list. What you get depends on how many batches the shipments came from:
- Orders from one batch → a single file with all labels.
- Orders from several batches → a ZIP archive with one file per batch.
PPL cannot merge labels across batches into one file. If you want to print in one go, export the orders together — one export run is one batch.
Before the download starts, the plugin asks which slot on the sheet to print from — pick slot 1 to 4 depending on how many labels you have already peeled off. The dialog appears only for PDF on an A4 page; other settings put one label per page, so there is nothing to choose.
The dialog shows a picture of the sheet — the four slots sit where they physically are, and hovering over one greys out the earlier ones that will be skipped. The sheet is A4 in landscape and PPL numbers the slots column by column, starting on the right:
| slot | where on the sheet |
|---|---|
| 1 | top right |
| 2 | bottom right |
| 3 | top left |
| 4 | bottom left |
Printing continues in that order, so labels come off the sheet starting at slot 1 — the position you pick in the dialog is the first slot that is still free.
Print settings
The format, page size and starting position live in the global configuration (section 5). With A4 four labels fit on a sheet; Starting position 1–4 lets you print onto a sheet you have already peeled labels off.
Bulk printing asks for the position every time — the setting is only the default used when printing a label from the order detail.
13. Cash on delivery
- Find the ID of the COD payment method: VirtueMart → Shop → Payment Methods, open the method and read
virtuemart_paymentmethod_idfrom the URL. - Enter it into the Cash on delivery payment IDs parameter in the global configuration. Separate multiple IDs with commas (e.g.
3,7).
The plugin then fills in the COD amount, the order currency and the variable symbol automatically for orders using that payment.
The variable symbol may only contain digits according to PPL and is limited to 10 characters. The plugin derives it from the order number by dropping every non-numeric character and keeping the last ten. If your order numbers contain no digits at all, the internal order ID is used instead.
The product code switches itself for COD
PPL uses separate product codes for cash on delivery and rejects COD on a regular code. The plugin handles this for you: on a COD order it switches the code automatically.
| Regular code | COD code | Product |
|---|---|---|
SMAR | SMAD | PPL Parcel CZ Smart (pick-up point) |
PRIV | PRID | PPL Parcel CZ Private (address) |
BUSS | BUSD | PPL Parcel CZ Business (address) |
SBOX | SBOD | PPL Parcel CZ Smart To Box |
CONN | COND | PPL Parcel Connect |
SMEU | SMED | PPL Parcel Smart Europe |
If your contract uses different codes, enter the right one into the PPL product code for cash on delivery field in the shipment method settings. A filled-in field takes precedence over the automatic switch; an empty one means "switch according to the table". The actual codes of your contract are returned by the /codelist/product method.
On a method with a map also enable Cash on delivery locations only (section 8) — otherwise a customer may pick a location that does not accept COD.
A very long customer e-mail
PPL accepts 50 characters for an e-mail address. A longer one is not sent at all — a truncated address would look valid while belonging to somebody else. The plugin reports it at export time together with the order number; the shipment goes through normally, PPL just sends no e-mail notifications for it. The courier still reaches the customer by phone.
How COD looks on the label
A COD parcel carries a black "Dobirka/COD" strip along the bottom of the label. The COD amount itself is not printed — PPL keeps it in its own system and the driver sees it in the scanner.
14. Cancelling a shipment
A shipment that will not go into transport — the customer cancelled the order, the goods are out of stock, the export was a mistake — has to be cancelled in PPL. This is not optional housekeeping: once the shipment data exists, PPL keeps it on the books as waiting to be handed over until you cancel it.
Only a shipment you have not physically handed over to the driver can be cancelled.
A single order
- Open the order in VirtueMart → Orders.
- In the shipment panel click Cancel shipment in PPL.
Instead of the label the panel then shows Cancelled with a date and time. Cancelling is irreversible — the shipment cannot be revived, only replaced by a new one.
Several orders at once
In the order list tick the orders you want to cancel and click Cancel in PPL in the toolbar. The button then asks Really cancel (count)? — only the second click performs the cancellation. The question disappears if you do not click within six seconds.
Orders without a PPL shipment are skipped, so you do not have to untick them. The result is printed above the list, per order.
Bulk cancellation deliberately does not work off the status filter the way bulk export does. Cancelling is irreversible, so only the orders you actually tick get cancelled.
Creating a new shipment after cancelling
For a cancelled order the shipment panel offers Create a new shipment. Use it when the parcel does go out after all — typically after fixing the address or the pick-up point. The original shipment number disappears from the order; it stays traceable in the PPL communication log.
What PPL returns
Cancellation is asynchronous on PPL's side: the API confirms receipt immediately, but the shipment flips to Cancelled in their system only after a while. That is why the plugin only records the date and time on success — if the cancellation did not go through on PPL's side, you will find out from their system, not from the shop administration.
15. Shipment overview and pickup
Shipments created by the plugin are not visible in the PPL client portal (klient.ppl.cz) — PPL confirmed on 28 August 2026 that the portal only ever shows shipments created in their own application. The overview, the state check and pickup orders therefore live here, in your shop administration.
Shipment numbers in the order list
The PPL shipment number and its last known state are shown right under the order number. A cancelled shipment is struck through in red. You no longer need to open the order detail just to see it.
Pending shipments
The Pending shipments item lists every shipment that exists at PPL and is not cancelled — that is, everything waiting to be handed over to the driver. The order status filter is deliberately not applied here: a shipment waits to be handed over regardless of what status the order has been given since.
Shipments at PPL
The Shipments at PPL item lists the shipments PPL holds on your customer account for a chosen period. Unlike Pending shipments, which reads the shop's own data, this overview asks PPL directly — and it is the only place where you also see shipments that were not created in this shop: from an earlier solution, from another shop on the same account, or entered by hand. Those rows are highlighted and flagged outside the shop.
Pick the period at the top (the last month is pre-filled) and optionally a state. The table then shows:
| column | what it holds |
|---|---|
| Date | the last change to the shipment at PPL |
| Shipment / Order | the shipment number and the order it belongs to |
| Product | the PPL product code the shipment went out with |
| State | the states reported by PPL, in your language |
| Recipient | name and town |
| Weight | the weight actually measured at the depot, not the one from the order |
| COD | the amount; paid out means PPL has already sent it to your account |
| Carriage | what PPL charges for the shipment — transport, road toll, fuel surcharge and the cash-on-delivery fee together |
Below the table is the total for the whole period: how many shipments, how much the carriage cost and how much is held in cash on delivery.
The prices are PPL's real charges, not what you collected from the customer, so they can be compared against your shipping revenue. They are filled in with a delay — a fresh shipment usually has no price yet.
The Print button prints the list exactly as loaded — landscape, with the table header repeated on every page, the period at the top and the totals plus the print time at the bottom. The administration around it is not printed.
The overview loads at most 500 shipments at a time; if the period holds more, it says so and you simply choose a shorter one.
Refresh states
The Refresh states item asks PPL for the actual state of all pending shipments and stores it. Use it when something happened to a shipment outside the shop — typically when somebody cancelled it elsewhere. Such a shipment is marked as cancelled and disappears from the pending list.
States are shown in the language of the administration (waiting to be handed over, delivered, cancelled, …). You may hit a code we do not know yet — it is printed exactly as the API returned it. Tell us about it and we will add the translation.
A shipment PPL does not return will not disappear. The PPL interface answers from several servers, so a freshly created or freshly cancelled shipment may report differently for a few minutes. The plugin therefore only adds states, it never clears them — if you see a note that PPL did not return a shipment, run the check again in a moment.
Ordering a pickup
The Order pickup item opens a short form: date, number of parcels and optionally a time window and a note for the driver. The number of parcels is pre-filled from the count of shipments waiting to be handed over.
| field | note |
|---|---|
| Pickup date | Pre-filled with tomorrow. |
| Number of parcels | 1 to 50; the ceiling comes from the PPL interface. |
| Time from / to | Optional. Leave empty if the usual pickup time suits you. |
| Note for the driver | Optional, up to 300 characters. |
The pickup address comes from the same settings as the sender address for shipments — whatever is filled in the plugin configuration applies here too.
After submitting, the PPL pickup number is shown and the list of scheduled pickups opens. A pickup is not tied to specific shipments; it only says "come at this time for this many parcels".
⚠️ A pickup is a real transport order. Only order it once the parcels are ready.
Scheduled pickups
The Scheduled pickups item lists pickups from the last 14 days — date, PPL number, parcel count and state. A pickup that has not run yet has a Cancel button; it is confirmed by a second click so it cannot be cancelled by accident.
Only a pickup ordered from here can be cancelled — it is cancelled by the reference the plugin gave it. A pickup arranged elsewhere (by phone, in the PPL application) may still appear in the list, but without the button; cancel that one where it was created.
16. Test environment
PPL runs a separate test environment with its own database. Shipments created there are not actually transported or invoiced.
- Ask PPL support for a Client ID and Client Secret for the test environment — production credentials do not work there.
- Switch API environment to Test in the global plugin configuration.
- Fill in the test Client ID and Client Secret.
The widget API key does not change — the pick-up point map runs against production data even while testing. Remember to keep your test domain on the key's list of allowed domains.
Once you are done, switch the environment back to Production and replace the credentials. The plugin discards the stored access token by itself whenever the environment or the credentials change.
Pick-up point code lists differ between environments. A code returned by the test environment may not exist in production — for a live trial always pick the point from the production map.
17. Order status after export
The plugin can move an order to a different status once it has been exported — typically a status of your own such as Handed to PPL, so you can tell at a glance which orders are done.
By default the option is empty and the plugin leaves order statuses alone.
Setting it up
- Create the status under VirtueMart → Configuration → Order statuses. Pick a free single-letter code (
T,L,M…) and a name, for example Handed to PPL. - Enter that code in the Order status after export parameter in the plugin's global configuration.
When the status changes
At the moment the shipment is given its number by PPL — not when the batch is sent. That distinction matters:
- An order PPL rejects keeps its original status and can be exported again.
- It works the same for exporting a single order, bulk export, and picking the number up later via Refresh status.
- An order already in the target status is not rewritten.
If you enter a status code that does not exist in VirtueMart, the plugin reports a warning and leaves the status alone — the export itself still succeeds.
Does the customer get an e-mail?
VirtueMart decides, not the plugin. Notifications go out for the statuses ticked in VirtueMart's configuration (Order statuses the shopper is notified about). A new status is not among them by default, so nothing is sent. Tick it there if you want the customer notified once the parcel is handed over.
Cancelling does not restore the status. The order stays in Handed to PPL until you move it yourself.
18. Uninstalling
- Extensions → Manage → Extensions
- Search for
semappl. - Uninstall the shipment plugin SemaShipping PPL – parcel shipping (DHL Group) for VirtueMart.
What gets deleted
- The shipment plugin (PHP, JS, CSS, language files)
- The system plugin
plg_system_semappl(removed automatically) - The
#__virtuemart_shipment_plg_semappltable (shipment data attached to orders)
What stays
- The
#__sema_ppl_logtable — audit records of the communication with the PPL API
Why is the log kept? It documents what was sent to PPL and when. You can drop it manually:
DROP TABLE IF EXISTS `#__sema_ppl_log`;(replace
#__with your actual table prefix)
19. Troubleshooting
The map does not appear
- Check that the plugin is enabled.
- Check that the shipment method uses the Pick-up point / box delivery type, not Home delivery.
- Check that the map widget API key is filled in.
- Check the list of allowed domains for the key in
klient.ppl.cz/widgetadmin. This is by far the most common cause — the widget simply will not load on a domain that is not listed.example.comandwww.example.comare two different domains. - Open the browser console (F12) and look for JavaScript errors.
- Check that no Content Security Policy blocks the
www.ppl.czdomain.
If the map fails to load, the customer sees a red notice under the button saying it cannot be opened. A button that stays silent means a version older than 1.2.12.
The customer cannot complete the order
- On a method with a map the customer must choose a location. The message "Please choose a PPL pick-up point" is correct behaviour.
- On a home delivery method no location is required — in that case the problem lies elsewhere.
The shipment export fails
- Verify the Client ID and Client Secret in the global configuration.
- Verify that the right API environment is selected — production credentials do not work in the test environment and vice versa.
- Verify the product code on the shipment method. It must come from your contract and match the delivery type (section 7).
- Read the error message — the plugin shows the PPL API response including the individual invalid fields.
- Request and response details are in the
#__sema_ppl_logtable.
API login fails
- Check that PPL has actually enabled CPL API access for you. A customer number alone is not enough, access is granted on request.
- Verify the credentials belong to the selected environment.
- PPL limits token issuance to 12 per minute. If you are experimenting and switching credentials, wait a moment.
The order stays in "PPL is processing the batch"
- Click Refresh status. Processing usually takes a few seconds, longer for large batches.
- If the state persists, check
#__sema_ppl_log— the response will contain eitherInProcessor an error.
The label does not download
- Check that the shipment has a shipment number. Without it there is no label.
- Check that the label format matches your printer.
- Look into
#__sema_ppl_logat the response for thedownloadLabelorgetBatchLabelaction.
For a bulk download the reason is printed straight above the order list — in red, one line per batch. If only part of it came through, the ZIP contains PRESKOCENE-DAVKY.txt listing what is missing.
The bulk export buttons do not appear
- Check that the system plugin
plg_system_semapplis installed and enabled (Extensions → Plugins, groupsystem). - Check that you are on the VirtueMart → Orders page — the buttons appear nowhere else.
- Check the browser console for JavaScript errors.
- If SemaShipping Packeta also runs on the site, PPL must be 1.2.19 or newer and Packeta 1.4.13 or newer — see below.
The PPL button is gone and a piece of script spills out below the table
This happens only where SemaShipping PPL and SemaShipping Packeta run side by side and at least one of them is older. Both plugins insert themselves before the closing tag of the page, and in older versions they broke each other's script block while doing so; the console reports a SyntaxError.
The fix is to update both: PPL to 1.2.19 or newer, SemaShipping Packeta to 1.4.13 or newer. A newer PPL copes with an older Packeta, but it is only dependable once both are current.
Cash on delivery is not set
- Verify the payment method ID in the Cash on delivery payment IDs parameter. It must match
virtuemart_paymentmethod_idfrom the payment method URL. - Separate multiple IDs with commas and no spaces.
- Verify that your PPL account has COD enabled and that the chosen product supports it.
- If the export ends with "Unable to get shipment number" (
MyApi2.Error.UnableToGetShipmentNumber), the order data is not at fault: your PPL account has no shipment number range assigned for COD products. Ask your PPL sales representative for one, quoting your customer number.
The shipment method does not appear in the cart
- Check the country settings (allowed and blocked).
- Check the weight limits.
- Check that the method is Published in VirtueMart and the plugin is Enabled.
Go-live checklist
- CPL API access requested from PPL support and approved
- Client ID and Client Secret filled in
- API environment matches the issued credentials
- Widget API key created at klient.ppl.cz/widgetadmin
- Shop domains added to the widget API key (including the www variant)
- Default sender address configured in the PPL customer portal
- Plugin installed and enabled
- Shipment method created in VirtueMart and published
- Delivery type chosen
- Product code filled in and matching the delivery type
- Map country and location types configured
- Cash on delivery payment IDs filled in (if you offer COD)
- Label format and page size chosen
- Default status for export configured
- Test order placed and the shipment exported successfully
- Label downloaded and printed
- Bulk export tried out in the order list
PPL® is a registered trademark of PPL CZ s.r.o., a DHL Group company. This product is an independent extension and is not affiliated with, or endorsed by, PPL CZ s.r.o. or DHL Group.