Skip to content

Search is only available in production builds. Try building and previewing the site to test it out locally.

Quote Management Data & Events

The Quote Management drop-in uses the event bus to emit and listen to events for communication between drop-ins and external integrations.

Version: 1.0.0

Events reference

EventDirectionDescription
quote-management/file-upload-errorEmitsEmitted when uploadFile() fails to upload or finalize a file attachment.
quote-management/line-item-note-setEmitsEmitted after setLineItemNote() updates a line item note for a negotiable quote.
quote-management/negotiable-quote-delete-errorEmitsEmitted when deleteQuote() fails to delete one or more negotiable quotes.
quote-management/negotiable-quote-deletedEmitsEmitted after deleteQuote() deletes one or more negotiable quotes.
quote-management/negotiable-quote-requestedEmitsEmitted after requestNegotiableQuote() creates a negotiable quote from a cart.
quote-management/quote-data/errorEmitsEmitted when Quote Management fails to load negotiable quote data during initialization.
quote-management/quote-data/initializedEmitsEmitted the first time Quote Management successfully loads negotiable quote data during initialization.
quote-management/quote-template-data/errorEmitsEmitted when Quote Management fails to load quote template data during initialization.
quote-management/quote-template-deletedEmitsEmitted after deleteQuoteTemplate() deletes a quote template.
quote-management/quote-template-generatedEmitsEmitted after generateQuoteFromTemplate() creates a new negotiable quote from a template.
quote-management/quote-templates-dataEmitsEmitted after getQuoteTemplates() loads the quote templates list.
auth/permissionsListensFired by Auth (auth) when Adobe Commerce permissions are updated.
checkout/updatedListensFired by Checkout (checkout) when the component state is updated. Quote Management uses it to reload quote data when the checkout type is quote.
quote-management/initializedEmits and listensEmitted when the Quote Management initializer finishes loading store configuration.
quote-management/negotiable-quote-close-errorEmits and listensEmitted when closeNegotiableQuote() fails to close one or more negotiable quotes.
quote-management/negotiable-quote-closedEmits and listensEmitted after closeNegotiableQuote() closes one or more negotiable quotes.
quote-management/permissionsEmits and listensEmitted when the permissions state for Quote Management changes (for example, after auth/permissions is processed or on logout).
quote-management/quantities-updatedEmits and listensEmitted after updateQuantities() updates item quantities in a negotiable quote.
quote-management/quote-dataEmits and listensEmitted when negotiable quote data is loaded or updated.
quote-management/quote-duplicatedEmits and listensEmitted after duplicateQuote() creates a copy of a negotiable quote.
quote-management/quote-items-removedEmits and listensEmitted after removeNegotiableQuoteItems() removes one or more items from a negotiable quote.
quote-management/quote-renamedEmits and listensEmitted after renameNegotiableQuote() updates the name (and optional comment) of a negotiable quote.
quote-management/quote-sent-for-reviewEmits and listensEmitted after sendForReview() submits a negotiable quote for merchant review.
quote-management/quote-template-dataEmits and listensEmitted when quote template data is loaded or updated.
quote-management/shipping-address-setEmits and listensEmitted after setShippingAddress() updates the shipping address for a negotiable quote.

Event details

The following sections provide detailed information about each event, including its direction, event payload, and usage examples.

auth/permissions (listens)

Fired by Auth (auth) when Adobe Commerce permissions are updated.

Event payload

AuthPermissionsPayload

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('auth/permissions', (payload) => {
console.log('auth/permissions event received:', payload);
});

checkout/updated (listens)

Fired by Checkout (checkout) when the component state is updated. Quote Management uses it to reload quote data when the checkout type is quote.

Event payload

Cart | NegotiableQuote | null

See Cart, NegotiableQuote for full type definitions.

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('checkout/updated', (payload) => {
console.log('checkout/updated event received:', payload);
});

quote-management/file-upload-error (emits)

Emitted when uploadFile() fails to upload or finalize a file attachment.

Event payload

{
error: string;
fileName?: string;
}

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/file-upload-error', (payload) => {
console.log('quote-management/file-upload-error event received:', payload);
});

quote-management/initialized (emits and listens)

Emitted when the Quote Management initializer finishes loading store configuration.

Event payload

{
config: StoreConfigModel;
}

See StoreConfigModel for full type definition.

When triggered

  • After initialize() function completes
  • On drop-in first load

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/initialized', ({ config }) => {
console.log('Quote Management ready', config);
// Example: use the store config values that Quote Management loads.
// console.log(config.quoteMinimumAmount, config.quoteMinimumAmountMessage);
});

quote-management/line-item-note-set (emits)

Emitted after setLineItemNote() updates a line item note for a negotiable quote.

Event payload

