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
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.

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

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

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

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

Cart | NegotiableQuote | null

See Cart, NegotiableQuote for full type definitions.

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)

Section titled “quote-management/file-upload-error (emits)”

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

{
error: string;
fileName?: string;
}
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)

Section titled “quote-management/initialized (emits and listens)”

Emitted when the Quote Management initializer finishes loading store configuration.

{
config: StoreConfigModel;
}

See StoreConfigModel for full type definition.

  • After initialize() function completes
  • On drop-in first load
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)

Section titled “quote-management/line-item-note-set (emits)”

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

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

See NegotiableQuoteModel for full type definition.

  • After calling setLineItemNote()
  • When merchant or buyer adds/updates item notes
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)

Section titled “quote-management/negotiable-quote-close-error (emits and listens)”

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

{
error: Error;
attemptedQuoteUids: string[];
}
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)

Section titled “quote-management/negotiable-quote-closed (emits and listens)”

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

{
closedQuoteUids: string[];
resultStatus: string;
}
  • After calling closeNegotiableQuote()
  • When quote reaches final state
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)

Section titled “quote-management/negotiable-quote-delete-error (emits)”

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

{
error: Error;
attemptedQuoteUids: string[];
}
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)

Section titled “quote-management/negotiable-quote-deleted (emits)”

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

{
deletedQuoteUids: string[];
resultStatus: string;
}
  • After calling deleteQuote()
  • After successful quote deletion
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)

Section titled “quote-management/negotiable-quote-requested (emits)”

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

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

See NegotiableQuoteModel for full type definition.

  • After calling requestNegotiableQuote()
  • When buyer submits quote request
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)

Section titled “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).

typeof state.permissions
  • After permission changes
  • On user role updates
  • After company context switches
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)

Section titled “quote-management/quantities-updated (emits and listens)”

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

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

See NegotiableQuoteModel for full type definition.

  • After calling updateQuantities()
  • When buyer or merchant updates quantities
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)

Section titled “quote-management/quote-data (emits and listens)”

Emitted when negotiable quote data is loaded or updated.

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

See NegotiableQuoteModel for full type definition.

  • After loading quote details
  • After any quote modification
  • After status changes
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 });
});

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

{
error: Error;
}
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)

Section titled “quote-management/quote-data/initialized (emits)”

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

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

See NegotiableQuoteModel for full type definition.

  • On first load of quote details
  • After quote context is established
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)

Section titled “quote-management/quote-duplicated (emits and listens)”

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

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

See NegotiableQuoteModel for full type definition.

  • After calling duplicateQuote()
  • When creating copy of existing quote
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)

Section titled “quote-management/quote-items-removed (emits and listens)”

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

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

See NegotiableQuoteModel for full type definition.

  • After calling removeNegotiableQuoteItems()
  • When items are deleted from quote
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)

Section titled “quote-management/quote-renamed (emits and listens)”

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

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

See NegotiableQuoteModel for full type definition.

  • After calling renameNegotiableQuote()
  • When quote name is updated
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)

Section titled “quote-management/quote-sent-for-review (emits and listens)”

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

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

See NegotiableQuoteModel for full type definition.

  • After calling sendForReview()
  • When buyer submits quote for negotiation
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)

Section titled “quote-management/quote-template-data (emits and listens)”

Emitted when quote template data is loaded or updated.

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

See NegotiableQuoteTemplateModel for full type definition.

  • After loading template details
  • After template modifications
  • After template status changes
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)

Section titled “quote-management/quote-template-data/error (emits)”

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

{
error: Error;
}
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)

Section titled “quote-management/quote-template-deleted (emits)”

Emitted after deleteQuoteTemplate() deletes a quote template.

{
templateId: string;
}
  • After calling deleteQuoteTemplate()
  • After successful template deletion
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)

Section titled “quote-management/quote-template-generated (emits)”

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

{
quoteId: string;
}
  • After calling generateQuoteFromTemplate()
  • When creating quote from template
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();
  • 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)

Section titled “quote-management/quote-templates-data (emits)”

Emitted after getQuoteTemplates() loads the quote templates list.

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

See NegotiableQuoteTemplatesListModel for full type definition.

  • After loading templates list
  • After template creation/deletion
  • After template status changes
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)

Section titled “quote-management/shipping-address-set (emits and listens)”

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

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

See NegotiableQuoteModel for full type definition.

  • After calling setShippingAddress()
  • When shipping address is updated
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 });
});

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);

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

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;
}

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;
}

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;
}>;
};
}

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;
}