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.

note

Release notes for version 1.4.1 were skipped due to an internal deployment. Changes from version 1.4.1 are included in these notes.

💎 Changed

Inventory
Retrieve product warehouse stats

Added warehouseStats to the product query, which will return aggregated stock quantities for all of a product's variants.

query {
products(last: 15) {
edges {
node {
id
name
warehousesStats {
warehouseId
quantity
quantityAllocated
quantityAvailable
}
}
}
}
}

🪲 Fixed

Orders

Fixed a permission check issue with the retrieving the identification field through a seller query.

Catalog

Fixed an issue where you could not query products for a seller.

✨ New

Catalog
Unpublish variants from storefront

Added more control over the visibility of product variants in the storefront through the API. To accomplish this, a new isPublished field has been added to the variant object.

This field behaves similarly to the same field for products to control the visibility of each variant in your storefront. When the isPublished flag is set to true, the variant will be displayed to your customers. Conversely, setting the flag to false will hide the variant from the storefront.

mutation {
productVariantUpdate(
id: "UHJvZHVjdFZhcmlhbnQ6MzU0Mg=="
input: { isPublished: false }
) {
productVariant {
name
id
description
isPublished
product {
name
id
isPublished
}
}
}
}

The parent product's published status takes precedence over all variants' published status. In other words, if a product has its isPublished flag set to false, regardless of the isPublished value of its variants, all variants will remain hidden from the storefront until the product itself is published.

Catalog
Validation logic for product and variant deletion

Added validation logic to prevent the deletion of a product or variant if it is associated with an active order, including draft, quote, or offer orders. An order is considered active when it is not in the fulfilled, delivered, or cancelled state.

Payouts
Query a single payout

Added the vendorPayout query to return information about a single vendor payout.

{
vendorPayout(id: "VmVuZG9yUGF5b3V0OjY4") {
seller {
id
companyName
}
gross
taxes
net
shipping
commission
payoutAmount
currency
status
statusMessage
orders(first: 15) {
totalCount
edges {
node {
lines {
productName
}
}
}
}
}
}
Show more ↓
Integrations
Retrieve Avalara customer tax certificate

The customerTaxCertificates query can now return the download URL for an image of a customer's Avalara tax certificate.

query {
customerTaxCertificates(
id: "VXNlcjox"
)
{
documentExists
id
filename
downloadUrl
}
}

💎 Changed

Webhooks
Order fulfilled webhook updated with seller and warehouse data

The ORDER_FULFILLED webhook payload has been updated to return information about the associated seller and warehouse.

🪲 Fixed

Catalog

Fixed an issue where editing product descriptions could lead to errors with the DescriptionHTML field when paragraphs were not wrapped in a <p> tag.

Integrations

Fixed an issue with ShipStation integrations where orders could be blocked from being created or updated in certain circumstances.

Integrations

Fixed an issue with Avalara integrations where the tax_included value sent to Avalara was not respecting the marketplace global tax treatment setting.

Integrations

Fixed an issue where the taxRate for order lines could be slightly rounded, due to supporting a numeric value with only two decimal points of precision. Now, tax rates are returned with six decimal point precision.

✨ New

Catalog
Customizable product sorting by priority weight

This feature allows for personalized sorting of products according to their designated sort priority weight.

You can assign a value to each product using the newly introduced sortPriorityWeight field. You can then arrange the products in ascending or descending order, based on their priority weights, through the SORT_PRIORITY_WEIGHT sorting method.

This new sorting feature gives you more freedom to arrange your products the way you want in your storefront. For example, you can make popular or sponsored products appear first by assigning them higher priority weights.

{
products(
first: 25
sortBy: {
field: SORT_PRIORITY_WEIGHT,
direction: ASC
}
) {
edges {
node {
id
name
description
sortPriorityWeight
}
}
}
}

💎 Changed

Performance
Performance improvements to checkout

Significant performance improvements have been made to the checkout process, resulting in faster speeds, particularly for shopping carts with a large number of line items (25 or more).