{
quote: NegotiableQuoteModel;
input: {
quoteUid: string;
itemUid: string;
note: string;
quantity?: number;
}
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After calling setLineItemNote()
  • When merchant or buyer adds/updates item notes

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/line-item-note-set', ({ input, quote }) => {
console.log(`Note set on item ${input.itemUid}:`, input.note);
console.log('Updated quote:', quote);
});

quote-management/negotiable-quote-close-error (emits and listens)

Emitted when closeNegotiableQuote() fails to close one or more negotiable quotes.

Event payload

{
error: Error;
attemptedQuoteUids: string[];
}

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/negotiable-quote-close-error', (payload) => {
console.log('quote-management/negotiable-quote-close-error event received:', payload);
});

quote-management/negotiable-quote-closed (emits and listens)

Emitted after closeNegotiableQuote() closes one or more negotiable quotes.

Event payload

{
closedQuoteUids: string[];
resultStatus: string;
}

When triggered

  • After calling closeNegotiableQuote()
  • When quote reaches final state

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/negotiable-quote-closed', ({ closedQuoteUids, resultStatus }) => {
console.log('Quotes closed:', closedQuoteUids, 'status:', resultStatus);
});

quote-management/negotiable-quote-delete-error (emits)

Emitted when deleteQuote() fails to delete one or more negotiable quotes.

Event payload

{
error: Error;
attemptedQuoteUids: string[];
}

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/negotiable-quote-delete-error', (payload) => {
console.log('quote-management/negotiable-quote-delete-error event received:', payload);
});

quote-management/negotiable-quote-deleted (emits)

Emitted after deleteQuote() deletes one or more negotiable quotes.

Event payload

{
deletedQuoteUids: string[];
resultStatus: string;
}

When triggered

  • After calling deleteQuote()
  • After successful quote deletion

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/negotiable-quote-deleted', ({ deletedQuoteUids, resultStatus }) => {
console.log('Quotes deleted:', deletedQuoteUids, 'status:', resultStatus);
});

quote-management/negotiable-quote-requested (emits)

Emitted after requestNegotiableQuote() creates a negotiable quote from a cart.

Event payload

{
quote: NegotiableQuoteModel | null;
input: {
cartId: string;
quoteName: string;
comment?: string;
attachments?: { key: string }[];
isDraft?: boolean;
}
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After calling requestNegotiableQuote()
  • When buyer submits quote request

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/negotiable-quote-requested', ({ quote, input }) => {
console.log('Quote requested:', { quoteUid: quote?.uid, quoteName: input.quoteName, cartId: input.cartId });
});

quote-management/permissions (emits and listens)

Emitted when the permissions state for Quote Management changes (for example, after auth/permissions is processed or on logout).

Event payload

typeof state.permissions

When triggered

  • After permission changes
  • On user role updates
  • After company context switches

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/permissions', (permissions) => {
console.log('Quote Management permissions updated:', permissions);
});

quote-management/quantities-updated (emits and listens)

Emitted after updateQuantities() updates item quantities in a negotiable quote.

Event payload

{
quote: NegotiableQuoteModel;
input: {
quoteUid: string;
items: Array<{ quoteItemUid: string; quantity: number }>;
}
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After calling updateQuantities()
  • When buyer or merchant updates quantities

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quantities-updated', ({ quote, input }) => {
console.log('Quantities updated:', { quoteUid: quote.uid, items: input.items });
});

quote-management/quote-data (emits and listens)

Emitted when negotiable quote data is loaded or updated.

Event payload

{
quote: NegotiableQuoteModel;
permissions: typeof state.permissions;
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After loading quote details
  • After any quote modification
  • After status changes

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-data', ({ quote, permissions }) => {
console.log('Quote data updated:', { quoteUid: quote.uid, permissions });
});

quote-management/quote-data/error (emits)

Emitted when Quote Management fails to load negotiable quote data during initialization.

Event payload

{
error: Error;
}

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-data/error', (payload) => {
console.log('quote-management/quote-data/error event received:', payload);
});

quote-management/quote-data/initialized (emits)

Emitted the first time Quote Management successfully loads negotiable quote data during initialization.

Event payload

{
quote: NegotiableQuoteModel;
permissions: typeof state.permissions;
}

See NegotiableQuoteModel for full type definition.

When triggered

  • On first load of quote details
  • After quote context is established

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-data/initialized', ({ quote, permissions }) => {
console.log('Quote data initialized:', { quoteUid: quote.uid, permissions });
});

quote-management/quote-duplicated (emits and listens)

Emitted after duplicateQuote() creates a copy of a negotiable quote.

Event payload

