Public Backlog

WebinOne announcements, releases, updates and achievements

v 6.8 Release date: 03 Oct, 2022

Full Release Notes

BACKLOG

E-commerce Quoting Option

Original Description:

E-commerce quoting option so that when an order goes through the admin it can be edited or completed before the quote is transformed into an order and the invoice is issued for payment in full or for a deposit payment. A workflow can then also be generated for the order to go to the client/accountant/franchisee.

DESIGN

https://invis.io/YAX7PB2EC3Q 

1) Create Order functionality

Provide ability to create new order from the admin

Default status is ‘New’

Invoice Number should not be generated during this action

  • Form fields
    • Order Name
    • Domain (Dropdown - list of available site domains)
    • Status (Dropdown - list of available statuses)
    • Assigned To (Required - CRM lookup field)
    • Invoice Number
    • Invoice Date (preset to current date)
    • AWB Number
    • Tracking Url
    • Shipping address
    • City
    • State
    • Zipcode
    • Country
    • Advanced CRM groups assigned to the order
    • Add Custom Fields (available after saving the order)

2) Change products in the order

Provide ability to edit order products from the admin

BC reference:
https://prnt.sc/s2oblz 

Design:

https://projects.invisionapp.com/share/YAX7PB2EC3Q#/screens/415110743

Implement following functionality:

  • Add/Edit product
  • Disallow adding products if they are recurring products
    • Show error message “Recurring product is not allowed to be added”
  • Disallow editing products data if an order is a recurring order
    • Show error message “Orders with recurring products are not allowed to be edited”
  • Change inventory accordingly if there is are quantity changes to any ecommerce product order lines
  • Provide the ability to edit the product name
  • Provide the ability to change prices https://prnt.sc/x5cffi
    • implement linked recalculation between
      • Unit Price, Units, and Total Price
        (the Unit Price and Total Price should be calculated according to the applied tax)
    • once Unit Price or Total Price change is applied
      • do not apply volume discounts to this orderline any more
      • tax settings still should be applied to this product after quantity change
  • Provide the ability to delete the product from the order

If saving order with changed products, gift vouchers, discount codes, or shipping options and the order has an active recurring subscription:

  • show error
    • This order data is not allowed to be changed for orders with recurring subscriptions

3) Change overall order data

Provide ability to change the following data for an Order:

  • tax
  • giftvouchers
  • discount codes
  • shipping options
  • Disallow editing this data if:
    • an order contains an active recurring subscription

Provide ability to Generate Invoice Number via admin UI ( https://projects.invisionapp.com/share/A8W5SNPF5QX#/screens)

  • if generate invoice number action performed to the order that already has a system or custom invoice number
    • show an error message “This order already has an invoice number”
  • Show ‘Generate Invoice Number’ button only on orders that don't have a system generated or manually added invoice number.

4) New Payment type of “Refund”

Provide ability to add “Refund” as a payment type

  • Refund type can be added:
    • manually from the admin (in Order payments tab)
    • via webhooks:
      • Stripe: refund, cancel(only automatic flow)
      • Paypal: refund
      • Authorize: refund, void(cancel)
      • Bambora: -
      • Eway: -
  • Allowed to be deleted (if manual added only)
  • Value should be shown as a negative value (currency format should be taken according to the current format setting on the current domain)

5) Form changes

Create a new form type of “Quote” (for requesting a quote in the ecommerce quoting process)

  • Logic is the same as for the Checkout but
    • generates order without an invoice number.
  • On Edit form action (tab ‘Form Builder’ or tab ‘Settings’)
    • do not show recurring secure zones on the Settings tab if the selected form type is Quote
    • if the selected type is Quote and there are paid secure zones attached to the form
      • Show error message “Quote form can't be saved with the attached recurring secure zones”
  • On Edit form action (tab ‘Form Builder’)
    • if Form Type is Quote
      • If the "Accept Payment" field is selected on the form builder - show an error: “Quote form can't be saved with the "Accept Payment" field”
      • Do not show the following field buttons in the system fields list https://prnt.sc/GtfaxcIGuoPO
        • Accept Payment
        • Discount Code
        • Gift Voucher
        • Accept Event Booking
    • if Form Type is Checkout
      • Do not show the following field buttons in the system fields list https://prnt.sc/GtfaxcIGuoPO
        • Discount Code
        • Gift Voucher
        • Accept Event Booking
  • On Form submit:
    • if Form Type is Quote AND "Accept Payment" field is selected on the form builder - show an error: “Quote form can't be submitted with the ‘Accept Payment’ field”
    • if Form Type is Quote AND there is no shipping option selected on the shopping cart DO NOT stop processing the form.
    • if Form Type is Quote AND there is at least one recurring product in the shopping cart - show an error: “Quote form can't be submitted with recurring products in the shopping cart”
    • if Form Type is ‘Quote’ OR Form Type is ‘Checkout’ and there is a product in the shopping cart that was deleted - show an error: “Your shopping cart contains deleted products. Please review and remove all deleted products from the shopping cart and proceed once again”
  • On loading ‘Checkout’ or ‘Quote’ page from the shopping cart:
    • if there is a product in the shopping cart that was deleted - show an error: “Your shopping cart contains deleted products. Please review and remove all deleted products from the shopping cart and proceed once again”

