Skip to content

Changelog ​

4.0.0 (unreleased) ​

A major release: read Upgrading to 4.0 before you update.

Breaking changes ​

  • Updated: requires ExpressionEngine 7.3+ and PHP 8.2+, for ExpressionEngine 6 and lower use the legacy package (legacy/ee_reinos_store-v3.12.0.zip). See Upgrading to 4.0 (Breaking change)
  • Updated: {order:status} is the status itself (e.g. complete), the label is the new {order:status_label}. See Upgrading to 4.0 (Breaking change)
  • Updated: a new order with the Manual gateway gets the status pending instead of open. See Upgrading to 4.0 (Breaking change)
  • Bugfix: where Store Price Rule stacked its rules while the Enable stacking discounts setting showed off. See Upgrading to 4.0 (Breaking change)

Security ​

  • Security: improved the security of the checkout, the cart, the payment gateways, the links and PDFs of orders, the emails, the Store tags and the control panel. Updating is strongly recommended

New ​

  • Added: PDF layouts, to build the invoice, the order confirmation and the packing slip yourself with drag-and-drop blocks. See PDF layouts
  • Added: 21 payment gateways, e.g. Square, Adyen, Buckaroo, Mercado Pago and Razorpay. See Payment Gateways
  • Added: the Example templates page lists the templates with what they are for, shows their code and the differences with your copy, and copies them one by one or all at once to a template group of your choice. See Control Panel
  • Added: the Ship orders setting, for a store that doesn't ship: no shipping method or shipping costs in the checkout, and no shipping method or shipping status on the orders. See Control Panel
  • Added: abandoned orders (cancelled, failed or expired and not paid) are hidden on the order overview and can be deleted automatically by the cron job. See Control Panel
  • Added: a cron job (the new Cron settings section) checks open orders that are not paid at the payment provider after 24 hours (the Check open orders after setting), so an order whose expired webhook got lost releases its stock and coupon code. See Control Panel
  • Added: filters (status, payment, shipping status, gateway, date, keyword) and bulk delete on the order overview in the CP. See Control Panel
  • Added: Top products (sortable by quantity or revenue), Payment methods and Refunds & chargebacks widgets on the dashboard, also as ExpressionEngine Pro dashboard widgets. See Control Panel
  • Added: the reorder tag, an Order again or Renew button that adds the products of an earlier order to the cart again for their current price, linked to that order
  • Added: {order:items:order_item_id}, {order:items:parent_order_id}, {order:items:is_reorder} and {order:items:reorder_order_id} in the order and orders tags, and the parent_order_item_id param of the multi_add_to_cart tag. See Order tag
  • Added: the Order lines block of the PDF layouts can show under the product name that it reorders or renews an earlier order, with your own text. See PDF layouts
  • Added: the Validate addresses setting (off by default): the checkout checks the billing and shipping address (when the form has them) against the format of its country (required fields, postal code format) and saves the postal code in its usual notation, e.g. 1234 AB. See Control Panel
  • Added: the Validate phone numbers setting (off by default): the checkout checks the phone number for the country of the billing address and saves it in the international format, e.g. +31612345678. See Control Panel
  • Added: {cart:discount_plus_tax} and {order:discount_plus_tax}, the discount including tax, used by the example templates next to the subtotal and total plus tax. See Cart tag

Changed ​

  • Updated: the add-on uses the ExpressionEngine 7 add-on installer, so you can update directly from any 1.x, 2.x or 3.x version. See Upgrading to 4.0
  • Updated: a new layout for the order overview in the CP: a row opens the order with a click, the exports are in an Export menu. See Control Panel
  • Updated: the Gateway Providers overview in the CP shows an icon for each gateway. See Payment Gateways
  • Updated: a new layout for the order page in the CP, that also works on small screens, with the actions in an Actions dropdown. See Control Panel
  • Updated: a new Create order page in the CP: search the products and the member, choose the shipping method (also of Store Shipping, Store Pickup and Store MyParcel), see the prices, the tax and the total while you add them, make a guest order without a member, and choose the status, paid and whether the customer gets an email. See Control Panel
  • Updated: when a webhook completes an order, the confirmation email is sent and the reinos_store_checkout_end and reinos_store_payment_end hooks are called, also when the customer doesn't return to the site. See Hooks
  • Updated: a customer whose payment is still pending (e.g. a bank transfer) returns to the order page instead of the homepage, a customer whose payment expired returns to the checkout. See Upgrading to 4.0

Important fixes ​

  • Bugfix: where two requests for the same order could be processed at the same time, e.g. a webhook and the customer returning from the payment page (which could send the confirmation email twice), or a refund clicked twice. See Payment Gateways
  • Bugfix: where the checkout didn't check the stock, so stock sold to someone else after the product was added to the cart was sold again. See Checkout tag
  • Bugfix: where the stock was not right after cancelling, refunding or deleting an order, or after a reversed chargeback. See Inventory
  • Bugfix: where a tax rate with decimals (e.g. 13.5% or 14.975%) was cut off to a whole percentage. See Control Panel
  • Bugfix: where the tax on the shipping costs was calculated differently in the cart, for the shipping methods of add-ons and in the shipping methods list. See Control Panel
  • Bugfix: where a discount higher than the subtotal also took off the shipping costs and gave a negative tax. See Discount
  • Bugfix: where Stripe (Checkout) charged too much: the shipping costs were charged at the order total, and a discount was not applied. See Stripe (Checkout)
  • Bugfix: where a Mollie payment that was pending, authorized or failed, or refunded or charged back in the Mollie dashboard, gave an error and the order was not updated. See Mollie
  • Bugfix: where a MultiSafepay order that was still being checked (uncleared or reserved), cancelled, declined, charged back or refunded became failed and released its stock, it gets the matching status now. See MultiSafepay
  • Bugfix: where a Stripe (Checkout) payment with a delayed payment method (e.g. Bacs Direct Debit) failed and released the stock while the payment was still processing, the order is pending until the payment succeeds or fails now. See Stripe (Checkout)
  • Bugfix: where a Stripe on-site payment that was taken while Stripe answered with an error (e.g. a timeout) failed the order and the webhook could not complete it, the checkout asks Stripe again now and completes the order or leaves it pending for the webhook. See Stripe (on-site, card)
  • Bugfix: where a PayPal order failed when the answer to Confirm and pay got lost and the customer confirmed again, while the payment was done. See PayPal
  • Bugfix: where with free shipping a customer could not place the order with the last shipping method in the list. See Control Panel
  • Bugfix: where a first visitor could lose the first product added to the cart. See Add to cart tag