🪲 Fixed

Security

Fixed a security vulnerability issue with the password reset flow, where the system would present an error if the email was incorrect or inactive.

Orders

Fixed an issue where changing the quantity of an order line in a draft order reduced the variant's price for the order.

🪲 Fixed

  • Fixed an issue with converting a draft order to an order, where commissions could be calculated before the order line items were created.
  • Fixed an issue where, if you changed the quantity of items in a draft order with taxes enabled, line unit prices could be calculated incorrectly.
  • Fixed an issue affecting order commission calculation when there was no applicable commission rate for items in the order.
  • Fixed an issue where credit limits could be queried for unauthorized users.

✨ New

Checkout
Update checkout note mutation

Added the checkoutNoteUpdate mutation to update a given checkout with a note.

Checkout
Bulk update seller shipping methods mutation

Added the checkoutSellerShippingMethodsBulkUpdate mutation to update the shipping method of multiple sellers on the same checkout.

Agreements
Granular agreement commissions API

Added the ability to add and delete granular commissions to marketplace agreements through the agreementCommissionCreate and agreementCommissionDelete mutations. Currently, the only supported type of granular commission is category.

💎 Changed

Performance
Performance improvements to checkouts and orders

Various performance improvements have been made to improve speeds of checkout and order related operations.

Checkout
Discount type on checkout

Added the discountType field to the checkout object, which can be queried to return the type of discount applied to a given checkout.

Checkout
Available images on product variant

Added the availableImages field on the ProductVariant object, which can be queried to list the images available for assignment to a given variant.

🪲 Fixed

  • Fixed an issue with stock allocation tracking for grouped products, that could allow draft orders from being created with insufficient stock.
  • Fixed an issue where the shop.builderKey field could cause a GraphQL error of 'NoneType' object has no attribute 'replace'.
  • Fixed an issue with master product marketplaces, where a seller staff member could change the category or publish a master product using the API. Now, the productBulkPublish and productBulkSetCategory mutations check for the seller's ownership before allowing them to run the mutation.
  • Fixed an issue where the ORDER_UPDATE webhook job did not capture tracking information when the fulfillment was triggered from a 3rd-party source, such as Shopify.
note

Release notes for version 1.3.9 were skipped due to a customer-specific deployment. Changes from version 1.3.9 are included in these notes.

🪲 Fixed

  • Fixed an issue where a marketplace operator could create a wishlist entry for a buyer, but could not update the wishlist entry. Permissions to the wishlistItemUpdate mutation have been updated to allow this.
  • Fixed an issue where there was no default value for the optional id argument in the documentAdd mutation.
  • Fixed an issue where there was no error code for the SellerErrorCode enum for an invalid phone number.
note

Release notes for version 1.3.7 were skipped due to a customer-specific deployment. Changes from version 1.3.7 are included in these notes.

✨ New

Documents
Central document management API

Added the ability to upload and manage documents attached to products, variants, sellers, or customers. File type and file size are validated when a document is uploaded.

Use the following mutations to manage documents through the API:

  • documentAdd
  • documentRemove
Documents
Proforma invoice API

Made the following API changes to support generating a proforma invoice:

  • The InvoiceRequest mutation has been updated to support generating a proforma invoice, by passing documentType: 4 in the request input.
        mutation {
    invoiceRequest(
    documentType: 4,
    orderId: T3JkZXI6NTI4)
    {
    invoice {
    url
    status
    number
    }
    invoiceErrors {
    code
    field
    message
    }
    }
    }
  • Added the "Sold tax inclusive" label to the proforma invoice and invoice document types, which will now appear on generated documents when appropriate.
  • Added "Discount" and "Volume Discount" sections to the proforma invoice and invoice document types, which will now appear on generated documents when appropriate.
Orders
Delivered state for orders

Added a new DELIVERED order state to the OrderStatus enum.

Also added the orderMarkAsDelivered mutation, to move a fulfilled order to the DELIVERED state.

