{"id":328079,"date":"2026-06-21T10:34:22","date_gmt":"2026-06-21T10:34:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pay4all-form\/"},"modified":"2026-06-25T07:04:46","modified_gmt":"2026-06-25T07:04:46","slug":"pay4all-form","status":"publish","type":"plugin","link":"https:\/\/gl.wordpress.org\/plugins\/pay4all-form\/","author":23516902,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.2","stable_tag":"1.2.2","tested":"7.0","requires":"5.9","requires_php":"7.4","requires_plugins":null,"header_name":"Pay4All Shop","header_author":"Pay4All","header_description":"Create order forms with quantity rules, delivery options and order management. Compatible with Pay4All Pro for TWINT payments.","assets_banners_color":"cabde9","last_updated":"2026-06-25 07:04:46","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/pay4all.ch\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":209,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"pay4all","date":"2026-06-21 10:06:39"},"1.1.0":{"tag":"1.1.0","author":"pay4all","date":"2026-06-21 16:33:10"},"1.1.1":{"tag":"1.1.1","author":"pay4all","date":"2026-06-21 16:39:53"},"1.1.2":{"tag":"1.1.2","author":"pay4all","date":"2026-06-21 17:17:23"},"1.1.3":{"tag":"1.1.3","author":"pay4all","date":"2026-06-22 11:23:10"},"1.1.4":{"tag":"1.1.4","author":"pay4all","date":"2026-06-22 11:40:48"},"1.2.0":{"tag":"1.2.0","author":"pay4all","date":"2026-06-25 06:46:51"},"1.2.1":{"tag":"1.2.1","author":"pay4all","date":"2026-06-25 06:55:52"},"1.2.2":{"tag":"1.2.2","author":"pay4all","date":"2026-06-25 07:04:46"}},"upgrade_notice":{"1.2.0":"<p>Adds <em>Hide this product<\/em> and optional per-product stock management: auto out-of-stock at 0, restock on order delete, low-stock e-mail alert (threshold in <em>Settings<\/em>) and a <em>Stock<\/em> admin column. No schema change, no manual action.<\/p>","1.1.2":"<p>Change name plugin and order menu<\/p>","1.1.0":"<p>Adds ticket QR codes, virtual file downloads, out-of-stock flag, per-delivery payment methods and pre-translated default fields. Please deactivate and reactivate the plugin once after upgrading so the new <code>wp_p4all_tickets<\/code> table and the <code>\/p4all-ticket\/...<\/code> rewrite rule are installed.<\/p>","1.0.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3581455,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3581455,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3581466,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3581466,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.2.0","1.2.1","1.2.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3580503,"resolution":"1","location":"assets","locale":"","width":1518,"height":2425},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3580503,"resolution":"2","location":"assets","locale":"","width":1518,"height":2425},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3580503,"resolution":"3","location":"assets","locale":"","width":1518,"height":2425},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3580503,"resolution":"4","location":"assets","locale":"","width":1518,"height":2425},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3580503,"resolution":"5","location":"assets","locale":"","width":1518,"height":2425}},"screenshots":{"1":"Example of an order form and delivery options.","2":"Payment method selection, confirmation and payment via TWINT.","3":"Dashboard, order list and language selection.","4":"Configure rules linked to a category and add a product.","5":"Order form configuration."}},"plugin_section":[],"plugin_tags":[359,1887,702,193458,268242],"plugin_category":[45],"plugin_contributors":[268195],"plugin_business_model":[],"class_list":["post-328079","plugin","type-plugin","status-publish","hentry","plugin_tags-order-form","plugin_tags-payments","plugin_tags-products","plugin_tags-twint","plugin_tags-woocommerce-twint","plugin_category-ecommerce","plugin_contributors-pay4all","plugin_committers-pay4all"],"banners":{"banner":"https:\/\/ps.w.org\/pay4all-form\/assets\/banner-772x250.png?rev=3581466","banner_2x":"https:\/\/ps.w.org\/pay4all-form\/assets\/banner-1544x500.png?rev=3581466","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/pay4all-form\/assets\/icon-128x128.png?rev=3581455","icon_2x":"https:\/\/ps.w.org\/pay4all-form\/assets\/icon-256x256.png?rev=3581455","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/pay4all-form\/assets\/screenshot-1.png?rev=3580503","caption":"Example of an order form and delivery options."},{"src":"https:\/\/ps.w.org\/pay4all-form\/assets\/screenshot-2.png?rev=3580503","caption":"Payment method selection, confirmation and payment via TWINT."},{"src":"https:\/\/ps.w.org\/pay4all-form\/assets\/screenshot-3.png?rev=3580503","caption":"Dashboard, order list and language selection."},{"src":"https:\/\/ps.w.org\/pay4all-form\/assets\/screenshot-4.png?rev=3580503","caption":"Configure rules linked to a category and add a product."},{"src":"https:\/\/ps.w.org\/pay4all-form\/assets\/screenshot-5.png?rev=3580503","caption":"Order form configuration."}],"raw_content":"<!--section=description-->\n<p><strong>Pay4All Shop<\/strong> is a simple, focused order-form plugin for small shops, wineries, caterers, takeaways and clubs. It is intentionally lighter than WooCommerce: you create a form, pick products and delivery methods, and embed it via a shortcode.<\/p>\n\n<h4>Core features<\/h4>\n\n<ul>\n<li>Drag-and-drop <strong>form builder<\/strong> with all common field types \u2014 default fields (first name, last name, e-mail, phone, address, etc.) are pre-translated in every activated language<\/li>\n<li><strong>Products<\/strong> with photo, price, sale price, min\/max\/step quantities, short description<\/li>\n<li><strong>Three product types<\/strong> \u2014 <em>Physical<\/em> (default), <em>Virtual<\/em> (downloadable file delivered after purchase), <em>Ticket<\/em> (one QR code per seat, sent in the order email)<\/li>\n<li><strong>Hide a product<\/strong> \u2014 tick <em>Hide this product<\/em> to remove it from the order form entirely (useful for archiving a seasonal product without deleting it)<\/li>\n<li><strong>Out-of-stock flag<\/strong> \u2014 the product stays visible in the form but the quantity field is greyed out and disabled<\/li>\n<li><strong>Stock management<\/strong> (optional, per product) \u2014 tick <em>Manage stock<\/em> to track quantity available; stock is decremented when an order is placed and restored when an order is deleted; the customer cannot order more than the stock left; product flips to <em>out of stock<\/em> automatically at 0; an admin column shows the current stock at a glance<\/li>\n<li><strong>Low-stock e-mail alert<\/strong> \u2014 set a global threshold in <em>Settings \u203a General<\/em>; when any tracked product crosses it after a sale, an alert is e-mailed to the notification address<\/li>\n<li><strong>Categories with quantity rules<\/strong> \u2014 including <em>minimum + multiple<\/em> (e.g. wine sold by carton of 6, you can mix varieties as long as the total is 6, 12, 18\u2026)<\/li>\n<li><strong>Delivery methods<\/strong> \u2014 pickup, flat-rate, free, free over an amount, or no delivery; <strong>accepted payment methods are set per delivery<\/strong> so each delivery can expose its own payment choices to the customer<\/li>\n<li><strong>Per-delivery customer-facing title and description<\/strong> in every activated language<\/li>\n<li><strong>Tickets admin page<\/strong> \u2014 list every QR ticket, search by first\/last name \/ city \/ e-mail, validate manually, export to CSV<\/li>\n<li><strong>Public ticket validation page<\/strong> \u2014 the organizer scans the QR with any smartphone; the page shows a green <em>Validate<\/em> button if the seat is still available, or a red message with the date of the previous scan if already used<\/li>\n<li><strong>Virtual file delivery<\/strong> \u2014 the file is stored in a private folder (<code>.htaccess<\/code> protected), the customer receives a one-time link valid for 60 days, served by the plugin's download endpoint<\/li>\n<li><strong>Order management<\/strong> \u2014 custom statuses, payment statuses, internal notes<\/li>\n<li><strong>E-mails<\/strong> to the customer and the merchant \u2014 full content (subject, heading, intro, outro) editable per language<\/li>\n<li><strong>CSV export<\/strong> of orders, filterable by date, form, status<\/li>\n<li><strong>Privacy API integration<\/strong> for GDPR export\/erase<\/li>\n<li>Honeypot anti-spam, nonces, server-side validation<\/li>\n<li>Internationalised (FR, DE, IT, EN)<\/li>\n<\/ul>\n\n<h4>Payments included for free<\/h4>\n\n<ul>\n<li>Pickup payment<\/li>\n<li>Cash on delivery<\/li>\n<li>Bank transfer with IBAN details<\/li>\n<li>TWINT manual (textual instructions to the customer)<\/li>\n<\/ul>\n\n<h4>Pay4All Pro (optional)<\/h4>\n\n<p>Install <strong><a href=\"https:\/\/pay4all.ch\/\">Pay4All Pro<\/a><\/strong> to add <strong>automated TWINT payments<\/strong>: the customer pays through their TWINT app at checkout, and the order is marked as Paid automatically without merchant intervention.<\/p>\n\n<p>Pay4All Shop works fully without Pay4All Pro. Pay4All Pro is sold separately at https:\/\/pay4all.ch\/.<\/p>\n\n<h4>External services<\/h4>\n\n<p>When you sell a <strong>ticket<\/strong> product, the order confirmation email contains a QR code per seat. The QR image is rendered by the customer's email client (or browser when previewing) from <code>https:\/\/api.qrserver.com\/v1\/create-qr-code\/<\/code>. The plugin server itself does not call this service \u2014 the request is made by the recipient when they open the email. The data passed to the service is only the ticket validation URL (your site domain + a random per-seat token).<\/p>\n\n<p>Terms of service: https:\/\/goqr.me\/api\/\nPrivacy: https:\/\/goqr.me\/api\/#privacy<\/p>\n\n<h4>Use cases<\/h4>\n\n<ul>\n<li>Winemakers selling by carton of 6<\/li>\n<li>Cheese makers selling by half-wheel<\/li>\n<li>Caterers with weekly order windows<\/li>\n<li>Local shops with pickup-only ordering<\/li>\n<li>Clubs taking online registrations with payment<\/li>\n<li>Concert organizers selling tickets with QR codes scanned at the door<\/li>\n<li>Digital sellers delivering PDFs, mp3s or course material as virtual products<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/pay4all-form\/<\/code> or install via <em>Plugins \u203a Add New<\/em>.<\/li>\n<li>Activate the plugin from the <em>Plugins<\/em> menu.<\/li>\n<li>Open <em>Pay4All Shop<\/em> in the admin sidebar.<\/li>\n<li>Create your categories, products, delivery methods, then a form.<\/li>\n<li>Copy the form shortcode into any page.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20woocommerce%3F\"><h3>Do I need WooCommerce?<\/h3><\/dt>\n<dd><p>No. Pay4All Shop is standalone. It does not depend on WooCommerce in any way.<\/p><\/dd>\n<dt id=\"can%20i%20sell%20wine%20by%20carton%20of%206%2C%20but%20let%20the%20customer%20mix%20varieties%3F\"><h3>Can I sell wine by carton of 6, but let the customer mix varieties?<\/h3><\/dt>\n<dd><p>Yes \u2014 this is the core use case. Set the category to <em>Minimum + multiple<\/em>, with minimum 6 and multiple 6. The customer can pick any combination of bottles from that category as long as the total is 6, 12, 18, etc.<\/p><\/dd>\n<dt id=\"does%20it%20support%20online%20payments%3F\"><h3>Does it support online payments?<\/h3><\/dt>\n<dd><p>The free version supports manual payments only (pickup, on delivery, bank transfer, TWINT instructions). Automated TWINT payments are available via Pay4All Pro.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20gdpr-friendly%3F\"><h3>Is the plugin GDPR-friendly?<\/h3><\/dt>\n<dd><p>Yes. Customer data is included in WordPress's <em>Tools \u203a Export \/ Erase Personal Data<\/em> workflow.<\/p><\/dd>\n<dt id=\"will%20my%20data%20be%20deleted%20if%20i%20uninstall%3F\"><h3>Will my data be deleted if I uninstall?<\/h3><\/dt>\n<dd><p>No, unless you explicitly enable <em>R\u00e9glages \u203a Donn\u00e9es \u203a Supprimer les donn\u00e9es lors de la d\u00e9sinstallation<\/em>.<\/p><\/dd>\n<dt id=\"how%20do%20tickets%20work%3F\"><h3>How do tickets work?<\/h3><\/dt>\n<dd><p>When you create a product of type <em>Ticket<\/em> and a customer orders N seats, the plugin generates N unique QR codes \u2014 one per seat. Each QR points to a public validation URL (<code>\/p4all-ticket\/{slug}\/{token}<\/code>). The customer receives one e-mail with every QR embedded. At the door, the organizer scans a QR: the page shows a green <em>Validate<\/em> button when the ticket is still available, and a red message with the date of the previous scan if it has already been used. You can also validate tickets manually and search them by customer information from <em>Pay4All Shop \u203a Billets<\/em>.<\/p><\/dd>\n<dt id=\"how%20do%20virtual%20products%20work%3F\"><h3>How do virtual products work?<\/h3><\/dt>\n<dd><p>When you create a product of type <em>Virtual<\/em>, you upload one file per product. The file is stored in <code>wp-content\/uploads\/p4all-virtual\/<\/code>, protected by an automatically generated <code>.htaccess<\/code> (deny from all). After purchase, the customer's e-mail contains a one-time download link served by the plugin endpoint (<code>?p4all_dl={token}<\/code>). The link is valid for 60 days.<\/p><\/dd>\n<dt id=\"how%20does%20%2Aout%20of%20stock%2A%20work%3F\"><h3>How does *Out of stock* work?<\/h3><\/dt>\n<dd><p>Tick the <em>Rupture de stock<\/em> checkbox on a product. The product stays visible in the form so the customer still sees what you usually offer, but the quantity field is greyed and disabled. A red badge labels the product as out of stock. Server-side validation rejects any tampered submission that tries to order an out-of-stock item.<\/p><\/dd>\n<dt id=\"how%20does%20%2Astock%20management%2A%20work%3F\"><h3>How does *Stock management* work?<\/h3><\/dt>\n<dd><p>Tick <em>Manage stock<\/em> on a product and enter the quantity available. From that point on:<\/p>\n\n<ul>\n<li>Each order decrements the stock by the quantity ordered (one decrement per ticket \/ per unit). The decrement happens as soon as the customer validates the order, regardless of the payment status.<\/li>\n<li>The order form prevents the customer from ordering more than what is left \u2014 the quantity input's <em>max<\/em> attribute is capped at the stock available, and a server-side check rejects any tampered submission.<\/li>\n<li>When the stock reaches 0, the product is automatically flagged <em>out of stock<\/em>: it stays visible but cannot be ordered.<\/li>\n<li>When an order is deleted from the admin (definitive delete, not just trashed), the stock is restored for every product still in the order. Status changes (paid, cancelled\u2026) do NOT restore stock; only deletion does.<\/li>\n<li>If you set a <em>Notify me when stock reaches<\/em> threshold in <em>Settings \u203a General<\/em> (under the shop address), an e-mail alert is sent to the notification address as soon as a tracked product crosses the threshold downwards after a sale.<\/li>\n<li>A <em>Stock<\/em> column in the products admin list shows the current quantity (or <code>\u2014<\/code> when stock management is off), highlighted in orange below the threshold and red when out of stock.<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New <strong>Hide a product<\/strong> checkbox on the product edit screen \u2014 the product is omitted from the form entirely (no badge, no greyed-out field). Server-side rejects any tampered order containing a hidden product. Useful for archiving seasonal items without deleting them.<\/li>\n<li>Stock-related checkboxes reordered for clarity: <em>Hide this product<\/em> \u2192 <em>Out of stock<\/em> \u2192 <em>Manage stock<\/em> (+ quantity field).<\/li>\n<li>New <strong>Stock management<\/strong> (optional, per product) \u2014 tick <em>Manage stock<\/em> on a product to track its quantity. Stock is decremented at every order (one unit per ticket \/ per item), the customer cannot order more than what is left, and the product is automatically flagged <em>out of stock<\/em> when the stock hits 0.<\/li>\n<li><strong>Stock restored on order deletion<\/strong> \u2014 deleting an order definitively (from trash or via the delete button) restores the stock of every product still present in that order. Status changes (paid, cancelled, etc.) do not restore stock; only deletion does.<\/li>\n<li><strong>Low-stock e-mail alert<\/strong> \u2014 set <em>Settings \u203a General \u203a Notify me when stock reaches<\/em> (under the shop address) to a non-zero threshold; an alert is e-mailed to the notification address each time a tracked product crosses the threshold downwards after a sale.<\/li>\n<li>New <strong>Stock<\/strong> column in the products admin list \u2014 shows <code>\u2014<\/code> when stock management is off, the current quantity otherwise (orange if at or below threshold, red <code>0 Out of stock<\/code> when empty).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New product type <strong>Virtual<\/strong> \u2014 upload one downloadable file per product, customer receives a one-time link valid 60 days, served by the plugin's protected endpoint (files stored in a private folder with deny-all <code>.htaccess<\/code>).<\/li>\n<li>New product type <strong>Ticket<\/strong> \u2014 one QR code per seat ordered, sent in the order email, scannable from any smartphone, with a public validation page showing green (available) or red (already used).<\/li>\n<li>New admin page <em>Pay4All Shop \u203a Billets<\/em> \u2014 list every QR ticket, search by first\/last name \/ city \/ e-mail, validate manually, export to CSV.<\/li>\n<li><strong>Out of stock<\/strong> flag on every product \u2014 product stays visible, quantity field is greyed and disabled, server-side rejects tampered orders.<\/li>\n<li><strong>Default form fields<\/strong> (first name, last name, e-mail, phone, address, etc.) are now pre-translated in every activated language at form creation time.<\/li>\n<li><strong>Per-delivery payment methods<\/strong> \u2014 accepted payment methods are now configured per delivery method (a delivery edit screen has a <em>Modes de paiement accept\u00e9s<\/em> section), so each delivery can show its own payment choices to the customer. Forms without any delivery still use the legacy per-form payment picker.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Simple order forms with pricing and rules (wine by box of 6), event ticketing QR validation, deliveries, Twint payment - no WooCommerce required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/328079","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=328079"}],"author":[{"embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pay4all"}],"wp:attachment":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=328079"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=328079"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=328079"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=328079"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=328079"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=328079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}