All other changes (125)
  • Added: the reinos_store_manual_order_shipping_options hook, the shipping methods of an add-on on the Create order page, and the reinos_store_manual_order_no_email hook and storeServiceEmail()->isSuppressed(), so an email add-on doesn't send for an order created in the CP without an email. See Hooks
  • Added: the Sale price field of the channel settings, the current sale price for the reorder tag, and the discount condition Reorders and renewals, a discount on reordered and renewed products. See Discount
  • Added: the order page in the CP shows the history of a reordered product (all its orders on a timeline), and the order overview shows where a reorder came from and can filter on reorders. See Order page
  • Added: the reinos_store_validate_address and reinos_store_validate_phone hooks, for an add-on that checks an address or phone number itself (e.g. at a postal service). See Hooks
  • Added: the custom_field_labels:[name] param of the add_to_cart tag, the label of a custom field in the cart, the order, the CP, the emails and the PDFs. See Add to cart tag
  • Added: the custom_fields_required param of the add_to_cart tag: the product is only added with a value for these custom fields, and an update of the cart can't empty them. See Add to cart tag
  • Added: the reinos_store_cart_item_update_start hook can reject an update by returning an error, shown as {cart:error:update}. See Hooks
  • Added: the Order custom fields block of the PDF layouts, e.g. the order notes of the checkout on the invoice and the packing slip. See PDF layouts
  • Added: the order export has a column per custom field of the checkout. See Control Panel
  • Updated: the shipping tax uses the rate of Store Tax for every shipping method when it is installed, otherwise the Shipping TAX percentage
  • Updated: Stripe (Checkout) shows the products in one line when they don't add up to the total, e.g. with a discount
  • Updated: a partial refund of a Mollie payment leaves the order paid
  • Updated: an expired Stripe (Checkout) page makes the order expired
  • Bugfix: where the stats used UTC days instead of the site's timezone. Run Sync stats once after the update, see Control Panel
  • Bugfix: where a late notify (webhook) could set a paid order of Mollie, MultiSafepay, PayPal or Stripe back to an unpaid status
  • Bugfix: where the cancel url of a payment provider, or the cancel link of the PayPal review page, cancelled a pending order whose payment was still being processed or already received
  • Bugfix: where a Stripe (Checkout) session with nothing to pay left the order pending, and where a Stripe webhook with invalid JSON gave an error
  • Bugfix: where a role discount and a free shipping price rule were not shown in the discounts of an order
  • Bugfix: where {exp:reinos_store:custom_cart_item_field_value} gave a PHP warning for a cart_id that is not in the cart
  • Bugfix: where the sync settings only saved the URL title prefix when the title prefix was posted, and the help text gave the wrong default title prefix (it is Order #)
  • Bugfix: where syncing an order failed with url_title_not_unique when the sync channel already had an entry with that URL title (e.g. after the link to the entry was lost or order IDs were reused). The sync now links the existing entry again when its mapped order hash matches, and otherwise adds -1, -2, ... to the URL title
  • Bugfix: where Sync missing orders skipped the order items without an entry when their order was synced, and an order item that failed to sync was not reported. Sync missing orders now also syncs the orders with a missing order item, shows done, but with errors when an order item fails, and the status page shows the order items of a channel with syncing turned off as Skipped instead of Not synced
  • Bugfix: where the description of the Always select first shipping method setting didn't match what it does, and the gateway providers overview was not sorted by name
  • Updated: the Last orders widget of the dashboard shows the orders like the order overview, and a row opens the order
  • Added: HostedGateway base class to build your own gateway on a REST API without Omnipay. The refund button in the CP is shown for every gateway that supports refunds. See Custom Gateways
  • Added: Store country setting (Store settings), the country your store is based in. The Tax module uses it for the EU reverse charge
  • Added: the Calculate tax setting. Turn it off when the shop doesn't charge tax at all, then all tax is 0%. The Tax Type option No Tax is removed, it was calculated the same as Exclusive. Existing settings are changed to Exclusive, so the prices stay the same. See Control Panel
  • Added: the Weight unit setting (kilogram, gram or pound), the unit the Store works with for the weight of the products, and the weight_unit param of the add_to_cart and multi_add_to_cart tags for a product with its own unit (its weight is converted when it is added to the cart). Add-ons can use the storeServiceWeight() service, e.g. storeServiceWeight()->toGrams($weight). See Control Panel and add_to_cart
  • Added: {cart:coupon_code_error} (invalid or used), why a coupon code gives no discount, and {global_error:coupon_code} in the checkout. A code that gives no discount anymore when the order is placed (e.g. a code for one user that was used for another order) is removed from the cart and the checkout asks the customer to check the order, instead of placing it without the discount. See Cart tag
  • Added: {order:is_shipped} and storeServiceStatus()->isShipped($order), the one place that decides whether an order is shipped, with the reinos_store_is_shipped hook for the shipping statuses of add-ons. See Hooks
  • Added: storeServiceSettings()->save_store_settings($keys) for add-ons that show Store settings on their own settings page (it only saves the given Store settings), and storeServiceSettings()->save_setting($key, $value, $siteId) can save a setting for another site and adds the setting when it doesn't exist yet
  • Added: the reinos_store_view_order_actions hook, to add actions to the order page. See Hooks
  • Added: filters (severity, date, keyword), bulk delete and a CSV export on the log page in the CP. See Control Panel
  • Added: filters and bulk delete on the discount overview (type, expiry, usage, keyword), and filters on the gateway providers (active, keyword) and the channel settings (enabled, keyword)
  • Added: an overview of the entries in the order sync channel that are not linked to an order (with filters on status, date and keyword), with a link to edit each entry. Open it from the sync status page
  • Added: the summary on the dashboard compares every figure with the period before, has a Week period and shows the number of customers, split in new and returning customers. See Control Panel
  • Added: the chart on the dashboard shows the sales, the number of orders or the average order value, compared with the period before. It has a week view and a custom date range, and the Month view shows January to December with a line for every year
  • Added: the order page shows the currency, the member account, the other orders of the customer, whether the confirmation email was sent (or the templates the Store Email add-on sent), and when and by whom the order was refunded. The transaction id links to the payment in the Mollie or Stripe dashboard, custom gateways can add this with transactionUrl(). See Custom Gateways
  • Updated: the menu of the Store in the CP is split in groups: the orders and discounts, the settings, and the tools and logs. Sync orders and Example templates moved below the settings, and Sync orders is a section of its own with its Status, Order settings and Order items settings pages. See Sync to Entries
  • Updated: the parent_order_item_id of the add_to_cart tag is only stored when it is an item of a paid order of the visitor for the same product, another id is ignored and logged. Deleting an order links the reorders of its products to the order before it, instead of removing the link. See add_to_cart
  • Bugfix: where the test order of the email preview had no items and totals that didn't add up. It has five items with two tax rates now
  • Updated: every action has its own action URL (?ACT=<id>) instead of ?ACT=<id>&method=<action>. The old URLs keep working, e.g. a notify URL configured at a payment provider or a download link in an email that was already sent. The CP shows the new and the old notify URL of a gateway; Viva.com and Elavon Converge also show their redirect URL. See Installation
  • Updated: the Permissions page in the CP is one table with a row per page and a column per role, and also has the dashboard and the sync settings, which couldn't be given to a role before. It is for Super Admins only. Saving it keeps the roles of the permissions it doesn't show, and a permission with every role unchecked is saved too
  • Updated: the return_url of the checkout and cart forms and of the delete_cart_item link (and the other urls the Store redirects to) only goes to a url of the site itself, otherwise the customer goes to the homepage. Encode a space in such a url as %20
  • Updated: the checkout shows the shipping method missing error ({global_error:shipping_method_missing}) when the chosen shipping method is not one of the shipping methods offered for the cart. Templates that still post the old shipping_module_legacy method of Store Shipping must use the shipping methods tag
  • Updated: the checkout shows an Invalid Country error on the billing or shipping country ({billing_country:error}, {shipping_country:error}) when it is not one of the Allowed countries
  • Updated: the review page only uses the review_template param of the checkout tag, a review_template field in the checkout form is ignored
  • Updated: product modifiers: an unknown option (or a second option for the same modifier) is refused with {error:invalid_modifier}. Clear your template caches after the update: a form rendered before the update refuses the modifiers until the page is reloaded. A modifier weight with a decimal comma works now too
  • Updated: the Can order on low stock channel setting is renamed to Check the stock, which is what it does: when it is on, the stock is checked when a product is added to the cart and when the order is placed. The setting itself doesn't change. The unused Update stock when cancelled setting is removed, the stock is always added back. See Inventory settings
  • Updated: the reinos_store_shipping_tax_calculation hook gets the cart or order the shipping is for as a third argument, so an add-on (e.g. Store Tax) doesn't have to load the cart itself
  • Updated: the delete_cart_item tag calls the reinos_store_cart_item_update_start and reinos_store_cart_item_update_end hooks, like setting the quantity to 0 in the cart, and a return_url with a query string is kept
  • Updated: the sort direction of the orders tag is the sort param, like the channel entries tag. The old order param still works. See Orders tag
  • Updated: a gateway without a label shows its default label (e.g. Stripe (on-site, card)), and a gateway that no longer exists its name made readable (e.g. Stripe elements instead of stripe_elements), in {order:gateway_label} and the CP
  • Updated: the order page shows the VIES result of the tax number (valid, not valid or no answer) also when no reverse charge is applied, with Store Tax 2.0.0 or later
  • Updated: Manage Shipping Status moved to the Order settings, so it is also shown when Store Shipping is installed. The order overview shows the shipping status column and filter also when Store MyParcel or Store Pickup is installed, with the status of their own orders; a shipping status set by hand is only shown while Manage Shipping Status is on. See Control Panel
  • Updated: Export Orders exports the orders of the order overview with the active filters, Export Orders with products adds the ordered products. The separate export page with a start and end date is gone, use the date filter instead. Values in the order and log exports that start with =, +, - or @ get a ' in front of them, so a spreadsheet shows them as text. See Control Panel
  • Updated: the Edit order details page in the CP only changes the status of an open or pending order, and only saves Is paid, Is shipped and Is picked up for the statuses where they can be changed
  • Updated: the sales and the average order value on the dashboard include the tax, like the last orders, and the chart shows the total including tax. The dashboard loads Chart.js from the add-on theme folder instead of a CDN
  • Updated: the cart is only saved when its discounts changed, instead of on every page with a cart tag, so a visitor (or a bot) without products no longer gets an empty cart in the database
  • Updated: the Hooks page explains how to use the hooks together with the other Store add-ons (pass on last_call, priorities, escaping)
  • Bugfix: where the dashboard charts skipped a month at the end of a month, left out the first days of their first month, or left out the current year or added a year in the future, where the average order value subtracted the tax twice, where the summary kept loading with the Day period, where the widgets stayed empty for a role with access to the dashboard but not to the orders, where the Last orders ExpressionEngine Pro dashboard widget showed the buttons of the chart, and where the chart tooltip showed the currency symbol as an html entity
  • Bugfix: where a PayPal order expired on the review page, or the customer got an error page on the return from PayPal, when PayPal could not be reached or gave a temporary error. Only a payment PayPal no longer knows expires the order, otherwise the order stays as it is and the customer can reload the page to try again
  • Bugfix: where an order that was cancelled, failed or expired and then paid after all (e.g. the customer paid on the payment page in another tab after cancelling) kept its stock released and its discount codes free. The stock is taken again and the discount codes are used again (also when a code for one user is now used by two orders, logged as an error), and the order page shows the warning so you can decide to deliver or refund the order
  • Bugfix: where the discount codes of an order were not always released when the order was cancelled, failed, expired or refunded (by a webhook, by the payment provider or in another way)
  • Bugfix: where adding a product to the cart with a negative quantity gave a database error or a cart line with quantity 0 (the quantity is a whole number of at least 1), and where updating the cart could raise the quantity of a product beyond its stock. A higher quantity is checked against the stock like adding the product, the quantity stays the same when there is not enough and the cart shows {cart:error:out_of_stock}. A quantity below 1, or one that is not a number, removes the product, like 0. See Cart tag
  • Bugfix: where updating the custom fields of a cart item that had no custom fields saved "Array", so the posted fields were lost
  • Bugfix: where updating the cart with a form without a coupon_code field removed the coupon code. Only an empty coupon_code field removes it now
  • Bugfix: where {exp:reinos_store:duplicate_cart_item} didn't copy the max_qty, disable_shipping and note of the cart item (so a duplicate could go past the maximum quantity), and took the tax off the price a second time when the prices include tax (Tax Type incl)
  • Bugfix: where {exp:reinos_store:price} cut off the decimals of the price (12.50 became 12). A decimal comma works too
  • Bugfix: where the weight of a product was not checked (the check looked at the price), so a weight like "2kg" could fail to save. A weight with a decimal comma works now, and a weight that isn't a number is logged as an error and the number in it is used, so the product is still added to the cart
  • Bugfix: where a single-use discount code of the Store was refused (and shown as used in the CP) when a Store Price Rule rule with the same ID had been used, and where a discount of one site (MSM) also applied on the other sites, for a discount code as well as a member or role discount
  • Bugfix: where the discounts of the Store itself were applied as well when Store Price Rule was installed but had no cart rules, and their usage was saved as a price rule. When the Store Price Rule extension is disabled, the discounts of the Store are used again
  • Bugfix: where the discount pages of the Store could still be opened by url with Store Price Rule active (they go to the price rules now), where the discounts of the Store were hidden in the CP while they were used because the Store Price Rule extension was disabled, where a product price rule was listed once per product on the order page, and where the link to a price rule went through the old rule pages of Store Price Rule
  • Bugfix: where a check on the products or the total of the cart (used by Store Price Rule) gave a database error for a visitor without a cart
  • Bugfix: where the shipping country of an order stayed empty instead of the Default country when the checkout had no shipping country
  • Bugfix: where the reinos_store_order_created hook was called twice for an order from the checkout. It is now called once for every new order, also for an order created in the CP, and its second argument is the ID of the order instead of the next order ID. See Hooks
  • Bugfix: where {order:shipping_status} in templates and emails contained the HTML of the CP status badge when an add-on such as Store MyParcel or Store Pickup formats the shipping status. The reinos_store_format_shipping_status hook now gets a $format (html or text). See Hooks
  • Bugfix: where the reinos_store_checkout_before_check_gateway hook got an empty shipping method in the last step of a checkout with steps, so e.g. Store Pickup could not select its gateway there
  • Bugfix: where the reinos_store_cart_items_start hook ran on every cart tag of a page, so the Buy X Get Y items of Store Price Rule were removed and added again several times per page, and the cart forms could point to removed items. The hook now runs once, when the cart is calculated
  • Bugfix: where the {exp:reinos_store:gateway_list} tag showed no payment option of an add-on (e.g. "pay at the location" of Store Pickup) when no gateway was enabled, and showed two selected options when that option and the Manual gateway were both there. An add-on can add more than one option now. See Hooks
  • Bugfix: where the products of an order kept the tax rate, tax and tax info from before the customer changed the country in the checkout, while the order totals used the new rate. The discount was also divided with the old rate
  • Bugfix: where recalculating the totals of an order in the CP used the tax rate of the last product for the subtotal, the total and the shipping costs. Every product now uses its own rate (with the discount divided over the products, like the cart) and the shipping costs use the shipping tax rate
  • Bugfix: where the amounts in {cart:tax_details} and {order:tax_details} were the tax of one product instead of the whole line when the quantity was more than 1, where {cart:tax_details:info} was not available, where {order:tax_details:info} stayed empty for an order from the checkout, and where {cart:tax_details} still listed the tax on the shipping costs when the shipping was free
  • Bugfix: where the order page, the emails and the PDFs of an order with tax on shipping but no shipping costs gave a division by zero error
  • Bugfix: where the countries of South America didn't match a South America continent rule of Store Tax or Store Shipping
  • Bugfix: where the checkout failed (or cut off the carrier) when the label of a shipping method of Store Pickup or Store MyParcel was longer than 50 characters, and where a shipping status of Store MyParcel didn't fit on a fresh install. The shipping status of a new order is not shipped on every install now
  • Bugfix: where {order:is_picked_up} was true for every order that is not a Store Pickup order, where the Is Picked Up toggle in the CP showed yes for a pickup order without a pickup status (saving the order then marked it as picked up), and where the pickup statuses had no label
  • Bugfix: where the description of the disable_shipping param setting said the opposite of what it does, and its default was not shown in the toggle. The default stays the same: one item with disable_shipping="yes" removes the shipping cost. See Control Panel
  • Bugfix: where the confirmation email of a very large order could not be queued (the order data didn't fit), so no email was sent
  • Bugfix: where the Default settings page setting was not used for the Super Admin, and a "1" was printed on the CP pages for members who are not a Super Admin
  • Bugfix: where the status badge on the order page always had the same color, Resend mail was also shown for cancelled orders, and the tax was shown twice for a reverse charge order with tax
  • Bugfix: where the paging of the order overview counted the orders of all sites, Delete all logs also deleted the logs of the other sites, and the test order of the email preview always belonged to the first site (MSM)
  • Bugfix: where the paging of the discount overview counted the discount usages instead of the discounts, and sorting on the discount column gave an error
  • Bugfix: where the sync status counted every entry of the sync channel as a synced order, e.g. "168 of the 97 orders are synced". It now counts the orders that are linked to an entry, and shows how many entries in the sync channel are not linked to an order. The "logging" link on the sync and migration pages went to the discounts
  • Bugfix: where the browser could keep using the old CSS and JavaScript of the add-on after an update
  • Bugfix: where disabling the extension left its hooks behind in the release build
  • Bugfix: where an install updated from a version before 1.6.0 missed the custom fields column of the orders
  • Bugfix: where an order with a discount could not be paid with PayPal ("A negative amount is not allowed"), and where PayPal could refuse an order because the rounded prices differed a cent from the total. When the products don't add up to the total, e.g. with a discount, PayPal shows them in one line. See PayPal
  • Bugfix: where Stripe (on-site, card) charged a tenth of the amount in a currency with three decimals (BHD, JOD, KWD, OMR, TND), and where Stripe (on-site, card) and Stripe (Checkout) refused an amount with decimals in ISK and UGX
  • Updated: Stripe (Checkout) refuses a payment in a currency with three decimals (BHD, JOD, KWD, OMR, TND), where the customer would pay a tenth of the amount. Use Stripe (on-site, card) for these currencies. See Payment Gateways
  • Updated: Stripe (Checkout) no longer offers Giropay and Sofort (discontinued by Stripe) and WeChat Pay (not supported by the module) as payment methods, an older setting with them is ignored. With no payment method selected, card is used instead of an error at Stripe
  • Updated: a PayPal payment that PayPal holds as pending (e.g. an eCheck or a payment under review) makes the order pending instead of paid, and the log says so. Complete the order once PayPal shows the payment as completed. {order:awaiting_confirmation} is false for such an order
  • Bugfix: where PayPal refused an order with a product name or SKU longer than 127 characters, they are shortened
  • Bugfix: where PayPal refused an order without a (complete) shipping address, e.g. in a store that doesn't ship. The shipping address is only sent to PayPal when the order has one
  • Bugfix: where PayPal refused a shipping country in lowercase. A country code from a custom form is now always stored in uppercase on the cart and the order
  • Bugfix: where an amount with decimals could not be paid with PayPal in a currency without decimals (JPY, HUF and TWD), PayPal now gets a whole amount. See PayPal
  • Bugfix: where opening the PayPal return url again after the payment removed the sale id of the order, so it could not be refunded from the CP
  • Bugfix: where an order with nothing to pay, e.g. with a coupon of 100%, failed at the payment provider. The order is now completed and marked as paid without the provider, the Manual gateway keeps its own order status. See Checkout tag
  • Bugfix: where all shipping fields of an order created in the CP got the value of the address
  • Bugfix: where the metadata of a Mollie payment had the city as the zip code
  • Bugfix: where an order whose payment could not be started (the payment provider gave an error) stayed open and kept its stock and discount codes, so a single-use coupon was refused on the next attempt. The order fails now
  • Bugfix: where a customer who went back from the payment page and checked out again (or clicked twice) left an open order that kept its stock and discount codes, so a single-use coupon was refused. The checkout of a cart is processed one at a time, and a new checkout fails the previous order of the cart when it is still open and not paid at the payment provider (and closes its payment at Mollie, Stripe (Checkout) or Xendit), or cancels it when it waits on the PayPal review page. A previous order that turned out paid or pending is shown instead of placing a second order. When the payment provider can't tell (Opayo, a gateway without its transaction id, an error or an unknown status), the previous order stays open. A second checkout that is still running gives {global_error:checkout_in_progress}. See Checkout tag
  • Bugfix: where {exp:reinos_store:multi_add_to_cart} removed a product that was already in the cart when another product of the form could not be added (e.g. out of stock). The cart is now as it was before
  • Bugfix: where {global_error} in the checkout tag was always empty, it is the first global error now. See Checkout tag
  • Bugfix: where a checkout without a chosen payment method showed {global_error:gateway_not_exists} instead of {global_error:no_gateway_selected}. See Checkout tag
  • Updated: a payment that doesn't match the order (another currency, or less than the order total) doesn't mark the order as paid: the order becomes pending (also a cancelled, failed or expired order) and the order page shows a warning with the received payment, accept it or refund it at the provider. This is for Mollie, MultiSafepay, Stripe (Checkout), Authorize.net, Converge, Mercado Pago, Midtrans, Pay., PayMongo, Paystack, Razorpay, Square, Viva.com, Worldpay and Xendit; PayPal and Stripe (on-site, card) check the amount before the payment is taken. The order stays pending until you decide, a later status of the payment provider doesn't change it and it is never deleted as abandoned. See Control Panel
  • Bugfix: where the stock, price, SKU, weight and name of a product could not be read on a site with another database table prefix than exp_, so the stock was never subtracted
  • Bugfix: where an order created in the CP saved the running tax total as the tax of each product, and took the shipping costs from the cart of the admin without adding their tax
  • Bugfix: where a charged back order could still be refunded at the payment provider from the CP, paying out twice
  • Bugfix: where an attr param on the add_to_cart and multi_add_to_cart tags gave a PHP warning, use form_attr:[attribute]
  • Bugfix: where a new setting on another site (MSM) got an empty value instead of the default when the first site didn't have it yet
  • Bugfix: where an empty hash in the url of the cancel, confirm, review, redirect, payment form or download link could find an order without a hash
  • Bugfix: where a notify call for an unknown gateway gave a PHP error, Stripe (on-site, card) showed the details of an error to the customer, and the order export contained the order hash (which opens the order page of a guest order)
  • Bugfix: where a Stripe on-site payment intent whose capture failed stayed linked to the order and held on the card
  • Bugfix: where the Stripe and MultiSafepay gateways gave a deprecation notice on PHP 8.4

3.12.0 (29-09-2026) ​

  • Added: stripe_onsite gateway, for card payments on your own checkout page via the Stripe Payment Element. See Payment Gateways
  • Added: {exp:reinos_store:stripe_onsite_js} tag to load the script for the stripe_onsite gateway
  • Added: {order:gateway_label} variable to the {exp:reinos_store:order} tag
  • Updated: the order view in the CP shows the gateway label instead of its name
  • Bugfix: where a stepped checkout lost the shipping method chosen in step 2 when submitting step 3

3.11.0 (22-09-2026) ​

  • Added: Refund functionality
  • Added: PayPal now uses a custom review page. (the missing part of the PayPal checkout flow)
  • Added: review_template param to the {exp:reinos_store:checkout} tag to set a custom review template for e.g. PayPal checkout. Default it will fallback to the default review template reinos_store/templates/store.group/review.html.
  • Added: {order:awaiting_confirmation}, {order:confirm_payment_url} and {order:cancel_payment_url} variables to the {exp:reinos_store:order} tag to check if the order is awaiting confirmation with the option to cancel or confirm the payment.
  • Added: option to update the shipping address when editing the order billing address in the CP
  • Added: option to recalculate the order when editing the order billing address in the CP
  • Bugfix: where the error caught from the provider could fail
  • Bugfix: where the installion of the example templates could fail if the template group already exists
  • Bugfix: prevent deprecated preg_match() warning when price field is left empty
  • Updated: remove custom license check and rely on the built-in license verification of ExpressionEngine

3.9.4 (02-06-2026) ​

  • Added: reinos_store_order_created and reinos_store_order_updated and reinos_store_order_deleted hooks

3.9.3 (12-04-2026) ​

  • Bugfix: where the TAX result form the tax module was incorrectly parsed.

3.9.2 (09-04-2026) ​

  • Bugfix: where attachments are not included in the email

3.9.1 (07-04-2026) ​

  • Bugfix: where a incorrect log was added about a manual saved is_paid flag.
  • Bugfix: where sending email could fail if the site is behind a .htaccess password protection.

3.9.0 (05-04-2026) ​

  • Added: option to modify the name of the gateway.
  • Added: Better logging in the sync process
  • Added: check in the sync process if the mapped status actually exists in EE
  • Added: {order:count} variable to the {exp:reinos_store:orders} tag to get the current index of the order in the list of orders.
  • Added: {order:total_results} variable to the {exp:reinos_store:orders} tag to get the total count of orders in the list of orders.
  • Added: {order:absolute_total_results} variable to the {exp:reinos_store:orders} tag to get the total count of orders in the list of orders, ignoring pagination.
  • Updated: when sending email trigger an error, the whole process should not break but just log the error and continue the process. This could happen when you have a wrong email template or something is wrong with the email server configuration.
  • Bugfix: leave out the status field for validation due to some errors with the open status
  • Bugfix: where the paging on the log page did not work
  • Bugfix: avoid race condition in updating the order by the payment provider (that could result is sending a order confirmation email twice or trigger the order complete process twice)

3.8.1 (20-03-2026) ​

  • Added: count and total_results to the {order:tax_details} and the {cart:tax_details} tag pair to get the current index and total count of the items. This allow you to control when you show the full tax summary of all rates or not.
  • Added: option to set the order as picked up in the CP Order detail if the order is a pickup order.
  • Added: {order:is_picked_up} variable to check if the order has been picked up.
  • Updated: is_shipped, is_paid and is_picked_up cannot be changed once the order is cancelled.
  • Updated: allow empty option for default country setting
  • Bugfix: where the shipping_methods tag was not correctly respecting the prefix param.
  • Bugfix: small bugfixes and improvements

3.8.0 (09-03-2026) ​

  • Added: download tag does now download the file as PDF instead of opening it in the browser
  • Added: reinos_store_shipping_status_update hook and reinos_store_is_paid_update hook
  • Added: is_paid field for syncing to entries
  • Added: max_qty param to the {exp:reinos_store:multi_add_to_cart} tag to control qty input to validate the max qty that can be added to a cart in the UI as well.
  • Added: option to auto select the first shipping method in the checkout if there is only one shipping method available via the auto_select_first_shipping_method setting in the shipping module / Pickup module or My Parcel module settings.
  • Bugfix: where the max_qty was not working when updating the cart item qty
  • Bugfix: where the max_qty was not working in combination with the Each cart item is a new item setting
  • Bugfix: make sure we do not calculate shipping cost if nothing is to calculate -- avoid having incorrect shipping cost calculate before the user has set the shipping method
  • Bugfix: where the disable_shipping param in combination with the disable_all setting was not correctly working
  • Bugfix: where the shipping method tag was show an incorrect result in case of no result
  • Bugfix: set the price for shipping methods to 0 in case of a free shipping
  • Bugfix: added order_ids to the {exp:reinos_store:orders} tag to be able to get multiple orders by their order ID's e.g. order_ids="1|2|3"
  • Bugfix: where it could throw a base64_decode() error

3.7.2 (27-01-2026) ​

  • Added: {count} and {abs_count} to the {cart:items}...{/cart:items} tag pair to gert the current index.
  • Added: {is_pickup} that indicate if the order should be picked up.

3.7.1 (07-01-2026) ​

  • Bugfix: where the template had no extension and could not be copied
  • Bugfix: where the tax_details on item level could throw a php error
  • Updated: where the resend Email shows a cleaner CP message in case it failed

3.7.0 (09-12-2025) ​

  • Added: Dashboard to have a clean overview of your store - this is the same view as we used for the Widgets that can be used in the EE CP dashboard
  • Added: {order:has_free_shipping} and {cart:has_free_shipping} variable if the module detect a free shipping rule (works with the Price Rule module, Shipping module and with the in store discount rules)
  • Added: new global variables {reinos_store_pickup_module_installed} {reinos_store_price_rule_module_installed}
  • Added: badge's on the overview
  • Added: option to manage shipping status and added {shipped_status} on the order tag
  • Added: option to label shipping methods so it could have a clean name at checkout
  • Added: {gateway:id} variable to the {exp:reinos_store:gateway_list} tag pair
  • Added: option to the Channel Module settings to enable or disable the settings per channel
  • Added: product name, sku, price and weight field to the channel settings. This is mainly used when an other module is adding items to the cart (e.g. Reinos Store Price Rule module).
  • Support: Newly Reinos Store Price Rule module
  • Support: Newly Reinos Store Pickup module
  • Renamed: move shipping_type out of the custom field and in a own field on cart and order level. Also renamed it to shipping_method
  • Changed: {cart:tax_details} tag pair. Now it shows a list of tax rates that are applied to the cart/order instead of just low and high tax rate. So when you have multiple tax rates, it will show all tax rates that are applied.
  • Changed: {order:tax_details} tag pair. Now it shows a list of tax rates that are applied to the cart/order instead of just low and high tax rate. So when you have multiple tax rates, it will show all tax rates that are applied.
  • Updated: both {cart:tax_details} and {order:tax_details} contains also the shipping tax if applied.
  • Updated: all deps are updated to the latest version
  • Bugfix: multiple small issues are fixed

Breaking changes

  • Due to the change of shipping_type, we had to rename the shipping_type field name to shipping_method in the checkout form. Please make sure you rename shipping_type to shipping_method
  • The tax details variables are changed. Please check the example templates for the correct usage or see the updated docs.

3.6.5 (24-09-2025) ​

  • Added: {exp:reinos_store:price price="10.00" tax_type="high" formatted="yes" incl_tax="false"} that is identical to the fieldtype tag but solves the issue for the parse order.
  • Added: log message by what the sync process is triggered (visible by enabling all the loggings)

3.6.4 (14-08-2025) ​

  • Bugfix: remove abandoned carts in batches to avoid timeouts or out of memory error
  • Bugfix: do not create for every session a cart DB record. Only create a session when a product is added to the cart

3.6.1 (04-08-2025) ​

  • Bugfix: where deleting abanded carts could lead to a timeout on huge databases
  • Bugfix: where it could throw an error on tax_details variable when no items are in the cart

3.6.0 (28-07-2025) ​

  • Enhanced: Cleaner order PDF
  • Enhanced: Cleaner order overview and the option to directly edit your order
  • Added: option to set the amount of due days that will be shown on the invoice
  • Added: option to set a prefix for both the invoice, order and shipping PDF
  • Added: option to set a footer for both the invoice, order and shipping PDF
  • Added: Invoice and shipment PDF
  • Added: Download tag for the Invoice and Confirmation.
  • Added: is_paid flag to the order
  • Added: is_reverse_charge_eu field to the order and cart
  • Added: added reinos_store_order_created hook
  • Added: custom_fields_required to set custom required if needed
  • Added: {cart:tax_details}....{/cart:tax_details} for a summary of low and high tax rates as number.
  • Added: setting to set the state required for selected countries
  • Added: State/provice for Canada {exp:reinos_store:canada_province_and_territory_list}
  • Updated: move order menu item to the top
  • Renamed: {exp:reinos_store:state_list} --> {exp:reinos_store:us_state_list}
  • Bugfix: prices are handled now better when having the setting for including tax
  • Bugfix: Serialized settings could throw an error in EEcms cli

Breaking changes

  • Due to changes in the price field type, you should use {product_price:plus_tax_formatted} on your product page. In case you want to show price including tax ofcourse.
  • The value that comes out of the price fieldtype depends now on the TAX type setting.
  • {exp:reinos_store:order} prefix is set to all variables, even if its a nested field like the custom_fields. e.g. {order:items:custom_fields}{custom_fields:label}{/order:items::custom_fields} is now the correct usage.
  • We have renamed {exp:reinos_store:state_list} --> {exp:reinos_store:us_state_list}

3.5.0 (17-06-2025) ​

  • Added: {exp:reinos_store:multi_add_to_cart} to add multiple product at once to your cart. e.g. grouped products
  • Added: direct param to the {exp:reinos_store:add_to_cart} tag to directly add a product to a cart item
  • Added: option to disable the sync per channel via the Channel Setting CP section
  • Added: max_qty param to the {exp:reinos_store:add_to_cart} tag to control the max qty that can be added to a cart.
  • Added: logging messages per order. Instead of adding all logs to the logs section, we show the logs that can match an order ID on the order detail page
  • Added: permission page to control access per role
  • Added: setting to not show the decimal in the formatted price
  • Added: support multiple status via the status param in the {exp:reinos_store:order} and {exp:reinos_store:orders} e.g. status="open|closed"
  • Updated: default qty is set to 1 instead of 0
  • Updated: show the state default in the example template and for the US a list of states
  • Bugfix: sync the status and inventory on delete order
  • Bugfix: where update from 2.x could fail
  • Bugfix: where we used a numeric validation for the email from name
  • Bugfix: support non-cent currencies

3.4.0 (01-05-2025) ​

  • Added: reinos_store_finish_order hook
  • Added: reinos_store_resend_confirmation_mail hook
  • Added: support for the Reinos Store Email Template module
  • Bugfix: On certain rare hosting environments, the combination of session_start() and session_id() could trigger two session cookies. As a result, users were unable to add products to the cart. We now use a custom cookie to track unique carts.
  • Bugfix: where the create order from the CP could trigger a mysql error on the note field no default value.

3.3.1 (25-04-2025) ​

  • Update: use correct version number

3.3.0 (23-04-2025) ​

  • Added: Product modifiers
  • Added: Delete orders
  • Added: synced items links in the order detail
  • Added: make the order ID linkable in the order list
  • Added: payment_method param to the checkout tag e.g. {exp:reinos_store:checkout payment_method="manual"}
  • Removed: form_id for the {exp:reinos_store:add_to_cart} tag

3.2.1 (25-03-2025) ​

  • Bugfix: where it could fail to upgrade

3.2.0 (11-03-2025) ​

  • Removed: custom_fields_label:<your-field-name> as we now convert your names like this test_field_for_input --> Test field for input.
  • Updated: remove the synced channels out of the list of channel settings
  • Updated: sync to entries holds now protected fields. e.g. order_id and order_hash can be synced to an entry, but they cannot be changed in the entry self as this data is protected.
  • Updated: sync to entries does protect the status on the entry. e.g. when you update the status of your entry, it will fail (not changing the status) as status should be updated via the order.
  • Renamed: order:extra_fields --> order:custom_fields. Make sure you renamed {order:extra_fields}{extra_field:name}-{extra_field:value}{/order:extra_fields} --> {order:custom_fields}{custom_field:name}-{custom_field:value}{/order:custom_fields} and in your {exp:reinos_store:checkout} you should now use custom_fields instead of extra_fields.
  • Added: custom_fields:name for {exp:reinos_store:orders}{order:items}{order:items:custom_fields}<strong>{custom_fields:label} ({custom_fields:name}):</strong> {custom_fields:value}{/order:items:custom_fields}{/order:items}{/exp:reinos_store:orders}
  • Added: the sync_order_entry_id and sync_order_items_entry_id to the {exp:reinos_store:order} tag so you can get the synced entry if needed
  • Added: the option to update the cart items custom_fields
  • Added: option for synced order items to generated a license key e.g. for digital products
  • Added: {exp:reinos_store:duplicate_cart_item} to simply duplicate a cart item via a tag
  • Added: state field for both billing and shipping
  • Added: pagination for orders following the ExpressionEngine standard.
  • Added: {order:items:tax}} and {order:items:tax:formatted} to the order tag e.g. {order:items}{order:items:tax}-{order:items:tax:formatted}{/order:items}
  • Added: option to change the order ID
  • Added: order_by and sort param for the orders tag
  • Added: note field for order items. This field can be synced as well.
  • Added: Channel settings "sync Expiration date offset" to set a expiration date for virual products
  • Added: Channel settings "Each cart item is a new item setting"
  • Added: parent_order_item_id option to track the parent order_item_id in case you renew/reorder a product and you want to track down the parent.
  • Added: more fields can be synced.
  • Added: date range and option to include ordered products in the export
  • Added: cart setting for clearing the cart after logout
  • Added: cart setting abanded cart setting to remove old carts after x days
  • Added: discount can be used multiple times or just one time
  • Added: new order field subtotal_before_discount and subtotal_before_discount_plus_tax. This field holds the original value before any discount is applied.
  • Bugfix: where the country list was not loaded correctly in the CP
  • Bugfix: where the orders tag triggered an PHP error
  • Bugfix: added the correct fieldname for the custom example channel order_items
  • Bugfix: where syncing to entries could trigger the sync from entries to orders/items as well
  • Bugfix: make url_title more unique to avoid url_title errors
  • Bugfix: where the print option did not show the order
  • Bugfix: where the subtotal plus TAX was shown in the native order view where it should show without tax
  • Bugfix: where it could not sync entries due to the status and author_id validation error
  • Bugfix: do not complete orders with status "open"

Important As we have added subtotal_before_discount and subtotal_before_discount_plus_tax. You should run a migration script that will calculate these fields for you. Please go to admin.php?/cp/addons/settings/reinos_store/migration_320 and run the migration.

3.1.0 (17-01-2025) ​

  • Added: extension hooks to hook into the Store module
  • Added: support for third_party gateways (see the custom gateway section)
  • Added: A new setting to control whether each item is added to the cart as a new entry or stacked (default).
  • Added: field_name param to the {exp:reinos:country_list} and {exp:reinos:state_list} tag so it can be used where ever you want
  • Update: give the channel import fields actual labels instead of the short_name
  • Updated: add description for the entry_id field in the sync section.
  • Updated: sort the custom fields for selecting in the sync settings page
  • Updated: the export channel/channel_fields for the orders and order_items with the correct fields

3.0.2 (18-12-2024) ​

  • Bugfix: Resolved an issue where a "session undefined" error could occur when using the Facebook browser (or similar) with the Website Session type set to Cookies and session ID.

3.0.1 (13-12-2024) ​

  • Bugfix: where the tax could throw an error
  • Bugfix: could not update the inventory field due to a typo

3.0.0 (09-12-2024) ​

Breaking changes See https://addons.reinos.nl/news/store-module-v3

You need at least v2.x.x to upgrade to this version. Inside all v3.x.x releases, there is a v2.x.x. release. You can use this version to upgrade to the latest v2.x.x and after that upgrade you are good to go to update to v3.x.x.

As we renamed the module from reinos_simple_store to reinos_store we also added a migration script. This file is located here --> system/user/addons/reinos_store/mysql-migrate-200--300.sql. Its just a sql script that can be executed right after you are on the latest version.

  1. Make a mysql backup
  2. Update to the latest v2.x version.
  3. Run the mysql script system/user/addons/reinos_store/mysql-migrate-200--300.sql
  4. Delete the reinos_simple_store files
  5. Upload the new reinos_store files (both themes and system folder)
  6. Run the module updater as you normally should do.

We are not including the migration process within the module itself, as it is prone to errors. Since the module's name has changed, ExpressionEngine cannot directly handle this update. By following the steps above, your transition should be smooth.

  • Rename: Reinos Simple Store --> Reinos Store
  • Support: New shipping module See https://addons.reinos.nl/addons/store-shipping
  • Support: New tax module See https://addons.reinos.nl/addons/store-tax
  • Added: weight options to the add_cart tag
  • Added: {shipping_methods}...{/shipping_methods} tags to the checkout tag to loop over the shipping methods
  • Added: new global variables {reinos_store_update_checkout_details_ajax_url} {reinos_store_shipping_module_installed} {reinos_store_tax_module_installed}
  • Added: Inventory management https://docs.reinos.nl/store/#inventory
  • Bugfix: where the redirect on error for {reinos_store:add_to_cart} was redirecting to the return_url instead of the current_url
  • Bugfix: where Paypal was able to goes into an infinity loop
  • Bugfix: where &nbsp; was showing in the price if you set the currency behind the price
  • Bugfix: where it throws an PHP error when syning entries
  • Bugfix: where the discount expiration date could not set correctly
  • Rename: we renamed the tax="" to tax_rate="high|low" for the {reinos_store:add_to_cart} tag

2.0.0 (11-05-2024) ​

  • Added: Sync to entries. By doing so, you are able to use your orders (as entry) and have the freedom as you wish.
  • Added: Orders are assigned to the current logged-in member
  • Added: new tag {exp:reinos_simple_store:orders member_id='1'} to list orders for a specific user
  • Added: {exp:reinos_simple_store:delete_cart_item cart_item_id=""} to remove a single product from the cart
  • Added: status="open" param to the {exp:reinos_simple_store:order} tag
  • Bugfix: multiple fixes

1.12.0 (11-10-2023) ​

  • Added: locale field for Stripe payments to set the locale of the Stripe checkout page
  • Bugfix: where setting:free_shipping_above was not working at all
  • Bugfix: where the error was not correctly parsed for an invalid sale_price
  • Updated: better unique cart ID, so it can track better a cart for a user
  • Updated: Stripe API to be compatible with version 2023-08-16. See https://stripe.com/docs/upgrades#2023-08-16
  • Updated: PHP 8.2 support

1.11.3 (09-08-2023) ​

  • Update: min required PHP version is 7.4

1.11.2 (03-08-2023) ​

  • Bugfix: where some native EE functions throws an error

1.11.1 (24-07-2023) ​

  • Bugfix: where in some situations the confirmation email was sent twice

1.11.0 (11-07-2023) ​

  • Added: billing fields can be set optional
  • Added: shipping fields can be set optional
  • Added: nice looking labels for custom fields (e.g. custom_fields:test="test value") can be set via custom_fields_label:test="Testing". Input fields are supported as well
  • Added: grid support for the Simple Store Fieldtype

1.10.0 (01-06-2023) ​

  • Added: scoped the vendor folder to avoid vendor conflicts

1.9.0 (03-05-2023) ​

  • Added: option to change the way disable_shipping="" param is working
  • Added: total_items_qty --> return the total qty of all items in the cart
  • Bugfix: disable_shipping check should be as last in order

1.8.3 (27-01-2023) ​

  • Bugfix: where the option "shipping same as billing" was missing the field address2

1.8.2 (10-01-2023) ​

  • Bugfix: stripe API

1.8.1 (29-12-2022) ​

  • Bugfix: transaction_id should be varchar 255
  • Bugfix: payment_url should be TEXT for stripe

1.8.0 (16-11-2022) ​

  • Added: move cart data into the DB instead of session

1.7.1 (30-08-2022) ​

  • Bugfix: where mollie cannot get the id from the url

1.7.0 (26-07-2022) ​

  • Added: multisafepay provider
  • Added: new setting for putting the store address field
  • Added: {exp:reinos_simple_store:store_address} to print the global store address field
  • Bugfix: mysql strict mode throws some errors in some cases

1.6.1 (06-07-2022) ​

  • Bugfix: where paypal and stripe where not set the debug correct

1.6.0 (18-05-2022) ​

  • Added: customer_phone_required customer_company_required to mark the Phone and Company name as required if needed
  • Added: {billing_country_full_name} and {billing_country_full_name} to output the full name for the country
  • Added: setting for the symbol placement & space between
  • Added: support for extra order fields
  • Added: countries are translated
  • Bugfix: PHP 8 triggered PHP error on adding a product to the cart
  • Bugfix: MSM email templates where not installed
  • Bugfix: Sometimes a cart item cannot update with zero value
  • Bugfix: issue where custom field trigger php error

1.5.1 (01-11-2021) ​

  • Bugfix: where an PHP was shown when running PHP >7.3.x on the settings page
  • Bugfix: where the manual status set the status to complete instead of open

1.5.0 (23-10-2021) ​

  • Added: {cart:total_items} variable
  • Added: add free shipping option
  • Bugfix: avoid negative value after discount
  • Bugfix: coupon code can be used once
  • Bugfix: where the coupon ID cannot be removed
  • Bugfix: make discount code unique
  • Bugfix: updating discount could throw an PHP error on the expiry date
  • Bugfix: where discount role_id type was not set while editing a discount
  • Security: improved the security of adding a product to the cart. Updating is strongly recommended
  • Bugfix: manual payment trigger a PHP error
  • Bugfix: saving empty price result in .00

1.4.1 (25-08-2021) ​

  • Bugfix: gateway PHP error when the server use case-sensitive

1.4.0 (30-07-2021) ​

  • Added: resend confirmation mail
  • Added: change manual status
  • Added: print order
  • Updated: use native order view

1.3.0 (14-07-2021) ​

  • Added: support for Stripe
  • Updated: Gateway overview list

1.2.0 (08-07-2021) ​

  • Added: discount per Role
  • Added: option to sum all discount or just pick the first
  • Added: sale price
  • Added: :formatted price values

1.1.0 (09-06-2021) ​

  • Added: discount

1.0.0 (01-06-2021) ​

  • init release.