mutation {
orderMarkAsDelivered(id: "T3JkZXI6NTI4") {
order {
status
paymentStatus
seller {
companyName
}
}
orderErrors {
message
}
}
}
note

If a fulfillment is cancelled on an order already in the delivered state, the status will revert back to PARTIALLY_FULFILLED or UNFULFILLED, as appropriate.

💎 Changed

Performance
Query performance optimizations

Various performance improvements have been made to improve query speeds.

Inventory
Include allocations in stock quantity update

A new includeAllocations boolean field is available as part of StockInput in mutations for updating stock levels. This field determines how the quantity input provided in the mutation will be used to update the stock quantity:

  • When true, the quantity you provide in the mutation will be added to the number of units in the quantityAllocated. The new stock quantity will be the sum of these values.
  • When false (default), the quantity you provide in the mutation will simply update the quantity field. quantityAllocated will not be taken into account.
Mutation
mutation {
productVariantStocksUpdate(
variantId: "ABC=="
stocks: {
quantity: 20
includeAllocations: true
warehouse: "ABC=="
}
) {
productVariant {
name
stocks {
warehouse {
name
}
quantity
quantityAvailable
quantityAllocated
}
}
bulkStockErrors {
message
}
}
}
Show more ↓
Response
{
"data": {
"productVariantStocksUpdate": {
"productVariant": {
"name": "A-Line Dress in Red",
"stocks": [
{
"warehouse": {
"name": "Oceania"
},
"quantity": 32,
"quantityAvailable": 20,
"quantityAllocated": 12
}
]
},
"bulkStockErrors": []
}
}
}
Show more ↓
Inventory
Quantity available at warehouse

The quantityAvailable field is now available on the stock object to reflect the amount of variant stock at the warehouse that is available for purchase and is not allocated to an order.

This field is automatically calculated as the difference between the quantity and quantityAllocated.

note

quantityAvailable will be sent in all relevant webhook payloads.

Inventory
Metadata fields on warehouse

The privateMetadata and metadata fields are now available on the warehouse object.

Catalog
Product location kind API

Added the locationKind field to the location object, supporting options from the LocationKindEnum.

Catalog
Updated attributes query

The attributes query has been updated to add inProductSearch and inVariantSearch filter options.

Integrations
Marketplace order number added to seller order email payloads

The nauticalorder.id field has been added to seller order related SendGrid email payloads for a reference to the marketplace order number. For example, payloads will include the following:

"nauticalorder" :
{
"id": 626
}
Integrations
Stripe API version

You can now specify the Stripe API version in your Stripe app settings. The API version defaults to 2022-08-01, which is the latest supported version.

🪲 Fixed

  • Fixed an issue where the fulfilledByMarketplace field remains enabled after disabling it with the updateSellerSettings mutation
  • Fixed an issue with master product marketplaces where variant images could in place of the master product images. To fix this issue, a new marketplace setting is introduced for strict_product_image_handling. Contact Nautical support to request this setting.
  • Fixed an issue where certain apps could be activated in the app marketplace without valid credentials.
  • Fixed an issue where variant update webhooks triggered after changing the minimal_variant_price_amount field returned the previous price in the webhook payload instead of the updated value.
  • Fixed an issue with multiple customer accounts being created in Stripe for the same buyer when the "Store customer cards" setting was enabled .

⛵ Added

Support for HTML descriptions

Added the ability to store and render descriptions in HTML format. To facilitate this, a new descriptionHtml field is added to the following objects:

  • product
  • productVariant
  • category
  • collection
  • microsite

This feature makes it easier to render formatted descriptions in the storefront, and to support integrations that pull product descriptions, such as Shopify and WooCommerce. The descriptionHtml field is fully backwards-compatible with the existing description and descriptionJson fields.

As a result of these changes, the WYSIWYG text editor in the Dashboard now enables users to edit and save descriptions as HTML. The text editor also now supports the ability to paste rich-text formatting, making it easier to create and maintain formatted descriptions.

Learn more ->