6) Shopping cart changes

Add request quote button to shopping cart liquid object:

{% component type:"shopping_cart" %}

  • QuoteButtonHtml:
    <button class="system_button" data-cms_cart_quote="">Get a quote</button>
  • clicking on the button should lead to /quote
  • apply Before After and trigger js events
    • CMS_BeforeGoToQuote
    • CMS_AfterGoToQuote
    • CMS_TriggerGoToQuote
  • clicking Quote button validation should not require a shipping option to be selected

7) Request a quote system pages

Create system pages for Quotes

  • Get A Quote (/quote)
    • redirect here if clicked on the request quote button on the checkout
    • see content in page ‘Settings’ > ‘System Pages’ > ‘quote’
  • Quote Receipt (/quote-receipt)
    • user will be redirected here after quote form submission (default page)
    • see content in page ‘Settings’ > ‘System Pages’ > ‘quote-receipt’

8) System emails

Create System email for Quotes

  • For Quote Orders, send in place of Invoice email
    • sent on quote order create
    • ability to send quote if clicked ‘send quote’ button in the Order detail page (instead of ‘send invoice’)
  • Default From Email
    • admin@trustedemail.co
  • Default Subject
    • Quote
  • Default From Name
    • Admin
  • Content
    • see content in file ‘Email Notifications’ > ‘System Emails > ‘Quote’

9) Secure zone logic

On Quote form submit with Secure Zones assigned:

  • If there are paid secure zones assigned - show error message “Recurring secure zone subscription is not allowed for the ‘Quote’ form type”
  • else; immediately subscribe user to all free secure zones assigned to the form.

10) Precreate Request Quote form on all sites with default styles

Replicate default HTML/styles from the Checkout form, but remove payment fields and Total Amount field.

Create the form on all sites with the alias of ‘quote’

Fields on formbuilder:

  • firstname
  • lastname
  • email
  • phone
  • Shipping Address
  • reCAPTCHA v3

11) Plan restrictions

Disallow submission of forms with type ‘Quote’ on plans lower than eCommerce.

Show error message “Quote forms are not available on current site plan”

12) Admin User Role Restrictions

Add following admin user role restrictions

  • Orders
    • Can Add
    • Can Edit Details
    • Can Edit Payments
    • Can Edit Products

For all roles that have Orders -> Can View=true set Orders -> Can Edit Details=true (for backward compatibility)

For all roles that have Orders -> Can View=true set Orders -> Can Edit Payments=true (for backward compatibility)

Logic

  • Orders -> Can Add=false
  • Orders -> Edit Details=false
    • Removes Edit button from UI ( https://prnt.sc/qJv5vry38oQU)
    • Blocks update order details form url /admin/orders/123456/details
    • Blocks update order details request
    • Blocks generate invoice request
    • Removes Generate Invoice button from UI
  • Orders -> Edit Payments=false
  • Orders -> Edit Products=false
    • Blocks all update request for
      • orderlines
      • taxes
      • giftvouchers
      • shipping options
      • discounts

eWay payment field expiration workaround

1) Extend eWAY payment gateway settings

Adds new option for how the payment integration displays in payment forms.

When configuring eWay as a payment option under ‘Settings’ > ‘Payments’ new option for:

  • Checkout Integration Type (dropdown)
    • Inline (default - current implementation)
    • Modal (new implementation)

2) Logic for Modal

Do not show payment fields on the form.

Instead, once form is submitted show popup modal with payment fields.

3) Improve payment fields validation

After form submit:

  • if payment fields error occurred
    • reload payment fields iframe

This should avoid issue when credit card data determined as expired after second form submit even after payment data was fixed

Event payment to include tax and volume discounts

Event payments now honor tax settings and volume discount brackets assigned to Event prices.

Liquid output improvement of the event item:

Add following properties to liquid output of the event item:

"priceWithTax": 11.00,
"RecommendedPrice": 5.0000,
"RecommendedPriceWithTax": 5.50,
"taxRate": 0.1000,
"VolumeDiscount":
[
{
"Price": 10.0000,
"Quantity": 0
},
{
"Price": 8.0000,
"Quantity": 5
},
{
"Price": 5.0000,
"Quantity": 10
}
]

JS for volume discount:

When changing allocation field:

  • recalculate total amount based on volume discount settings of the price

On page load:

  • recalculate total price via API call based on
    • price in data-event_one_item_price
    • quantity in Payment_ItemQuantity
    • quantity discount
  • and paste totalAmount to the value of
    • field by selector [name="Payment_Amount"]
    • field by selector #PaymentTotalCost

Headers settings custom setup

1) Add header settings page

Add new menu item and page under ‘Settings’ > ‘HTTP Header Settings’

DESIGN

https://invis.io/M4107BHKYUDC

Content

  • list of allowed headers
  • Ability to enable/disable header
  • Ability to setup header's specific settings
    • ability to enable header
    • ability to setup header value (described below)


