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

✨ New

discounts

Added the following fields to the NauticalOrderLine object, to retrieve information about discounted pricing specific to an order line:

  • sale
  • saleDiscount
  • voucherDiscount
  • discountedUnitPrice
  • originalUnitPrice
discounts

Added the currency field to the sale query.

payouts

Added the following fields to the VendorPayout model:

  • subtotal
  • total

πŸͺ² Fixed

data entry

Fixed an issue where you could not set dropdown or multi-select attributes back to an empty value after they are set to a value.

Taxes

Fixed an issue where the nauticalOrderRefreshTaxes mutation was failing due to an error with the vat_code field.

🚫 Deprecated

The enable_edit_checkout_public_metadata_by_customer configuration in the NauticalConfiguration model has been deprecated.

: Staging

: Production

✨ New

payouts

Add vendor payout to draft payout​

Added the vendorPayoutCreate mutation, to add a seller to a draft payout if they were not included when the payout was initially created.

checkout

Checkout line sale field​

Added the sale field to the checkoutLine model, which returns a matching sale for the checkout line, if applicable.

πŸͺ² Fixed

invoices

Fixed an issue where multiple invoices could be generated with the same invoice number.

webhooks

Fixed an issue where ACH payments were not triggering the Nautical Order Updated Webhook or the Nautical Order Fully Paid Webhooks when the ACH payment was captured.

🚫 Deprecated

checkout

The following MarketplaceConfiguration fields have been deprecated:

  • maxCheckoutLineQuantity
  • maxCheckoutQuantity
  • minCheckoutAmount
orders

Removed the subscription model

checkout

Removed checkoutLinePriceOverride mutation.

: Staging

: Production

πŸͺ² Fixed

Webhooks

Fixed an issue where the product_update webhook was not being triggered when products were published in bulk using the productBulkPublish mutation.

Payouts

Fixed an issue where seller admins could not query order.fees, resulting in a 404 page when opening a payout in the Dashboard.

Discounts

Fixed an issue where voucher discounts, specifically those with the "Limit one per customer" setting enabled, were not calculated correctly after a fulfillment was declined.

: Staging

: Production

✨ New

Catalog

Custom fields​

Added the ability for marketplace operators to define custom fields for various object models. The following objects support custom fields: USER, PRODUCT, VARIANT, CATEGORY, and COLLECTION.

Add attributes to custom field templates to make those attributes available for data entry on the associated object.

This feature includes the following GraphQL changes:

  • Assign an attribute to an object model’s custom field template with the customAttributeAssign mutation.
  • Query custom field templates with the customFieldTemplates query.
  • Remove attributes from a custom field template with the customAttributeUnassign mutation.
  • The following inputs have been updated to support assigning customFields when creating and updating objects:
  • ProductInput, ProductCreateInput
  • ProductVariantInput, ProductVariantCreateInput
  • UserCreateInput, CustomerInput, StaffUpdateInput
  • CategoryInput
  • CollectionInput, CollectionCreateInput

Learn more ->

Catalog

Attribute template strategy field​

Added the attributeTemplateStrategy field to the MarketplaceConfiguration model, allowing operators to customize how attributes are assigned across product attributes, variant attributes, and custom fields.

Related to this change, added the templated field, which you can query under product attributes, variant attributes, and custom fields to see if the selected attribute came from a templated assignment.

Catalog

Product type strategy field​

Added the requireProductTypes field to the MarketplaceConfiguration model, allowing operators to make product type usage optional.

Catalog

New attribute input types​

Added several new supported input types to the AttributeInputTypeEnum.

Catalog

Update product type on product​

The productUpdate mutation now accepts the productType input field, allowing you to change the product type on an existing product.

Catalog

Update parent product on variant​

The productVariantUpdate mutation now accepts the product input field, allowing you to change the parent product of a variant.

πŸͺ² Fixed

Catalog

Fixed an issue with filtering the variants list based on the isPublished field.

: Staging

: Production

πŸ’Ž Changed

Catalog

Updated the ProductVariantFilter input to support filtering variants by metadata or privateMetadata.

πŸͺ² Fixed

Catalog

Fixed an issue with the productUpdate mutation, where passing a null taxCode value did not clear the existing value.

Payouts

Fixed an issue where orders outside the payout end date were incorrectly attributed to payouts with the ledger accounting system.

Vendor mgmt

Fixed an issue where the agreementUpdate mutation required all the same inputs as agreementCreate.

