Skip to main content

Changelog

Developer Changelog

We regularly update our API and provide detailed notes on each release. We first release to staging, then to production about a week later. Learn more about our release process.

: Staging

: Production

💎 Changed

Performance

Reduced database calls to improve speeds of various queries, including product and currency queries.

: Staging

: Production

✨ New

Webhooks

Added the following webhook events:

  • agreement_created
  • agreement_updated
  • agreement_deleted
  • category_created

Learn more ->

🪲 Fixed

Refunds

Fixed an issue with inaccurate tax calculations for refunds when the initial order was not subject to tax.

: Staging

: Production

🪲 Fixed

Refunds

Fixed an issue with where checkoutLinesUpdate could encounter an error applying discounts in multi-currency environments.

: Staging

: Production

✨ New

Orders
Decline fulfillments API

Added the orderDeclineFulfillment mutation and object to remove order lines that cannot be fulfilled. A new field, quantityDeclined, has been added to the OrderLine object to track declined quantities.

When this mutation is called, the order total and taxes are recalculated, omitting the unfulfillable line items. However, shipping costs remain unchanged. This mutation must be used before payment has been captured.

The existing ORDER_FULFILLED webhook is triggered by the orderDeclineFulfillment mutation. You may need to update your webhook consumption to check the fulfillment status.

The DECLINED status is added to the FulfillmentStatus enum. Both order.fulfillments and nauticalOrder.fulfillments will now include declined fulfillments. Please note that the quantity value for these declined fulfillments is a positive integer. You may need to adjust your calculations involving fulfillment quantities accordingly.

Example mutation
mutation {
orderDeclineFulfillment(
order: "T3JkZXI6MTMzMDk="
input: {
notifyCustomer: true
lines: {
orderLineId: "T3JkZXJMaW5lOjMwMzIy",
quantityDeclined: 1
}
}
) {
order {
id
status
}
fulfillments {
id
status
totalLinesQuantity
lines {
id
quantity
}
}
orderErrors {
field
code
message
orderLine
}
}
}
Show more ↓

Learn more ->

💎 Changed

Performance
Checkout performance improvements

Introduced significant optimizations to checkout API calls, with the following changes:

  • Leveraging cached shipping rates for quicker calculations
  • Utilizing cached foreign exchange rates for multi-currency support
  • Elimination of multiple N+1 queries for checkout line items, reducing database load
  • Improvements to checkoutComplete execution time.
Payments
Braintree upgrade

Upgraded Braintree integration to use Braintree version 4.21.0.

Performance
Asynchronous webhooks

The following webhooks are now asynchronous: SELLER_AGREEMENT_ACKNOWLEDGED, PAYOUT_UPDATED, VENDOR_PAYOUT_UPDATED, PRODUCT_CREATED, and PRODUCT_UPDATED.

🚫 Deprecated

Inventory

quantity

The quantity field has been deprecated on the following types, and replaced with a more explicit name quantityOrdered:

  • OrderLine
  • SecondaryOrderLine
  • NauticalOrderLine
  • NauticalSecondaryOrderLine
Inventory

quantityFulfilled

The quantityFulfilled field has been deprecated on the following types:

  • NauticalOrder
  • NauticalOrderLine

Instead, retrieve quantityFulfilled from the underlying seller orderLine. To make this easier, nauticalOrder.lines now returns sellerOrderline with the underlying seller order lines.

🪲 Fixed

Inventory

Fixed an issue where stock could be deallocated from a warehouse different from the one it was originally allocated to.

Catalog

Fixed an issue that prevented editing prices for product variants.

: Staging

: Production

✨ New

Inventory

Stock allocation webhooks

Added new webhooks for stock events:

  • STOCK_ALLOCATED: Triggered by new order stock allocation.
  • STOCK_DEALLOCATED: Triggered by order stock fulfillment or removal/cancellation of order line items.

Learn more ->

Microsites

Sort products in microsite

Added support for SortOrder when querying products in a microsite.

Orders

Refresh order tax

Added the nauticalOrderRefreshTaxes mutation and object to force a recalculation of taxes on a non-finalized marketplace order, such as an order in the draft, offer, or quote stage.

Learn more ->

💎 Changed

Performance

Performance improvements

Enhanced performance for faster loading times across various product catalog queries, product availability in multi-currency environments, and the orderFulfill mutation.

🚫 Deprecated

Payments

Seller order payment fields and actions

