justpush / prestashop-module-notify
Push notifications from PrestaShop through JustPush Studio: orders, payments, refunds, customers, messages, low stock and admin logins.
Package info
github.com/JustPush-io/justpush-prestashop
Type:prestashop-module
pkg:composer/justpush/prestashop-module-notify
Requires
- php: >=7.2.5
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is not auto-updated.
Last update: 2026-10-06 06:55:57 UTC
README
JustPush for PrestaShop
Get a push notification on your phone when something happens in your PrestaShop shop: a new order, a payment, a refund, a new customer, a customer message, low stock or an admin login.
This module sends a small JSON message to JustPush Studio for each event. A PrestaShop recipe in Studio turns that message into a push notification.
- Works on PrestaShop 8 and 9, with PHP 7.2.5 or newer (whatever your PrestaShop version supports).
- Sends after the visitor has their page, so a slow or unreachable JustPush never slows down or breaks checkout. No cron job needed.
- Sends only the fields listed under Payloads. No addresses, phone numbers or order lines.
Install
- Download
justpush.zipfrom the latest release. - In the back office, open Modules → Module Manager → Upload a module and drop the zip in.
- Click Configure.
Don't use GitHub's "Download ZIP" button: that archive lacks the vendor/ autoloader and has
the wrong folder name. To install from source, clone the repository into modules/justpush/
and run composer dump-autoload --optimize --no-dev there.
Set up
- In JustPush Studio, install a PrestaShop recipe (for example PrestaShop: order placed) and copy its webhook URL.
- In the back office, open Modules → Module Manager, find JustPush notifications and click Configure.
- Make sure Enabled is on, paste the URL into the matching field, e.g. Order placed, and click Save.
- Click Send test. Each recipe answers with a quiet "🔔 PrestaShop connected".
Each event has its own URL field; leave a field empty to turn that event off. With multistore on, all settings can be changed per shop (pick the shop at the top of the page), except Admin login, which applies to all shops because back-office logins don't belong to one.
Low stock
stock.low fires once when a product, or a combination of a product with combinations, drops
to its Low stock level (set on the product's or combination's stock tab) or below. Products
without their own level use Default low-stock threshold from the module settings; the
default 0 means "when it sells out". It doesn't fire again while the stock stays low, only
after it has gone back above the level and drops again.
How sending works
Events are queued during the request and sent when PHP shuts down. On PHP-FPM and LiteSpeed, which is almost every host, the visitor gets their page first and the module then sends with a 5-second limit per message. On Apache with mod_php the visitor would wait, so the limit there is 2 seconds.
A message that can't be delivered is logged and dropped, not retried.
Logging
Failures are written to Advanced Parameters → Logs, with the object type JustPush. The
module never throws errors into PrestaShop.
Events
| Event | Sent when | PrestaShop hook |
|---|---|---|
order.placed |
An order is placed from the storefront, the back office or the webservice. A cart split over several carriers sends one message per order. | actionValidateOrder |
order.paid |
An order gets a paid status for the first time: Payment accepted, Remote payment accepted, or any status with "Consider the associated order as paid". Useful for bank wire and other offline payments. | actionOrderStatusPostUpdate |
order.refunded |
A credit slip is created: a partial refund, a standard refund or a product return. | actionOrderSlipAdd |
customer.registered |
A new customer account is created from the storefront, the back office or the webservice. Guest checkouts are skipped. | actionObjectCustomerAddAfter |
message.received |
A customer writes through the contact form, their order history or a checkout comment. Employee replies and private notes are skipped. | actionObjectCustomerMessageAddAfter |
stock.low |
A product or combination drops to its low-stock level, see Low stock. | actionUpdateQuantity |
admin.login |
Someone logs in to the back office. | PrestaShop 8: actionAdminLoginControllerLoginAfter; PrestaShop 9: Symfony LoginSuccessEvent |
admin.login_failed |
A back-office login fails. At most one message per 15 minutes per email address; attempts counts the failures since the previous message. |
PrestaShop 8: actionAdminLoginControllerLoginBefore; PrestaShop 9: Symfony LoginFailureEvent |
test.ping |
You click Send test. | none |
Payloads
Every message is a JSON POST with Content-Type: application/json and the user agent
JustPush-PrestaShop/1.0.0. It always contains event, version (currently 1), sent_at
(ISO 8601, UTC) and shop. Money is a decimal string such as "54.74" in the order's
currency, with currency as an ISO code. A field that isn't known is null.
Real examples of every event are in docs/payloads/. They were captured
from a PrestaShop 9.2 test shop running at http://localhost:8082/.
{
"event": "order.placed",
"version": 1,
"sent_at": "2026-10-03T18:10:02Z",
"shop": {
"name": "PrestaShop",
"url": "http://localhost:8082/"
},
"order": {
"id": 6,
"reference": "FGIRRLHSH",
"total_paid": "54.74",
"currency": "EUR",
"customer_name": "Jane Doe",
"customer_email": "jane@example.com",
"is_guest": true,
"item_count": 2,
"payment_method": "Bank transfer",
"carrier": "My carrier",
"status": "Awaiting bank wire payment",
"paid": false,
"source": "frontend",
"admin_url": "http://localhost:8082/admin-dev/index.php/sell/orders/6/view"
}
}
sourceisfrontend,admin,api(webservice), ornullwhen PrestaShop can't tell, e.g. for an order created by a cron job.total_paidincludes tax and shipping.carrierisnullfor orders with only virtual products.statusand other translated names are in the shop's default language.order.paidhas the sameorderblock asorder.placed.order.refundedhasrefund: { id, order_id, order_reference, amount, order_total, currency, customer_name, admin_url }.amountis the credit slip's products plus shipping, including tax.customer.registeredhascustomer: { id, name, email, group, newsletter, source, admin_url }.message.receivedhascustomer_message: { id, thread_id, customer_name, email, contact, order_reference, product, excerpt, has_attachment, admin_url }.excerptis the first 300 characters of the message as plain text.customer_nameisnullwhen the sender isn't logged in.stock.lowhasproduct: { id, combination_id, name, reference, quantity, threshold, admin_url }. For a combination,nameincludes its attributes, e.g. "Hummingbird printed t-shirt : Color - White, Size - S".admin.loginhasadmin: { email, name, ip, admin_url };admin.login_failedhasadmin: { email, ip, attempts, admin_url }.emailis whatever was typed in the login form.test.pinghasshopandmessage: "Test from PrestaShop".
Admin links
admin_url points at the order, customer, message thread, product or employee. The back-office
folder name (e.g. admin-dev or admin123abc) is only known inside the back office, so the
module remembers it when it's installed, configured or someone logs in; until then admin_url
is null. The links have no security token, so PrestaShop first shows an "Invalid token" page
with a link to continue. That's a PrestaShop security feature, so the module doesn't work
around it.
IP addresses
ip in the admin events is the address PrestaShop sees. If your shop sits behind a proxy, load
balancer or CDN such as Cloudflare, that may be the proxy's address, not the visitor's.
Privacy (GDPR)
The order, refund, customer and message payloads contain the customer's name and email address, and messages contain the start of what the customer wrote. Admin payloads contain the employee's email, name and IP address. As the shop owner you're the data controller for sending these to JustPush. Leave an event's URL empty if you don't want to send it. The module sends nothing else: no addresses, phone numbers, order lines or payment details.
Development
The test shop is a Docker Compose setup with this repository mounted at modules/justpush/.
CI lints every PHP file on PHP 7.2 to 8.4:
composer validate --strict composer dump-autoload --optimize --no-dev find . -name '*.php' -not -path './vendor/*' -print0 | xargs -0 -n1 php -l
To release, bump $this->version in justpush.php and Sender::VERSION, then push a tag such
as v1.0.1. The release workflow builds justpush.zip and attaches it to a GitHub release.
Uninstall
In Modules → Module Manager, open the module's menu and choose Uninstall. This removes all its settings.
JustPush products
Apps
- JustPush for iOS
- JustPush for Android
- JustPush Studio: build integrations that turn webhooks into notifications
- Recipes: ready-made integrations for Shopify, Magento and more
- Playground: try the API in your browser
SDKs
- PHP · Packagist
- JavaScript · npm
- TypeScript · npm
- Python · PyPI
- Go · pkg.go.dev
Packages
- Laravel notification channel · Packagist
- Magento 2 · Packagist
- PrestaShop · Download (this one)
Developer tools
License
MIT, see LICENSE.