: Staging

: Production

✨ New

Addresses

Country area code display for address forms​

Added the detailedAllowedCountryAreas field to the CountryDisplay model for displaying area codes in address forms. This field replaces the deprecated CountryDisplay.allowedCountryAreas field.

πŸͺ² Fixed

Discounts

Fixed an issue where non-qualifying items were incorrectly counted towards the minimum quantity requirement for voucher eligibility.

Auth

Fixed an issue where using app authentication to query productVariants sometimes triggered an 'App' object has no attribute 'is_anonymous' error.

🚫 Deprecated

Addresses

Deprecated the CountryDisplay.allowedCountryAreas field. This field will be removed after 2024-12-31.

: Staging

: Production

✨ New

Users

Last status changed at field​

Added a lastStatusChangedAt field to the User model. This field updates with the current datetime whenever there's a change in the isActive status for any user (customer or staff).

πŸͺ² Fixed

Microsites

Fixed a pagination loop issue caused by identical endCursor and startCursor values when querying microsite.products.

: Staging

: Production

✨ New

Integrations

WorkOS Authentication plugin​

Added support to connect to WorkOS authentication, an SSO tool that supports various identity providers.

The existing createCustomerToken mutation has been extended to accept WorkOS as an oauthProviderSource. You can use this mutation to exchange a WorkOS access token for a nauticalToken after activating the plugin.

Mutation
mutation {
createCustomerToken(
oauthProviderSource: WORKOS
oauthProviderToken: "[ACCESS_TOKEN]"
) {
nauticalToken
refreshToken
authErrors {
field
message
}
}
}

πŸ’Ž Changed

Payouts

NOT_PAID payout status​

Updated the OrderPayoutStatusEnum to include the NOT_PAID payout status for orders in the new financial ledgers system.

note

When using the new ledger system for payouts, only the states NOT_PAID, PAID_OUT, PARTIALLY_PAID_OUT, and ERROR will be used.

Integrations

Updated Shopify API version​

Migrated Shopify plugin instances to use the latest Shopify API version.

πŸͺ² Fixed

Webhooks

Fixed an issue where the product_updated webhook was not being triggered when an image was added to a product or variant.

Payments

Fixed an issue where successful capture of ACH payments with Stripe were not updating as paid in Nautical.

Emails

Fixed an issue where the "Partial Order Cancel" and "Pending Quote" buyer emails were stored with the Admin Email Templates.

Catalog

Fixed an issue where the productUpdate mutation required the category input even when a category was previously assigned.

: Staging

: Production

✨ New

Payouts

Financial ledgers with queryable journals​

Added a new financial modelling system, using double-entry accounting that automatically records data to a balanced ledger through various order and payout related events.

This updated model aligns with ASC 606 revenue recognition standards, providing a clear and auditable financial trail of how revenue is recognized and split between the marketplace and its sellers. Central to this feature is the MarketplaceConfiguration.revenueAccrualStrategy field, which determines how revenue is recognized in alignment with your operational needs.

Feature Enablement

For marketplaces to benefit from this new feature, a Nautical representative must enable it. Contact Nautical Support for assistance.

You can leverage the journalEntries query to view journal entries, using filters like order ID or journal entry type via JournalEntryFilterInput. Here's a sample GraphQL query and response that demonstrates how you can retrieve the first 10 journalEntries related to a marketplace order:

Request
query {
journalEntries(
filter: { nauticalOrderIds: "TmF1dGljYWxPcmRlcjoxNjU4" }
first: 10
sortBy: { direction: ASC, field: DATE }
) {
edges {
node {
id
type
description
createdAt
order {
id
}
ledgerEntries {
ledgerBalance {
baseAmount
}
ledger {
id
type
accountType
balance {
baseAmount
}
}
}
}
}
}
}
Show more ↓
Response
{
"data": {
"journalEntries": {
"edges": [
{
"node": {
"id": "Sm91cm5hbEVudHJ5OjEyNzk=",
"type": "ORDER_PLACED",
"description": "NauticalOrder TmF1dGljYWxPcmRlcjoxNjU4 placed",
"createdAt": "2024-03-12T13:28:47.755267+00:00",
"order": null,
"ledgerEntries": [
{
"ledgerBalance": {
"baseAmount": -9552473
},
"ledger": {
"id": "TGVkZ2VyOjM=",
"type": "DEFERRED_SALES_REVENUE",
"accountType": "REVENUE",
"balance": {
"baseAmount": -10014369
}
}
},
{
"ledgerBalance": {
"baseAmount": -975237
},
"ledger": {
"id": "TGVkZ2VyOjEw",
"type": "SALES_TAX",
"accountType": "LIABILITY",
"balance": {
"baseAmount": -1024184
}
}
},
{
"ledgerBalance": {
"baseAmount": -274000
},
"ledger": {
"id": "TGVkZ2VyOjI=",
"type": "DEFERRED_SHIPPING_REVENUE",
"accountType": "REVENUE",
"balance": {
"baseAmount": -314000
}
}
},
{
"ledgerBalance": {
"baseAmount": 8681638
},
"ledger": {
"id": "TGVkZ2VyOjE1OQ==",
"type": "CUSTOMER_RECEIVABLE",
"accountType": "ASSET",
"balance": {
"baseAmount": 8617168
}
}
}
]
}
},
{
"node": {
"id": "Sm91cm5hbEVudHJ5OjEyODA=",
"type": "PAYMENT_CAPTURED",
"description": "Payment UGF5bWVudDoxMjkx captured",
"createdAt": "2024-03-12T13:29:05.541593+00:00",
"order": null,
"ledgerEntries": [
{
"ledgerBalance": {
"baseAmount": 10050882
},
"ledger": {
"id": "TGVkZ2VyOjU=",
"type": "FUNDS_PAYMENTS",
"accountType": "ASSET",
"balance": {
"baseAmount": 10183826
}
}
},
{
"ledgerBalance": {
"baseAmount": 8362918
},
"ledger": {
"id": "TGVkZ2VyOjE1OQ==",
"type": "CUSTOMER_RECEIVABLE",
"accountType": "ASSET",
"balance": {
"baseAmount": 8617168
}
}
}
]
}
},
{
"node": {
"id": "Sm91cm5hbEVudHJ5OjEyODE=",
"type": "ORDER_ACCRUED",
"description": "OrderLine T3JkZXJMaW5lOjU2MTQ= accrued",
"createdAt": "2024-03-12T13:29:15.517609+00:00",
"order": {
"id": "T3JkZXI6Mjg5NQ=="
},
"ledgerEntries": [
{
"ledgerBalance": {
"baseAmount": -9531073
},
"ledger": {
"id": "TGVkZ2VyOjM=",
"type": "DEFERRED_SALES_REVENUE",
"accountType": "REVENUE",
"balance": {
"baseAmount": -10014369
}
}
},
{
"ledgerBalance": {
"baseAmount": 124120
},
"ledger": {
"id": "TGVkZ2VyOjY0",
"type": "SELLER_PAYABLE",
"accountType": "LIABILITY",
"balance": {
"baseAmount": 181900
}
}
}
]
}
},
{
"node": {
"id": "Sm91cm5hbEVudHJ5OjEyODI=",
"type": "COMMISSION",
"description": "OrderLine T3JkZXJMaW5lOjU2MTQ= commission",
"createdAt": "2024-03-12T13:29:15.517719+00:00",
"order": {
"id": "T3JkZXI6Mjg5NQ=="
},
"ledgerEntries": [
{
"ledgerBalance": {
"baseAmount": 127330
},
"ledger": {
"id": "TGVkZ2VyOjY0",
"type": "SELLER_PAYABLE",
"accountType": "LIABILITY",
"balance": {
"baseAmount": 181900
}
}
},
{
"ledgerBalance": {
"baseAmount": -2939495
},
"ledger": {
"id": "TGVkZ2VyOjc=",
"type": "MARKETPLACE_COMMISSION",
"accountType": "REVENUE",
"balance": {
"baseAmount": -2997415
}
}
}
]
}
},
{
"node": {
"id": "Sm91cm5hbEVudHJ5OjEyODM=",
"type": "SHIPPING_ACCRUED",
"description": "Order T3JkZXI6Mjg5NQ== shipping accrued",
"createdAt": "2024-03-12T13:29:15.517770+00:00",
"order": {
"id": "T3JkZXI6Mjg5NQ=="
},
"ledgerEntries": [
{
"ledgerBalance": {
"baseAmount": -272000
},
"ledger": {
"id": "TGVkZ2VyOjI=",
"type": "DEFERRED_SHIPPING_REVENUE",
"accountType": "REVENUE",
"balance": {
"baseAmount": -314000
}
}
},
{
"ledgerBalance": {
"baseAmount": -541850
},
"ledger": {
"id": "TGVkZ2VyOjk=",
"type": "MARKETPLACE_FEES",
"accountType": "REVENUE",
"balance": {
"baseAmount": -536950
}
}
}
]
}
},
{
"node": {
"id": "Sm91cm5hbEVudHJ5OjEyODQ=",
"type": "ORDER_ACCRUED",
"description": "OrderLine T3JkZXJMaW5lOjU2MTU= accrued",
"createdAt": "2024-03-12T13:29:15.691871+00:00",
"order": {
"id": "T3JkZXI6Mjg5Ng=="
},
"ledgerEntries": [
{
"ledgerBalance": {
"baseAmount": -9256073
},
"ledger": {
"id": "TGVkZ2VyOjM=",
"type": "DEFERRED_SALES_REVENUE",
"accountType": "REVENUE",
"balance": {
"baseAmount": -10014369
}
}
},
{
"ledgerBalance": {
"baseAmount": 978750
},
"ledger": {
"id": "TGVkZ2VyOjY1",
"type": "SELLER_PAYABLE",
"accountType": "LIABILITY",
"balance": {
"baseAmount": 1572500
}
}
}
]
}
},
{
"node": {
"id": "Sm91cm5hbEVudHJ5OjEyODU=",
"type": "COMMISSION",
"description": "OrderLine T3JkZXJMaW5lOjU2MTU= commission",
"createdAt": "2024-03-12T13:29:15.692001+00:00",
"order": {
"id": "T3JkZXI6Mjg5Ng=="
},
"ledgerEntries": [
{
"ledgerBalance": {
"baseAmount": 1020000
},
"ledger": {
"id": "TGVkZ2VyOjY1",
"type": "SELLER_PAYABLE",
"accountType": "LIABILITY",
"balance": {
"baseAmount": 1572500
}
}
},
{
"ledgerBalance": {
"baseAmount": -2980745
},
"ledger": {
"id": "TGVkZ2VyOjc=",
"type": "MARKETPLACE_COMMISSION",
"accountType": "REVENUE",
"balance": {
"baseAmount": -2997415
}
}
}
]
}
},
{
"node": {
"id": "Sm91cm5hbEVudHJ5OjEyODY=",
"type": "SHIPPING_ACCRUED",
"description": "Order T3JkZXI6Mjg5Ng== shipping accrued",
"createdAt": "2024-03-12T13:29:15.692050+00:00",
"order": {
"id": "T3JkZXI6Mjg5Ng=="
},
"ledgerEntries": [
{
"ledgerBalance": {
"baseAmount": -266500
},
"ledger": {
"id": "TGVkZ2VyOjI=",
"type": "DEFERRED_SHIPPING_REVENUE",
"accountType": "REVENUE",
"balance": {
"baseAmount": -314000
}
}
},
{
"ledgerBalance": {
"baseAmount": -547350
},
"ledger": {
"id": "TGVkZ2VyOjk=",
"type": "MARKETPLACE_FEES",
"accountType": "REVENUE",
"balance": {
"baseAmount": -536950
}
}
}
]
}
}
]
}
}
}
Show more ↓

Learn more ->

πŸ’Ž Changed

Webhooks

Voucher data in order webhooks​

The voucher field is now part of all order and nauticalOrder webhook payloads, providing the following voucher data: id, name, type, discountValue, and discountValueType.

Emails

Order line metadata in email payloads​

Non-private metadata for orderLines and nauticalOrderLines will now be included in all order-related email payloads. Update your email templates to make use of order line metadata.

πŸͺ² Fixed

Discounts

Fixed an issue where vouchers created with the option "Specific products" selected caused items to be discounted automatically without entering the voucher code.

: Staging

: Production

✨ New

Catalog

Visibility field for collections​

Added the isVisible boolean field to the collection object.

Vendor mgmt

New seller statuses​

Added the following statuses to the SellerStatus enum:

  • SUSPENDED
  • BANNED
  • DEACTIVATED

πŸ’Ž Changed

Orders

Customer order count​

Changed customer.numOrders to resolve the total number of marketplace orders instead of seller orders.

πŸͺ² Fixed

Emails

Fixed an issue preventing the order refund confirmation and CSV export emails from sending.

Integrations

Fixed an issue with Stripe webhook processing to handle webhook errors appropriately.

Was this page helpful?