{
quote: NegotiableQuoteModel;
input: {
quoteUid: string;
duplicatedQuoteUid: string;
}
hasOutOfStockItems?: boolean;
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After calling duplicateQuote()
  • When creating copy of existing quote

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-duplicated', ({ quote, input, hasOutOfStockItems }) => {
console.log('Quote duplicated:', {
newQuoteUid: quote.uid,
originalQuoteUid: input.quoteUid,
duplicatedQuoteUid: input.duplicatedQuoteUid,
hasOutOfStockItems,
});
});

quote-management/quote-items-removed (emits and listens)

Emitted after removeNegotiableQuoteItems() removes one or more items from a negotiable quote.

Event payload

{
quote: NegotiableQuoteModel;
removedItemUids: string[];
input: RemoveNegotiableQuoteItemsInput;
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After calling removeNegotiableQuoteItems()
  • When items are deleted from quote

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-items-removed', ({ quote, removedItemUids }) => {
console.log('Quote items removed:', { quoteUid: quote.uid, removedItemUids });
});

quote-management/quote-renamed (emits and listens)

Emitted after renameNegotiableQuote() updates the name (and optional comment) of a negotiable quote.

Event payload

{
quote: NegotiableQuoteModel;
input: {
quoteUid: string;
quoteName: string;
quoteComment?: string;
}
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After calling renameNegotiableQuote()
  • When quote name is updated

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-renamed', ({ quote, input }) => {
console.log('Quote renamed:', { quoteUid: quote.uid, quoteName: input.quoteName, quoteComment: input.quoteComment });
});

quote-management/quote-sent-for-review (emits and listens)

Emitted after sendForReview() submits a negotiable quote for merchant review.

Event payload

{
quote: NegotiableQuoteModel;
input: {
quoteUid: string;
comment?: string;
attachments?: { key: string }[];
}
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After calling sendForReview()
  • When buyer submits quote for negotiation

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-sent-for-review', ({ quote, input }) => {
console.log('Quote sent for review:', { quoteUid: quote.uid, input });
});

quote-management/quote-template-data (emits and listens)

Emitted when quote template data is loaded or updated.

Event payload

{
quoteTemplate: NegotiableQuoteTemplateModel;
permissions: typeof state.permissions;
}

See NegotiableQuoteTemplateModel for full type definition.

When triggered

  • After loading template details
  • After template modifications
  • After template status changes

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-template-data', ({ quoteTemplate, permissions }) => {
console.log('Template data updated:', { templateUid: quoteTemplate.uid, permissions });
});

quote-management/quote-template-data/error (emits)

Emitted when Quote Management fails to load quote template data during initialization.

Event payload

{
error: Error;
}

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-template-data/error', (payload) => {
console.log('quote-management/quote-template-data/error event received:', payload);
});

quote-management/quote-template-deleted (emits)

Emitted after deleteQuoteTemplate() deletes a quote template.

Event payload

{
templateId: string;
}

When triggered

  • After calling deleteQuoteTemplate()
  • After successful template deletion

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-template-deleted', ({ templateId }) => {
console.log('Quote template deleted:', templateId);
});

quote-management/quote-template-generated (emits)

Emitted after generateQuoteFromTemplate() creates a new negotiable quote from a template.

Event payload

{
quoteId: string;
}

When triggered

  • After calling generateQuoteFromTemplate()
  • When creating quote from template

Example

import { events } from '@dropins/tools/event-bus.js';
const listener = events.on('quote-management/quote-template-generated', ({ quoteId }) => {
console.log('Quote generated from template:', quoteId);
});
// Later, to clean up:
// listener.off();

Usage scenarios

  • One-click quote generation from commonly used templates.
  • Streamline repeat ordering workflows for regular customers.
  • Implement recurring order systems based on templates.
  • Quick quote creation for standard product bundles.
  • Template-based ordering for seasonal or periodic purchases.
  • Automated quote generation for subscription-like B2B orders.

quote-management/quote-templates-data (emits)

Emitted after getQuoteTemplates() loads the quote templates list.

Event payload

{
quoteTemplates: NegotiableQuoteTemplatesListModel;
permissions: typeof state.permissions;
}

See NegotiableQuoteTemplatesListModel for full type definition.

When triggered

  • After loading templates list
  • After template creation/deletion
  • After template status changes

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/quote-templates-data', ({ quoteTemplates }) => {
console.log(`${quoteTemplates.totalCount} templates loaded`);
});

quote-management/shipping-address-set (emits and listens)

Emitted after setShippingAddress() updates the shipping address for a negotiable quote.

Event payload

{
quote: NegotiableQuoteModel;
input: {
quoteUid: string;
addressId?: number;
addressData?: AddressInput;
}
}

See NegotiableQuoteModel for full type definition.

When triggered

  • After calling setShippingAddress()
  • When shipping address is updated

Example

import { events } from '@dropins/tools/event-bus.js';
events.on('quote-management/shipping-address-set', ({ quote, input }) => {
console.log('Shipping address set:', { quoteUid: quote.uid, input });
});