>> Strict-Transport-Security



>> X-Content-Type-Options



>> X-Frame-Options



>> Access-Control-Allow-Origin



>> Content-Security-Policy

  • Documentation
  • Options (text)
    • child-src
    • connect-src
    • default-src
    • font-src
    • frame-src
    • img-src
    • manifest-src
    • media-src
    • object-src
    • prefetch-src
    • script-src
    • script-src-elem
    • script-src-attr
    • style-src
    • style-src-elem
    • style-src-attr
    • worker-src
    • base-uri
    • sandbox
    • form-action
    • frame-ancestors
    • navigate-to
    • report-uri
    • report-to
    • require-sri-for
    • require-trusted-types-for
    • trusted-types
    • upgrade-insecure-requests


>> Referrer-Policy



>> Permissions-Policy

  • Documentation
  • Options (text - disallow to input following characters: ,() [replace to empty string])
    • accelerometer
    • ambient-light-sensor
    • autoplay
    • battery
    • camera
    • display-capture
    • document-domain
    • encrypted-media
    • execution-while-not-rendered
    • execution-while-out-of-viewport
    • fullscreen
    • gamepad
    • geolocation
    • gyroscope
    • layout-animations
    • legacy-image-formats
    • magnetometer
    • microphone
    • midi
    • navigation-override
    • oversized-images
    • payment
    • picture-in-picture
    • publickey-credentials-get
    • speaker-selection
    • sync-xhr
    • unoptimized-images
    • unsized-media
    • usb
    • screen-wake-lock
    • web-share
    • xr-spatial-tracking
  • Example of usage:
    • fullscreen
      • self "https://example.com" "https://another.example.com"
    • geolocation
      • *
    • camera
      • 'none'
  • Resulting Header from example:
    • Permissions-Policy: fullscreen=(self "https://example.com" "https://another.example.com"), geolocation=*, camera=()


>> (For page requests) Cache-Control

  • Content is same as below


>> (For files requests) Cache-Control



>> (For page requests) Age

  • Content is same as below


>> (For files requests) Age



>> (For page requests) Expires

  • Content is same as below


>> (For files requests) Expires

2) Logic

For ANY URL request (to any page or file) that is NOT related to the admin files and requests

  • add selected and configured headers to the response
    • if header is enabled AND there is at least one not empty option inside
      • add header with the selected options
        • checkbox options
          • if true - add option to the header. Else - ignore this option
        • text options
          • if NOT empty string - add option with the value to the header. Else - ignore this option
        • dropdown options
          • if NOT empty option selected - add option with the  selected value to the header. Else - ignore this option

3) Admin user role restrictions

Add following admin user role restrictions

  • HTTP Header Settings
    • Can View
    • Can Manage

4) Site plan restrictions

Show ‘Settings’ > ‘HTTP Header Settings’ page starting from plan

  • Pro

----------

Headers Validator Site: https://securityheaders.com/

Checklist values with commas improvement

1) Request params improvement

Add new property to ‘request.request_url’ liquid object

  • request.request_url.originalParams

Value is an object of all URL params however arrays should be represented as arrays instead of as CSV string

Example:

  • /lab?myArrayProp=option%201&myArrayProp=opti,on%202&myTextprop=textValue

<pre>{{request.request_url.params}}</pre>

Outputs:

{ 
"myarrayprop": "option 1,opti,on 2",
"mytextprop": "textValue"
}

<pre>{{request.request_url.originalParams}}</pre>

Outputs:

{ 
"myarrayprop": ["option 1", "opti,on 2"],
"mytextprop": "textValue"
}

2) Advanced CRM group field liquid object improvement

Add ‘ArrayValue’ property. If a field is checklist or dropdown (multiple) - paste selected options as an array to this property.

For all other fields paste value as first element of the array

Example:

{% component groupAlias: "MyAdvancedCRMGroup", entityType: "contact", entityId: "12345", collectionVariable: "groupFieldsList", layout: "", type: "CRMContactCustomGroup" %}

{{groupFieldsList}}

Output:

{ 
"Name" : "My Checklist",
"Alias" : "MyChecklist",
"Value" : "check 1,che,ck 3,check 4",
"ArrayValue" : ["check 1", "che,ck 3", "check 4"]
},
{
"Name" : "My Text",
"Alias" : "MyText",
"Value" : "my, some text",
"ArrayValue" : ["my, some text"]
},
{
"Name" : "My Number",
"Alias" : "MyMuber",
"Value" : 123,
"ArrayValue" : ["123"]
}

3) Save entity improvement

For the following property types:

  • checklist
  • dropdown multiple

View selected options of the property of type checklist or dropdown multiple as CSV string on list and detail layouts in Admin UI

  • If options are like
    • option 5
    • option 6
    • option 7,7
  • CSV string should be like
    • option 5 5,option 6,option 7,7