Various fields and mutations around payments on the seller order have been deprecated in order to build a more flexible and stable solution. Payments were, and continue to be, captured against the marketplace-level NauticalOrder, not the seller-level Order. The following components have been deprecated:

  • Order.paymentStatus, Order.paymentStatusDisplay, and Order.is_paid will now return values based on the underlying NauticalOrder.
  • Order.payments and Order.actions are deprecated and will now return an empty list. After a deprecation period, these will be removed.
  • Order.total_authorized, Order.total_captured, and Order.total_balance are deprecated and will now return 0. After a deprecation period, these will be removed.
  • orderCapture, orderMarkAsPaid, orderRefund, and orderVoid mutations are now non-operational. These mutations are now deprecated and will be removed after the deprecation period.
info

If you have built any custom functionality using these components, you will need to update your workflows to use the corresponding NauticalOrder instead.

🪲 Fixed

Integrations

Fixed an issue where apps with seller-level configurations, such as Shopify or WooCommerce, could experience issues syncing data.

Webhooks

Fixed an issue where the accountConfirm mutation did not trigger the CUSTOMER_UPDATED webhook.

Webhooks

Fixed an issue where the customerBulkDelete mutation did not trigger the CUSTOMER_DELETED webhook.

Webhooks

Fixed an issue where the PAYOUT_UPDATED and VENDOR_PAYOUT_UPDATED webhooks were not being triggered by edits to payouts.

Orders

Fixed an issue where cancelling a quote or offer order deleted the order instead of moving the order to the cancelled state.

Orders

Fixed an issue where multiple nauticalOrder records could be created in certain scenarios when finalizing an offer order.

Sales

Fixed an issue with the user query, where querying the checkout.discountType field returned an error.

Inventory

Fixed an issue where quantityAllocated was not being decreased after cancelling an order.

Inventory

Fixed an issue where the STOCK_ALLOCATED event was not created when an item was added to an order or quote from the storefront.

: Staging

: Production

✨ New

Catalog
Capture variant dimensions

Added the following new size fields to the productVariant model: length, width, height, size_units.

Learn more ->

🪲 Fixed

Inventory

Fixed an issue where STOCK_UPDATED events were not triggered during certain stock update scenarios.

: Staging

: Production

✨ New

Catalog
Filtering by attributes with AND operators

We've made filtering by attributes more powerful by introducing support for AND operators.

This allows users to build detailed filters, improving the accuracy of their product or productVariant filtering, and enhancing their browsing experience.

To facilitate this this, the AttributeInput filter input has been extended with two fields:

  • condition: How to combine the specified attribute values, using either AND (default) or OR operators.
  • connector: How to link multiple filter clauses, connecting the current filter clause to the previous ones with either AND (default) or OR operators.
query {
products(
first: 100
filter: {
attributes: [
{
slug: "color",
values: [
"purple",
"violet",
"red"
],
condition: OR
}
{
slug: "brand",
values: ["acme"],
connector: AND
}
]
features: {
operations: {
name: "Season"
values: ["summer", "spring"]
condition: OR
}
connector: AND
}
}
) {
totalCount
edges {
node {
id
name
description
variants {
name
id
}
}
}
}
}
Show more ↓
Orders
Automatic invoice generation

You can now configure the Invoicing plugin to generate invoices automatically once payment is received for an order.

Learn more ->

Orders
Secondary order lines

Added the NauticalSecondaryOrderLine object, which represents a sub-order-line for grouped products.

Inventory
Allocate inventory configuration

Added more control over inventory allocation and stock validation handling.

The following new boolean fields are added to the MarketplaceConfigurationInput, for global settings on how your marketplace behaves:

  • enableStockAllocationForQuotes: When true (default), allocates inventory when a quote order is created.
  • enableStockAllocationForOffers: When true (default), allocates inventory when an offer order is created.
  • enableStockAllocationForDrafts: When true (default), allocates inventory when a draft order is created.
  • validate_stock_on_order_payment_creation: When true, validates stock quantity to fulfill the order when a payment is created. Defaults to false.
Security
Manage fulfillment permission

Added a new MANAGE_FULFILLMENT permission to the PermissionEnum. Users with this permission can manage order fulfillments, including reading, creating, updating, and cancelling, along with handling tracking information and shipping labels.

Without this permission, users are limited to reading fulfillment information for orders they have access to, but cannot perform any other fulfillment actions.

💎 Changed

Integrations
New address fields added to Typeform payload

The postal_code and phone_number fields have been added to the Typeform payload for seller onboarding.

🪲 Fixed

Integrations