Listening to events

All Quote Management events are emitted through the centralized event bus:

import { events } from '@dropins/tools/event-bus.js';
// Listen to quote lifecycle events
events.on('quote-management/negotiable-quote-requested', handleQuoteRequest);
events.on('quote-management/quote-sent-for-review', handleQuoteReview);
events.on('quote-management/quote-duplicated', handleQuoteDuplicate);
// Listen to quote data changes
events.on('quote-management/quote-data', handleQuoteUpdate);
events.on('quote-management/quantities-updated', handleQuantityChange);
// Listen to template events
events.on('quote-management/quote-template-generated', handleTemplateGeneration);
events.on('quote-management/quote-templates-data', handleTemplatesLoad);
// Clean up listeners
events.off('quote-management/quote-data', handleQuoteUpdate);

Event flow examples

Data Models

The following data models are used in event payloads for this drop-in.

NegotiableQuoteModel

Used in: quote-management/line-item-note-set, quote-management/negotiable-quote-requested, quote-management/quantities-updated, quote-management/quote-data, quote-management/quote-data/initialized, quote-management/quote-duplicated, quote-management/quote-items-removed, quote-management/quote-renamed, quote-management/quote-sent-for-review, quote-management/shipping-address-set.

interface NegotiableQuoteModel {
uid: string;
name: string;
createdAt: string;
salesRepName: string;
expirationDate: string;
updatedAt: string;
status: NegotiableQuoteStatus;
isVirtual: boolean;
buyer: {
firstname: string;
lastname: string;
};
templateName?: string;
totalQuantity: number;
comments?: {
uid: string;
createdAt: string;
author: {
firstname: string;
lastname: string;
};
text: string;
attachments?: {
name: string;
url: string;
}[];
}[];
history?: NegotiableQuoteHistoryEntry[];
prices: {
appliedDiscounts?: Discount[];
appliedTaxes?: Tax[];
discount?: Currency;
grandTotal?: Currency;
grandTotalExcludingTax?: Currency;
shippingExcludingTax?: Currency;
shippingIncludingTax?: Currency;
subtotalExcludingTax?: Currency;
subtotalIncludingTax?: Currency;
subtotalWithDiscountExcludingTax?: Currency;
totalTax?: Currency;
};
items: CartItemModel[];
shippingAddresses?: ShippingAddress[];
canCheckout: boolean;
canSendForReview: boolean;
lockedForEditing?: boolean;
canDelete: boolean;
canClose: boolean;
canUpdateQuote: boolean;
readOnly: boolean;
}

NegotiableQuoteTemplateModel

Used in: quote-management/quote-template-data.

interface NegotiableQuoteTemplateModel {
id: string;
uid: string;
name: string;
createdAt: string;
updatedAt: string;
expirationDate?: string;
status: NegotiableQuoteTemplateStatus;
salesRepName: string;
buyer: {
firstname: string;
lastname: string;
};
comments?: QuoteTemplateComment[];
history?: NegotiableQuoteHistoryEntry[];
prices: {
subtotalExcludingTax?: Currency;
subtotalIncludingTax?: Currency;
subtotalWithDiscountExcludingTax?: Currency;
grandTotal?: Currency;
appliedTaxes?: {
amount: Currency;
label: string;
}[];
};
items: CartItemModel[];
shippingAddresses?: ShippingAddress[];
referenceDocuments?: {
uid: string;
name: string;
identifier?: string;
url: string;
}[];
// Template-specific fields
quantityThresholds?: {
min?: number;
max?: number;
};
canAccept: boolean;
canDelete: boolean;
canReopen: boolean;
canCancel: boolean;
canSendForReview: boolean;
canGenerateQuoteFromTemplate: boolean;
canEditTemplateItems: boolean;
}

NegotiableQuoteTemplatesListModel

Used in: quote-management/quote-templates-data.

interface NegotiableQuoteTemplatesListModel {
items: NegotiableQuoteTemplateListEntry[];
pageInfo: {
currentPage: number;
pageSize: number;
totalPages: number;
};
totalCount: number;
paginationInfo?: PaginationInfo;
sortFields?: {
default: string;
options: Array<{
label: string;
value: string;
}>;
};
}

StoreConfigModel

Used in: quote-management/initialized.

interface StoreConfigModel {
quoteSummaryDisplayTotal: number;
quoteSummaryMaxItems: number;
quoteDisplaySettings: {
zeroTax: boolean;
subtotal: QuoteDisplayAmount;
price: QuoteDisplayAmount;
shipping: QuoteDisplayAmount;
fullSummary: boolean;
grandTotal: boolean;
};
useConfigurableParentThumbnail: boolean;
quoteMinimumAmount: number | null;
quoteMinimumAmountMessage: string | null;
}