Provide the ability to save selected options if they contain "," character

  • via Admin UI
    • Create module item
    • Edit module item
    • Create CRM Contanct (advanced CRM fields)
    • Edit  CRM Contanct (advanced CRM fields)
    • Create CRM Form Submission  (advanced CRM fields)
    • Edit  CRM Form Submission (advanced CRM fields)
    • Create CRM Event Booking (advanced CRM fields)
    • Edit  CRM Event Booking (advanced CRM fields)
    • Create CRM Order (advanced CRM fields)
    • Edit  CRM Order (advanced CRM fields)
  • via save/edit entity frontent form
    • Form submission
    • Edit account form
    • Create module item form
    • Edit module item form

Entities that requires this improvement (admin UI)

  • module item
  • case
    • custom form fields
    • advanced crm fields
  • order
    • advanced crm fields
  • event booking
    • advanced crm fields

Add also following updates to module item update and search forms (site frontend forms)

  • Module item update form
    • For Checklist property type

      var propertyValues="{{this.ListcheckboxList | join:","}}".split(',');

      change to

      var propertyValues="{{this.ListcheckboxList | join:"|||;/;|||"}}".split('|||;/;|||');
    • For Dropdown (multiple) property type

      var values='{{this.ListListbox_list}}'.split(',');

      change to

      var values='{{this.ListListbox_list | join:"|||;/;|||"}}'.split('|||;/;|||');
  • Module item search form
    • For Checklist property type

      var propertyValues="{{request.request_url.params.prop_ListcheckboxList}}".split(',');

      change to

      var propertyValues="{{request.request_url.originalParams.prop_ListcheckboxList | join:"|||;/;|||"}}".split('|||;/;|||');
    • For Dropdown (multiple) property type

      var values='{{request.request_url.params.prop_ListListbox_list}}'.split(',');

      change to

      var values='{{request.request_url.originalParams.prop_ListListbox_list | join:"|||;/;|||"}}'.split('|||;/;|||');

4) Custom report improvement

According to the Save entity improvement improve custom report results searching by filters that contain value with "," character

  • filtering by custom form field on the following report types
    • Contacts and Cases
    • Contacts and Orders
    • Contacts and Event Bookings
  • filtering by advanced crm field on the following report types
    • Contacts
    • Contacts and Cases
    • Contacts and Orders
    • Contacts and Event Bookings
    • Contacts and Secure Zones

5) Import/Export improvement

Add following logic to import/export process for the following entities:

  • Module item
  • Contact
  • Case
  • Booking
  • Order

Logic:
For any property with type Checklist or Dropdown (multiple)

  • On Export
    • When generating CSV string of selected options replace "," substring with "%2С"
  • On Import
    • After retrieving list of selected options from CSV string for each option replace "%2С" substring with ","

Example:

  • Export
    • options
      • option 5
      • option 6
      • option 7,7
  • CSV string for the property (to the excel cell)
    • option 5,option 6,option 7%2С7
  • Import
    • CSV string for the property (from excel cell)
      • option 5,option 6,option 7%2С7
    • result list of options to be applied
      • option 5
      • option 6
      • option 7,7

6) Improve filters on custom reports

`In` and `NotIn` filters:
Add a new setting to the filter called:

  • Values Filter Condition (dropdown)
    • OR (default)
    • AND

Logic:

  • If OR selected (current logic will be applied) - will find all items that have at least one value from the filter values list
  • If AND selected - will find all items that have all values from the filter values list

Design: https://prnt.sc/KsffJVqXl2pm

Example:

Add an advanced CRM group with the field “theChecklist” to the contact of type Checkbox:

  • options
    • 1
    • 2
    • 3
    • 4

Select the following values for the contacts:

  • Contact1
    • theChecklist
      • 1
      • 3
  • Contact2
    • theChecklist
      • 1
      • 3
      • 4
  • Contact3
    • theChecklist
      • 2
      • 3

Setup Custom report for contacts and:

  • Add filter (using OR):
    • theChecklist
      • 1
      • 4
    • Values Filter Condition
      • OR
    • Results should be
      • Contact1
      • Contact2
  • Add filter (using AND):
    • theChecklist
      • 1
      • 4
    • Values Filter Condition
      • AND
    • Results should be
      • Contact2

"Remember Me" for CRM login form

Provide the ability to remember the logged-in state for CRM Members and configure its duration

Settings:

Add new setting to ‘Settings’ > ‘Misc’ > ‘CRM Settings’

  • Remember me lifetime (numeric)
    • 30 (default)
  • Logic
    • Determines how many days should logged in state be held after login form submit

Login form upgrade:

Add Remember me checkbox to login form layout when retrieve login form from Components toolbox (Secure Zone -> Login Form)

Add following html code to the form layout (after password fields):

<label for="RememberMe">Remember me</label>
<input type="checkbox" name="RememberMe" id="RememberMe">

Example: https://prnt.sc/mhd_q974tKDb

Login form logic:

When user submit login form with checked Remember me checkbox

  • set member logged-in cookie lifetime based on Remember me lifetime setting

if not checked

  • Member logged-in cookie lifetime defaults to 1 day

Improve Site load speed while saving module item

Replace the current solution with a materialized view to the DB table supported by triggers to sync data.

Improve the following logic that using the Table solution

  • Add DB Table solution to drafts
  • Improve saving module item when keywords was changed
  • Improve Import module items process