🌊 Changed

Faster product and variant search performance

Product and variant search queries have been optimized for significant performance improvements. You can now expect faster and more efficient search results.

Faster product filtering by stockAvailability

Filtering the products query by stockAvailability has been optimized for performance improvements. This means that filtering products based on stock availability is now faster and more efficient.

🪲 Fixed

  • Fixed an issue that could cause stranded payments by preventing the ability to finalize and complete an order after creating payments. This issue could occur for users that were both a seller staff member and a customer.
  • Fixed an issue where deleted staff member users that shared a customer account retained permissions to access the Dashboard after the staff member was deleted.
  • Fixed an issue with insufficient permission checks on the userByEmail query.
  • Fixed an issue where the list of available shipping methods could differ on the seller order and marketplace order for draft and quote orders.
  • Fixed an issue where products were hidden from collections pages when the "Show in product listing" toggle was turned off.
  • Fixed an issue where the ORDER_CREATED webhook could be triggered inconsistently for draft orders.
  • Fixed an issue where the productCreate mutation in master product marketplaces always set the seller field to 1 (corresponding to the marketplace seller), even when another seller was specified.
  • Fixed an issue where deleted product variants were being used in the insightsTopPerformingProducts query. This issue could cause the Dashboard home page to crash.
note

Release notes for version 1.3.4 were skipped due to a customer-specific deployment.

🪲 Fixed

  • Fixed an issue where editing any field on a product caused the isAvailableForPurchase field to switch to false.

⛵ Added

Advanced search filter on products and variants

Added an advancedSearch filter to search by specific fields for a faster, more targeted search, as opposed to the pre-existing search filter, which searches across all fields.

You can use the advancedSearch argument in the ProductFilterInput for advanced filtering by search term when querying products and variants.

The fields you can target for search are defined in the ProductSearchFieldEnum and ProductVariantSearchFieldEnum. If you don't define search fields, the filter defaults to search only by NAME.

query {
products(
first: 25
filter: {
advancedSearch: {
searchTerm: "shiny"
searchFields: [
NAME,
VARIANT_NAME,
DESCRIPTION,
CATEGORY_NAME]
}
}
) {
edges {
node {
id
name
description
}
}
}
}
Show more ↓

Learn more ->

Retrieve Avalara tax exempt codes

Added the ability to retrieve the list of Avalara tax exempt codes through a new taxExemptCodes query.

query {
taxExemptCodes {
code
name
validCountries
}
}

Dimension argument for marketplace insights

Added the dimension argument to filter by time period for the following marketplace insight queries:

  • insightsOrdersMarketplaceSummary
  • insightsMarketplacePaymentsSummary
  • insightsMarketplaceTaxSummary

The values for the dimension argument are defined by the InsightDimensionEnum.

Breaking changes for insight queries 💥
Consider the following breaking changes if you're using pre-existing API integrations for marketplace insights:
  • The filter fields startDate and endDate are now required for all insights queries.
  • The perspective filter argument input type changed from string to PerformancePerspective.
    This must be updated in any logic using the following queries:
    • insightsTopPerformingCategories
    • insightsTopPerformingProducts
  • The input type for the dimension argument changed from string to InsightDimensionEnum. This must be updated in any logic using insightsOrdersMarketplaceSummary queries.
  • Fields used for report logic are now required, including queries that use ColumnObjectType, FilterObjectType, and other fields depending on the report type. For example, InReportMarketplaceAffiliatePayoutsSummaryType now requires category, title, summary, and report.
  • In the GraphDataType object, the period field was renamed to dimension.

Set availability on productCreate

Added the ability to set product availability while creating products through the API. The productCreate mutation input now supports the isAvailable and startDate fields.

mutation {
productCreate(
input: {
isAvailable: true
productType: "UHJvZHVjdFR5cGU6NDM5"
name: "Snow Pants"
seller: "U2VsbGVyOjI="
basePrice: "50"
}
)
{
product {
name
isAvailable
}
}
}

