Sales Order importer: email is now a required field

For the Sales Orders importer app, customer_email is now a required a required field.

This is because customer_email is enforced to be a unique field in Fulfil. In the past, imported sales orders without an email field would update the address of an existing contact with the same name, rather than create a new contact.

Upcoming changes to Payment Capture

As part of the upcoming improvements to the payments system, the authorize and capture settings on the sales order will be removed. This will now be a part of the payment term.

Why this change?

Prior to this, the payment term and capture settings could be conflicting. For example, you could set Net30 as the term and forget to change the capture settings to manual.

With the new approach, capturing payments before an invoice is considered an advance payment term with the remainder being due immediately and the payment capture setting will control when the amount is captured.

Who is impacted

If you capture payments within Fulfil or use Fulfil for wholesale and consumer business, this change impacts you.

Migration

At the moment, the settings that control when a charge happens is handled at the order level. The defaults on the order level are applied from the sales channel which also has the same default fields.

Payment term changes.png

The migration would automatically create payment terms for settings discovered on the channels if they are different from the settings on the existing payment term of the channel.

Easypost USPS Labels

The shipment and order number are now printed on shipping labels from Easy post. A minor issue with the cost recording of easy post has also been fixed.

Wholesale Portal

The wholesale portal has been updated to use webhooks to receive inventory updates faster. Instead of the periodic refreshes of inventory, webhooks will keep the inventory levels near realtime on the wholesale portal.

More webhooks

We've rolled out more webhooks! You can now listen to webhooks for order status changes.

Read more

More shipping carriers

New integration alert: Shipmate integration is now available!

Shipmate is an UK aggregator offering label generation for multiple carriers including:

  • Royal Mail
  • DPD
  • TNT
  • Yodel
  • Collect+
  • Hermes
  • Parcel force worldwide
  • APC Overnight
  • Asendia
  • xdp
  • Whistl
  • Tuffnells

Reports API base64 deprecation

When generating a report (PDF) type in Fulfil, it was possible to get a response in one of 2 ways.

  1. Report content as a link
  2. Report content in response (base64 encoded)

The second behavior, where the content was available in the body will now be deprecated. All requests will be implicitly assumed to be requesting a link.

Purchase planner now supports separate warehouse purchasing

If you're a merchant with multiple warehouses (such as "3PL warehouse" and "FourPX") and you needed to know how much inventory to order, you'd look at total sales in all your warehouses. However, previously you were limited to placing POs for each warehouse.

Starting this week, with our update to the purchase planner, you can now see sales across your warehouses, and deliver orders to one warehouse.

Screen Shot 2019-04-22 at 11.41.03 AM.png

Improvements to the REST API

Today, we've rolled out several new improvements to the REST API.

Why

Fulfil REST API has a powerful search mechanism through a filters array, that mimics how a SQL where clause works. This is great for advanced use cases, but made simple searches like order created after a time or fetching a list of records more complicated than it should be.

Starting today, the API supports a simpler search system by providing URL parameters.

Example:

Search for products that were created after a certain date

GET /model/product.product?created_at_min=2019-04-11T12:30

Ability to specify the fields

GET /model/product.product?fields=variant_name,code

Response:

[
    {
        "code": "20000504",
        "id": 5565,
        "rec_name": "[20000504] NEW 2MBI150UA-120-50 Apple X",
        "variant_name": "NEW 2MBI150UA-120-50 Apple X"
    },
    {
        "code": "20000505",
        "id": 5566,
        "rec_name": "[20000505] NEW 2MBI150UM-120 Apple X",
        "variant_name": "NEW 2MBI150UM-120 Apple X"
    },
    ...
    {
        "code": "20000511",
        "id": 5572,
        "rec_name": "[20000511] NEW 2MBI150VA120-50 Apple X",
        "variant_name": "NEW 2MBI150VA120-50 Apple X"
    }
]

rec_name and id are always returned

Fetch a list of records

GET /model/product.product?fields=code,variant_name&ids=5563,5564

Response

[
    {
        "code": "20000502",
        "id": 5563,
        "rec_name": "[20000502] NEW 2MBI150UA-120 Apple",
        "variant_name": "NEW 2MBI150UA-120 Apple"
    },
    {
        "code": "20000503",
        "id": 5564,
        "rec_name": "[20000503] NEW 2MBI150UA-120-01 Apple X",
        "variant_name": "NEW 2MBI150UA-120-01 Apple X"
    }
]

Other useful search properties

Field Description
ids Retrieve certain records specified by a comma-separated list of ids
per_page The maximum number of records to show per page. (Capped at 500)
page The page to return
since_id Show records after the specified ID.
created_at_min Show records created at or after date (format: 2019-04-25T10:15:47)
created_at_max Show records created at or before date (format: 2019-04-25T10:15:47)
updated_at_min Show records created at or before date (format: 2019-04-25T10:15:47)
updated_at_max Show records created at or before date (format: 2019-04-25T10:15:47)

You can also filter by any other field on a record

GET /model/sale.sale?state=draft

Will return orders in the draft state.

Filter using attribute/relationship

GET /model/sale.sale?invoice_address.country.code=US

Returns orders where the invoice address' country code is the US.

Advanced filtering

The advanced filtering using the array will continue to work.

Fulfil REST API update: strict limit on per_page requests

The Fulfil REST API will now enforce a strict limit of 500 records per_page when fetching records by sending a GET request to any model endpoint. This applies across all instances.