Tax rounding strategy setting

1) Add a new eCommerce setting

Add new setting to ‘Ecommerce’ > ‘Settings’ > Tax and Shipping’ > ‘Tax Settings’

  • “Tax rounding strategy” (dropdown)
    • Banker rounding + error compensation (unit price and total price) [default]
    • Banker rounding (unit price only)

2) Rounding Logic on shopping cart calculation

When banker rounding + error compensation (unit price and total price) applied

  • use current price rounding strategy (banker rounding + error compensation)
  • rounding applied to
    • unit price separately
    • total price separately

When banker rounding (unit price only) applied:

  • use banker rounding to unit price. Then calculate orderline total price as rounded unit price multiplied by quantity.
    Error compensation mechanism is not needed here
  • apply rounding to
    • unit price only

Abandon Cart Functionality

1) Extension setup

Add new Extension to the portal and to extension JSON file so portal user could enable and disable extension on the ‘Site’ > ‘Extensions’ tab in the Portal

“Abandoned Cart Recovery”

Short Description:
With abandoned cart recovery functionality (for logged-in users only), you can automatically send reminders to customers who add products to their cart and leave without completing an order.

Information:
According to statistics, about 80 percent of customers abandon purchases for different reasons after adding items to their shopping carts. With Treepl abandoned cart recovery you can automatically email users after a cart or checkout is abandoned. And you have the ability to set the time when the email will be automatically sent. So you can stay in touch with your customers while they still remember your store and products.

For logged-in users only.

Design: https://invis.io/JP13194K9QFA

​Pricing: Free during the beta period

Extension Restrictions logic:

  • Disallow enabling the extension on the site if its plan is lower than eCommerce
  • This extension is only available for Ecommerce plan

2) Abandoned Cart Recovery extension not installed or subscription expired error message

When admin performs any action related to Abandoned cart admin UI (listed in the list below) layouts AND Abandoned Cart Recovery extension is Disabled or Abandoned Cart Recovery extension subscription is expired

  • Show error message: “This action can't be performed: Abandoned Cart Recovery extension is disabled or expired for this site”

Likewise, if the Restore cart functionality is attempted:

  • Following the restore cart link
    • redirect to the system page "error-page" and set error message to the liquid - this.ErrorMessage

3) Add shop settings for abandoned carts and improve current settings

Add following setting to ‘eCommerce’ > ‘Settings’ > ‘Shop Settings’:

  • “Abandoned cart time in Hours” (number)
    • 4 (default)
    • Default adjustment based on Shopping Cart Lifetime:
      • if shopping cart lifetime is less than or equal to 4 AND greater than 1
        • set Abandoned cart time to (shoppingCartLifetime minus 1) as default value
      • if shopping cart lifetime is equal to 1
        • set Abandoned cart time to 1 as default value
      • if shopping cart lifetime is equal to 0
        • set Abandoned cart time to 1 as default value
        • set shopping cart lifetime=1
    • allowed range between 1 and 876000

Logic:

Applied to the shopping cart created via add to cart process (skip shopping carts that is created on generic payment form submissions, event payment forms, and recurring forms):

  • Number of hours after latest update in the cart that determine shopping cart as Abandoned (should be always less or equal to the shopping cart lifetime)
  • When shopping cart becomes Abandoned; create a history record (Shopping Cart Become Abandoned Recording). See “History Data” below.

Validation:

  • If Abandoned cart time is bigger than shopping cart lifetime, show Error Message “The abandoned cart time shouldn't be bigger than the shopping cart lifetime”
  • If there is an enabled abandoned cart email notification which time is bigger than the shopping cart lifetime, show Error Message “There is at least one abandoned cart notification which time is bigger than the shopping cart lifetime”
  • Update allowed range for Shopping Cart Lifetime (it should be in range between 1 and 876000)

DESIGN: https://invis.io/CW10NLS86GBJ 

4) Abandoned Cart Emails

Add tab to ‘Email Notifications’ > ‘Emails’ page called “Abandoned Cart Emails”

Shows list of emails by new email type "Abandoned Cart Email"

Tab will only be visible when the Abandoned Cart Recovery extension is enabled/active.

5) Abandoned Cart Email

LIQUID object should contain following data:

  • ShoppingCart
    • same object as on shopping cart
  • TrackingURL
    • see (6) Tracking URL logic
  • RestoreCartURL
    • see (7) Restore cart functionality

Email Sending Logic:

  • Create a history record (Email Sent Recording) regarding Email sent. See “History Data” below.
  • Add following image tag before closing </body> tag of the email content
    •  <img src="{{this.trackingURL}}" height="1" width="1">
  • Send email

On email save:

  • disallow saving if there is no </body> tag in this email content OR the assigned email template (since this is required for the pixel image tracking). Show error message “Email content should contains <body></body> tag”
  • disallow saving if there is no{{this.RestoreCartURL}}tag in the content. Show error message “Email content must contains{{this.RestoreCartURL}}liquid tag”