Force order fulfillment

Added the ability for users with the Manage marketplace permission to force order fulfillment for a line with a deleted variant, by passing the allowNullVariants field with the orderFulfill mutation input.

mutation {
orderFulfill(
order: "T3JkZXI6MQ==",
input: {
lines: [
{
orderLineId: "ABC=",
stocks: [
{
quantity: 1,
warehouse: "ABC=="
}
]
}
],
notifyCustomer: false,
allowNullVariants: true
}
) {
orderErrors {
field
message
code
warehouse
orderLine
variant
}
order {
id
number
}
fulfillments {
id
fulfillmentOrder
status
}
}
}

Show more ↓

Set status on sellerDataCreate

Added the ability to set the seller status while adding a new seller with the sellerDataCreate mutation.

A new status field is added to SellerInput. The status field accepts values from the SellerStatusEnum. If unspecified, the status defaults to PENDING.

mutation {
sellerDataCreate(
input: {
name: "Cosmic Shirts Co"
owner: "VXNlcjo3NDM4"
plan: "QWdyZWtZW50Ojc="
status: APPROVED
}
){
ok
seller {
id
companyName
status
}
}
}

Available payout balance on orders

Added the availablePayoutBalance read-only field to the order object, to return the balance remaining to be paid out.

query {
order(
id: "T3JkZXI6MTIyMTY="
)
{
id
availablePayoutBalance {
amount
currency
}
}
}

Filter orders by payout status

Added the ability to filter the orders query by payoutStatus, which accepts values from the OrderPayoutStatusEnum.

query {
orders(
first: 10
filter: {
payoutStatus: READY_FOR_PAYOUT
}
)
{
totalCount
edges {
node {
id
availablePayoutBalance {
amount
}
}
}
}
}
Show more ↓

Convert offer to quote order

Added the orderOfferConvertToNauticalQuoteOrder mutation to convert an offer order to a Nautical (marketplace) quote order. You can target the id of either an order or Nautical order.

mutation {
orderOfferConvertToNauticalQuoteOrder
(id: "VXNlcjo3MtYw")
{
order {
id
status
created
}
orderErrors {
field
code
message
}
}
}

Add public metadata on customer checkout

Added the ability for a customer to add and manage public metadata to their own checkout(s) through the API, for example using the metadataUpdate mutation on checkout.

This functionality must be turned on in your environment before it can be used. Contact a Nautical support representative to enable this functionality in your marketplace.

VAT identification number for customers

Added the vatIdentificationNumber field to the user object, for example to store and display a customer's VAT identification number on an invoice.

query {
user(
id:"VXNlcjo3MjYw"
)
{
vatIdentificationNumber
}
}

Assign Avalara tax exempt codes

Added the ability to assign Avalara tax exempt codes to users, through a new Tax Exempt Code field on the customer object.

Through the API, you can assign tax codes by passing the taxExemptCode field through the customerUpdate mutation.

mutation {
customerUpdate(
id: "VXNlcjo3MjI2"
input: {
taxExemptCode: "R"
}
)
{
user {
id
taxExemptCode
}
}
}

🌊 Changed

Show Error Messages on SellerDataUpdate

Updated the sellerDataUpdate mutation response to show error messages, by adding the ability to return sellerErrors in addition to the existing ok boolean success indicator.

🪲 Fixed

  • Fixed an issue that prevented exporting products as either a .csv or .xlsx file when one or more fields were selected for export.
  • Fixed an issue with sorting and pagination by attributes for the products and productVariants query.
  • Fixed an issue where taxes were not being calculated properly for quote orders when the associated marketplace order did yet not have order lines.
  • Fixed an issue with stock allocation and de-allocation for grouped products, which could cause a seller issues with fulfilling an order with grouped products.
  • Fixed an issue in master-product marketplaces, where products created by a seller user with Manage marketplace permissions were not created as master products.
  • Fixed an issue with processing checkouts with Stripe with the Store Customer Cards setting enabled.

Was this page helpful?