Fixed an issue where product images imported from Shopify were not being rendered properly.

Catalog

Fixed an issue with applying an attribute filter to the productVariants query, where duplicate results could be returned.

Security

Fixed an issue with the pluginUpdate mutation, where a seller user with manage plugins permission could update any plugin. Now seller admins can only change plugin configurations owned by their seller.

: Staging

: Production

✨ New

Orders
Capture the user who completed a fulfillment

Added the user field to the fulfillment model, which can be queried to view which user performed a fulfillment.

Security
Manage inventory permission

Added the MANAGE_INVENTORY permission, providing more control over which staff members can manage inventory-related fields (sku, track_inventory, stocks).

🪲 Fixed

Catalog

Fixed an issue where the products query was not returning complete information about grouped products in certain circumstances.

Integrations

Fixed an issue where mapping the Tax ID (identification) field for seller onboarding with Typeform could cause the SELLER_CREATE webhook jobs to become stuck.

💎 Changed

Documents
Enhanced invoice header with marketplace information

When the marketplace logo is unavailable, the upper left header of customer and proforma invoices now displays the marketplace name and contact information.

✨ New

Inventory
Webhooks for stock events

New webhooks have been added for the STOCK_CREATED and STOCK_UPDATED events.

Toggle the following tabs to see example webhook payloads:

[
{
"id": "U3RvY2s6MzU5",
"new": {
"quantity": 110,
"quantity_allocated": 0,
"quantity_available": 110,
},
"old": {
"quantity": 10,
"quantity_allocated": 0,
"quantity_available": 10,
},
"type": "Stock",
"warehouse_id": "V2FyZWhvd...",
"warehouse_name": "Americas",
"product_variant_id": "UHJvZHVj..."
}
]
Show more ↓

💎 Changed

Documents
Secure document URLs

Document handling has been enhanced for greater security. Documents are now stored in a private container, accessible through secure URLs with time-limited access tokens.

By default, these URLs are valid for one day but can be adjusted upon request. When sharing URLs with customers, they will have a limited timeframe to access them. The document URL stored in the API and Dashboard will always return the most recent signed URL.

This change applies to digital_contents on products, documents attached to objects such as customers or products, export_files, import_files, and invoices. Previously added documents remain compatible with this change.

Orders
Updated at timestamp for fulfillments

The updated datetime field has been added to the fulfillment object model and related webhooks.

🚫 Deprecated

Integrations
ShippyPro

ShippyPro is no longer supported and it has been removed from the list of natively supported applications.

🪲 Fixed

Documents

Fixed an issue where the "Price" column on customer and proforma invoices displayed the price including tax instead of the net price of the product.

Checkout

Fixed an issue that prevented customers from checking out when all products in the cart had taxes turned off.

Catalog

Fixed an issue where a seller admin was unable to assign an image to a product variant they owned if the marketplace operator had previously attempted to assign the same image.

Catalog

Fixed an issue where marketplace operators were unable to upload or assign images for a product or variant owned by a seller when strict product image handling was enabled.

💎 Changed

Accounts
Account register mutation enhancements

Extended the accountRegister mutation to support new input fields and adding default addresses when creating accounts.

The following fields have been added to the AccountRegisterInput:

  • firstName
  • lastName
  • defaultBillingAddress
  • defaultShippingAddress
Vendor Mgmt
Create seller with owner enhancements

Extended the sellerWithOwnerCreate mutation to accept metadata for the seller or the user being created as part of the mutation, through the metadata field.

Furthermore, the sellerWithOwnerCreate mutation can now be run with a custom app bearer authentication token.

🚫 Deprecated

Vendor mgmt
Create seller with owner status input

The DetailedSellerInput.status field, which is used in the sellerWithOwnerCreate mutation, has been deprecated.

Going forward, this field will be ignored. The seller will always be created in the PENDING state.

🪲 Fixed

Checkout

Fixed an issue where the API could return a 500 error and prevent checkout after receiving a 404 error from Stripe when trying to find a PaymentIntent.

✨ New

Inventory
Country code HTTP header

A new HTTP_COUNTRYCODE header is supported, which allows you to override the default IP-based customer location detection and specify the country directly.

💎 Changed

Checkout
Performance improvements

Performance has been improved for checkouts requiring currency conversion.

🪲 Fixed

Integrations

Fixed an issue where orders containing only untaxed items resulted in an Avalara error.

🪲 Fixed

Microsites

Fixed a permission issue with querying microsites with a JWT token associated with a buyer account.

Was this page helpful?