6) Tracking URL logic

  • Pattern
    • https://<siteDomain>/public/api/track-email/abandoned-cart/open?id=<ShoppingCartid>&notificationId=<idOfAbandonedCartNotificationStep>&guid=<guid>
  • Logic
    • If there is NO Email Opened Recording history record with such guid in the history:
      • Create a history record (Email Opened Recording) to track email opening events. See “History Data” below.
    • return 1px x 1px transparent png image as a response (with Content-Type: image/png)

7) Restore cart functionality

  • Restore cart link Pattern
    • https://<siteDomain>/public/api/abandoned-cart/restore?id=<ShoppingCartid>&abandonedCartNotificationId=<idOfAabandonedCartNotificationStep>
  • Logic
    • this request should restore the shopping cart and redirect the user to the shopping cart page
      • Get Shopping Cart by id
      • Create a history record (Shopping Cart Recovered Recording) to track shopping cart recovery. See “History Data” below.
      • restore Shopping Cart
        • set it as a current active shopping cart
      • redirect a user to the /shopping-cart page

8) Abandoned Cart Extension Page

Add new menu item

  • ‘Extensions’ > ‘Abandoned Cart Recovery’

Content

  • Notifications
  • Abandoned Carts
  • Reports

Menu item and page will only display if the Abandoned Cart Recovery extension is enabled/active.

9) Abandoned Cart Recovery -> Notifications tab

List of all Abandoned Cart Notifications ordered by interval set in ‘Send Email After’ setting.

  • Table columns
    • Send Email After
      • {SendEmailAfter value}Hours From Abandonment
    • Emails Sent
      • Number of sent emails
    • Email Open Rate
      • Percent of unique opened emails among all sent emails
    • Cart Recovery Rate
      • Percent of all Recovered shopping carts among all shopping carts marked as Abandoned
    • Actions
  • each row
    • has edit button
    • has delete buttons
      • when deleting the notification - do not restore its hour statistics when new notification with the same interval will be created, for example:
        • 12 hours notification has 25% recovery rate  and 30% open rate
        • user deletes this notification
        • then user creates new notification and sets interval to 12 hours
        • new created notification should have 0% recovery rate and 0% open rate
    • may display disabled state
  • ability to sort by columns - Name ASC (default)
  • pagination
  • ability to bulk delete selected items
  • ability to filter items by state:
    • All (default)
    • Enabled
    • Disabled
  • Remember last selected show filter

DESIGN: https://invis.io/8C10J9OPQM7D 

Add new notification functionality:

  • “Add New Notification” button
    • Display Add/Edit Form side panel
      • Send Email After Cart Abandonment Delay (in hrs) (numeric)
        • allowed range between 1 and 876000
        • number of hours should be less than eCommerce -> Settings -> Shop Settings -> Shopping Cart Lifetime In Hours. Else error message: “Abandoned cart notification can't be created outside of the shopping cart lifetime.”
        • validate that selected number of hours is still not selected for another email. Else error message: “Abandoned cart notification for the selected delay is already exists”
      • Email (dropdown - list of Abandoned Cart Emails)
      • Enabled

DESIGN: https://projects.invisionapp.com/share/8C10J9OPQM7D#/screens/447828839

10) ‘Abandoned Cart Recovery’ > ‘Abandoned Carts’ tab

List of all abandoned carts.

  • Table columns
    • Name (left empty if shopping cart has no owner)
    • Email
    • Total Cost
    • Lifetime
      • Difference in hours between Current Date Time and Created Date Time
      • Pattern
        • if difference is more than 24 hours:
          [<numberOfDays> days  ]<numberOfHours> hours
        • if difference is less than 24 hours:
          [<numberOfHours> hours]<numberOfMinutes> minutes
      • Sorting should be done by decimal, eg:
        • 3 hrs and 30 minutes would be 3.50
        • 3 hrs and 31 minutes would be 3.52
    • Created Date Time
    • Last Update Date
    • Expiry Date (datetime when shopping cart will be deleted)
    • Actions
  • each row
    • has view and delete buttons
  • ability to sort by columns (Lifetime DESC - default)
  • pagination
  • ability to bulk delete selected items

DESIGN: https://projects.invisionapp.com/share/8C10J9OPQM7D#/screens/447828837

Abandoned Cart Details page

  • Details tab ( https://prnt.sc/ZIAX_np-6OGI)
    • Currency/Country
    • Assigned To (email)
    • Total Cost
    • Created Date Time
    • Last Update Date
    • Expiry Date
  • Products tab
    • shows shopping cart info (order lines, discount, gift voucher, shipping option data, etc.)

DESIGN: https://projects.invisionapp.com/share/8C10J9OPQM7D#/screens/447828838

11) History data

  1. Email Sent Recording (Store the following data)
    1. ShoppingCartId
    2. Email (shopping cart owner email)
    3. AbandonedCartNotificationId
    4. Record DateTime
    5. Type (EmailSent)
  2. Email Opened Recording (Store the following data)
    1. ShoppingCartId
    2. Email (shopping cart owner email)
    3. AbandonedCartNotificationId
    4. Record DateTime
    5. Type (EmailOpened)
  3. Shopping Cart Recovered Recording (Store the following data)
    1. ShoppingCartId
    2. Email (shopping cart owner email)
    3. AbandonedCartNotificationId
    4. Record DateTime
    5. Type (ShoppingCartRecovered)
  4. Shopping Cart Become Abandoned Recording (Store the following data)
    1. ShoppingCartId
    2. TotalCost
    3. Email (shopping cart owner email)
    4. Record DateTime
    5. Type (ShoppingCartBecomeAbandoned)
  5. Shopping Cart Become Deleted Recording (Store the following data)
    1. ShoppingCartId
    2. TotalCost
    3. Email (shopping cart owner email)
    4. Record DateTime
    5. Type (ShoppingCartDeleted)

