Skip to main content

Changelog

Traide Changelog

We regularly update our product and API while providing 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

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

Products

Marketplace timezone support for product publishing

Product and variant publishing dates now respect the marketplace's configured timezone, ensuring products go live at the correct local time for your customers.

Customer mgmt

User status change tracking

Added tracking for when user accounts are activated or deactivated, making it easier to monitor account status changes and audit user management activities.

🪲 Fixed

Products

Fixed an issue where pagination in microsite product queries could get stuck in a loop due to identical cursor values.

Products

Fixed errors that could occur when querying products that don't have an associated product type.

Integrations

Fixed authentication app category assignment for Firebase and WorkOS integrations, ensuring proper categorization in the authentication system.

: 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

Orders

New order payout status

Introduced a new NOT_PAID payout status for orders, providing clearer tracking of orders that haven't yet been included in seller payouts.

Customer mgmt

WorkOS authentication support

Added WorkOS as an authentication option when creating customer tokens, enabling single sign-on (SSO) capabilities for customer accounts.

Products

Update product types

Product types can now be updated after creation, allowing you to reorganize your catalog structure without recreating products.

Attributes

Custom attribute filtering

Added support for custom attribute filters on products, giving you more flexibility in how customers browse and search your catalog.

🪲 Fixed

Orders

Fixed an issue where refunds weren't being included when calculating the available payout balance for orders.

Orders

Fixed an issue where declined fulfillments were incorrectly triggering shipping cost accruals.

Orders

Fixed an issue where other sellers could inadvertently access marketplace orders using the nauticalOrderByToken query.

Payments

Fixed an issue where Stripe webhook events weren't being properly recreated during webhook processing, which could cause payment status updates to fail.

Payments

Fixed an issue where Stripe webhook handlers weren't running within database transactions, which could lead to data inconsistencies during payment processing.

Customer mgmt

Fixed an issue where buyer ledgers weren't being created automatically during account creation.

Orders

Fixed an issue where foreign exchange amounts weren't properly accounting for declined and cancelled orders.

Payments

Fixed an issue where payment captures were being recorded in ledgers even when webhook-created transactions didn't exist.

Webhooks

Fixed an issue where product update webhooks weren't being triggered consistently when products or variants were modified.

Products

Fixed an issue that prevented publishing products that already had a category assigned.

Orders

Fixed an issue where seller orders without ledger entries would cause errors when calculating balances.

Shopify

Added migration to manually increment Shopify API versions, ensuring compatibility with the latest Shopify platform updates.

Orders

Fixed an issue where orders were being incorrectly marked as partially paid when payments were unaccrued.

Emails

Moved partial order cancellation and pending quote email templates to the user emails section for better organization.

Orders

Fixed an issue where the payoutStatus field on orders showed incorrect values when payouts remained in draft status for extended periods.

Products

Fixed an issue with product resolution that could cause incorrect data to be returned in certain query scenarios.

: Staging

: Production

💎 Changed

Maintenance

This release contains internal improvements and maintenance updates.

: Staging

: Production

✨ New

Products

Update product variant associations

Product variants can now be reassigned to different parent products, providing greater flexibility in managing product catalogs and variant structures.

🪲 Fixed

Orders

Fixed an issue where multiple invoices could be created with duplicate invoice numbers for the same order.

Orders

Fixed an issue where filtering products by date could return incorrect results in certain scenarios.

🪲 Fixed

Payouts

Fixed several issues related to payout processing:

  • Empty payouts can no longer be created in the payout flow.
  • Locked payouts now properly prevent multiple concurrent payout operations.
  • Payout validation messages are now clearer and more informative.
  • Order line refunds are now correctly reflected in the payout summary.
  • Shipping fees are now properly handled when fulfillments are cancelled.
  • Fee reversals on order cancellation now only apply to fees that were actually accrued.

: Staging

: Production

✨ New

Webhooks

Voucher information in order webhooks

Added voucher details to webhook payloads for NauticalOrder and Order events, making it easier to track discount usage in external systems.

🪲 Fixed

Emails

Fixed an issue where order line metadata was not being included in email templates, ensuring all custom line-level data is now available for email personalization.

Payouts

Fixed an issue where refund amounts were incorrectly included in the VendorPayout.payout_amount calculation, ensuring accurate payout totals for sellers.

: 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

Orders

Order payouts summary

Added a new payoutsSummary field on the Order object, providing a quick overview of payout status and amounts for marketplace orders.

Orders

Refund ledger tracking

Refunds are now automatically recorded in financial ledgers, providing better accounting and auditability for order refunds across sellers.

✨ New

Attributes

Custom field templates

Introduced custom field templates for product attributes, allowing you to define reusable attribute configurations and apply them consistently across your catalog.

Attributes

Date attribute values

Attribute values can now be resolved as dates, enabling more flexible product data modeling for time-based attributes.

✨ New

API

Ledger data backfill

Added a mutation to backfill historical ledger data, helping ensure financial records are complete for existing orders and refunds.

💎 Changed

Products

Product type input simplification

When creating products, the productType ID is now specified directly in the ProductInput rather than nested in ProductCreateInput, simplifying the mutation structure.

🪲 Fixed

Orders

Fixed an issue where cancelled refunds could be double-counted in order totals.

Orders

Fixed an issue where refunding cancelled orders would incorrectly adjust sales tax calculations.

Orders

Fixed an issue where refunding discounted orders that were later cancelled could result in incorrect ledger entries.

🪲 Fixed

Discounts

Fixed an issue where applying voucher codes could use invalid vouchers with the same code instead of the active one.

🪲 Fixed

Products

Fixed an issue where the is_visible field could not be updated via mutation.

🪲 Fixed

API

Fixed an issue where the JournalEntry.refund relationship was not accessible via the API.

Was this page helpful?