12) Shopping cart delete operation upgrade

Before shopping cart delete action add a history record (Shopping Cart Become Deleted Recording). See (11.5)

13)  ‘Abandoned Cart Recovery’ > ‘Reports’ tab

  • Abandoned and recovered carts
  • Abandoned and recovered carts amounts
  • Abandoned and recovered carts report

DESIGN: https://projects.invisionapp.com/share/C2130V1FMP5X#/screens

14) Analytics dashboard charts

Provide ability to add

  • Abandoned and recovered carts
  • Abandoned and recovered carts amounts
  • Abandoned and recovered carts report

Show these charts only if Abandoned Cart Recovery extension is enabled/active

DESIGN: https://invis.io/7910J9P1H3CG

15) Admin User Role Restrictions

Add following admin user role restrictions

  • Abandoned Carts
    • Can View
    • Can Delete
  • Abandoned Cart Notifications
    • Can View
    • Can Add
    • Can Edit
    • Can Delete
  • Abandoned Cart Emails
    • Can View
      • allows to see Abandoned Cart Emails tab on ‘Email Notifications’ > ‘Emails’ page
    • Can Add
      • allows to show add button on ‘Email Notifications’ > ‘Emails’ page (tab Abandoned Cart Emails).
      • allows to show add new follow-up email button on create follow-up form
    • Can Edit
    • Can Delete
      • these 2 restriction above should allow to view ‘edit’ and ‘delete’ buttons on ‘Email Notifications’ > ‘Emails’ page (tab Abandoned Cart Emails)
  • Abandoned Cart Report
    • Can View

Show these restrictions only if Abandoned Cart Recovery extension is enabled/active.

On create new admin user role set all restrictions above to true by default.

Disable detail layout feature

New module setting:

Add new module setting called “Disable detail layout” (checkbox - false by default)

Logic:

If ‘Disable detail layout’ is TRUE:

  • Make unreachable all module items URLs of the module
  • Show module URL field as inactive.
    • Show but do not allow to change it from Admin UI and ignore changing on Backend
  • Show module item URL field as inactive.
    • Show but do not allow to change it from Admin UI and ignore changing on Backend
      • on edit module item action from Admin UI
      • on edit module item from frontend action
  • Hide Detail Layout dropdown on add/edit module item form in admin UI
    • preset "Don't use" value as default on backend on create item
  • Do not add items of the module to the SITEMAP
  • On Import process if creating a new item
    • if there is a detail layout column and it's value is empty set ‘Don't use’ layout instead of the first existed detail layout of the module (like it works now and should work when ‘Disable detail layout’ is FALSE)

The logic of Detail layout "Don't use" logic improvement

If module item has Detail layout property selected as "Don't use"

  • show 404 page content (with 404 status code) when accessing the item by URL
  • Do not add such items to the SITEMAP

Module item rating

1) Module item rating in the items list and detail forms (admin UI)

Provide ability to add Item Rating column in module -> table setup to show rating in item list view

Add new system property to Edit module item form

  • “Item Rating” (text)
    • Always readonly
    • if somehow value is posted via edit item endpoint, ignore value from request AND do NOT override value in DB (it should be calculated automatically once comments rating for this item are added edited or deleted)
    • Value=Average rating posted via comments to this item (Approved ratings counted only)

2) New module item liquid property

Add a new property to the module item (in liquid)

  • “Item_Rating” (numeric)
    • Value=Average rating posted via comments to this item (Approved ratings counted only)

3) Searching logic

Provide the ability to search by ‘Item_Rating’ property when using{% component type:"module", isSearchResult:"true"%}for searching, same as for Number custom property - via requesting a range using:

  • prop_Item_Rating_Min
  • prop_Item_Rating_Max

4) Sorting logic

Provide the ability to sort by ‘Item_Rating’ field in module component tag, eg:

{% component type:"module", sortBy: "Item_Rating", sortOder: "ASC/DESC" %}

Add full Urls to Export

Add additional column in the export module item file (as a display value only) for the full item URL (parent and slug)

  • Column title “URL list”
    • list of all item URLs separated by ;
    • placed after ‘Parents’ column
    • on import action; ignore this column (for display/export purpose only)

Example:
/module-slug/item-slug;/module-slug/parent-item-slug/item-slug

Rename Site information to Site Globals

1) Rename "Site information" to "Site Globals" in ‘Settings’ > ‘Site Information’ page

Example: https://prnt.sc/KpeG14rpKr4w

2) Change liquid aliases accordingly

  • {{siteinformation}}to{{siteglobals}}
  • {{si}}to{{sg}}

NOTE: Provide backward compatibility so that{{siteinformation}}and{{si}}will still continue to work.

3) Change "Site information" to "Site Globals" in OSE

OSE Related Improvements

  • Change the page tab title to “Edit <Page name>'”
  • If a multiline custom property or a Content system property contains <script, <style, {{, {% this property should be blocked for editing via OSE.
  • If a multiline custom property or a Content system property contains blocks with a data attribute 'cms_ose_editable_text' all content from this block should be parsed into a separate WYSIWYG like a multiline custom property. A title for this section should be determined from a data attribute 'cms_ose_editable_text_title'. If this attribute is not found the title for this WYSIWYG should be constructed as follows: '<this property name> Text Block <index>'.
  • If some page doesn't have custom modules for editing and this page can be edited, all editable properties should be shown by default on the toolbox.
  • Add a javascript event trigger 'CMS_TriggerRefreshOSEItems' for a 'load more' function on the site frontend for a list of module items refreshing on the toolbox. This one should be triggered after AJAX.
  • Do some small UI/UX changes: https://invis.io/9U12ZSAU5NZY
  • Add a module name to the toolbox title
  • Add an "add new item" button on the items list at the first position (if it's available on a module).

Multiline Text property changes

Change custom property settings in Modules for text (multiline) fields.
  • Rename ‘Enable WYSIWYG’ to ‘WYSIWYG’
    • default unchecked
    • if selected - allow the ability to use WYSIWYG view on add/edit item form in Admin
  • add ‘Code Editor‘ setting
    • default checked
    • if selected - allow the ability to use Code view on add/edit item form in Admin
  • if no option is selected - show the property as general textarea.

Eg: https://prnt.sc/c4PmuscwOLMd

Feature flags changes (v6.8)

Remove the following feature flag: ‘Improved Custom Reporting’

BUG FIXES

Bug

Liquid in domain_settings

https://treepl.slack.com/archives/C023SU50YQP/p1659597522511109

Liquid data is not correctly outputting the Currency Name.

Bug

CRM Contact - in secure zone not display ID

https://treepl.slack.com/archives/C023SU50YQP/p1655388079321519

CRMContacts component is not displaying the Secure Zone ID in the Secure Zone data.

Bug

Site Information - edit datapicker

Go to Site Information

In option Date Time add possibility to set time https://prnt.sc/aE6rxofG-tnr

https://treepl.slack.com/archives/C023SU50YQP/p1658336160885129

Bug

Page caching - desktop/mobile

Page is caching ‘device_type’ value in Liquid ‘request’ object.

Bug

Create/update item from front

Using <input type="checkbox" name="prop_Enabled" value="false"> in a custom module Add and Edit form to set it’s Enabled state doesn't seem to work.   https://treepl.slack.com/archives/C023SU50YQP/p1663164691768169

Show more less
New Feature

Abandoned Cart Functionality

Add Abandoned Cart functionality to eCommerce.
  • BC Equivalent
  • Ecommerce
New Feature

E-commerce Quoting Option

E-commerce quoting option so that when order goes through the admin it can be edited, changed, completed before the quote is transformed into an order and the invoice is issued for payment in full or for a deposit payment. A workflow can then also be generated for the order to go to the client/accountant/franchisee.

As part of this feature...
  • CRM
  • Ecommerce
New Feature

Headers settings custom setup

Header settings page. Ability to enable/disable header(s), ability to setup header's specific settings.
New Feature

Module item rating

Ability to add Item Rating column in module -> table setup and show rating in item list view.
New system property to Edit module item form,
new module item liquid property.
Ability to search by Item_Rating property when using {% component type:"module", isSearchResult:"true"%} for searching.
Ability to sort by Item_Rating field in {% component type:"module" %}. ...
Improvement

Add view only column Item Urls to Export

When exporting the products to a CSV file (export table), include the full product URL’s rather than just the parent so products can be linked to their URL’s.
Improvement

Checklist values with comma saving Fix

The created element from the frontend doesn't save the "checkbox list" property with the "," symbol. This will be addressed.
Improvement

Disable detail layout feature

If Disable detail layout is TRUE, make unreachable all module items URLs of the module.
If module item has Detail layout property selected as "Don't use", show 404 page content (with 404 status code) when accessing the item by URL.
Improvement

Event payment order with tax

Event payment should create order with tax now.
Improvement

eWay payment field expiration workaround

Extend eWAY payment gateway settings to avoid issue when credit card data determined as expired after second form submit even after payment data was fixed.
Improvement

"Remember Me" for CRM login form

Provide the ability to remember the logged-in state for CRM Members and configure its duration.
Improvement

Rename Site information to Site Globals

"Site information" block renaming to "Site Globals". Typical use-cases for Site Globals might be to store the company name, address, contacts, logo, etc. in one handy location and render that information throughout the site via Liquid.
Improvement

Tax rounding strategy setting

Ability to select tax rounding strategy:
- banker rounding + error compensation (unit price and total price)
- banker rounding (unit price only).