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.
Events reference
Section titled “Events reference”| Event | Direction | Description |
|---|---|---|
| quote-management/file-upload-error | Emits | Emitted when uploadFile() fails to upload or finalize a file attachment. |
| quote-management/line-item-note-set | Emits | Emitted after setLineItemNote() updates a line item note for a negotiable quote. |
| quote-management/negotiable-quote-delete-error | Emits | Emitted when deleteQuote() fails to delete one or more negotiable quotes. |
| quote-management/negotiable-quote-deleted | Emits | Emitted after deleteQuote() deletes one or more negotiable quotes. |
| quote-management/negotiable-quote-requested | Emits | Emitted after requestNegotiableQuote() creates a negotiable quote from a cart. |
| quote-management/quote-data/error | Emits | Emitted when Quote Management fails to load negotiable quote data during initialization. |
| quote-management/quote-data/initialized | Emits | Emitted the first time Quote Management successfully loads negotiable quote data during initialization. |
| quote-management/quote-template-data/error | Emits | Emitted when Quote Management fails to load quote template data during initialization. |
| quote-management/quote-template-deleted | Emits | Emitted after deleteQuoteTemplate() deletes a quote template. |
| quote-management/quote-template-generated | Emits | Emitted after generateQuoteFromTemplate() creates a new negotiable quote from a template. |
| quote-management/quote-templates-data | Emits | Emitted after getQuoteTemplates() loads the quote templates list. |
| auth/permissions | Listens | Fired by Auth (auth) when Adobe Commerce permissions are updated. |
| 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. |
| quote-management/initialized | Emits and listens | Emitted when the Quote Management initializer finishes loading store configuration. |
| quote-management/negotiable-quote-close-error | Emits and listens | Emitted when closeNegotiableQuote() fails to close one or more negotiable quotes. |
| quote-management/negotiable-quote-closed | Emits and listens | Emitted after closeNegotiableQuote() closes one or more negotiable quotes. |
| 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). |
| quote-management/quantities-updated | Emits and listens | Emitted after updateQuantities() updates item quantities in a negotiable quote. |
| quote-management/quote-data | Emits and listens | Emitted when negotiable quote data is loaded or updated. |
| quote-management/quote-duplicated | Emits and listens | Emitted after duplicateQuote() creates a copy of a negotiable quote. |
| quote-management/quote-items-removed | Emits and listens | Emitted after removeNegotiableQuoteItems() removes one or more items from a negotiable quote. |
| quote-management/quote-renamed | Emits and listens | Emitted after renameNegotiableQuote() updates the name (and optional comment) of a negotiable quote. |
| quote-management/quote-sent-for-review | Emits and listens | Emitted after sendForReview() submits a negotiable quote for merchant review. |
| quote-management/quote-template-data | Emits and listens | Emitted when quote template data is loaded or updated. |
| quote-management/shipping-address-set | Emits and listens | Emitted after setShippingAddress() updates the shipping address for a negotiable quote. |
Event details
Section titled “Event details”The following sections provide detailed information about each event, including its direction, event payload, and usage examples.
auth/permissions (listens)
Section titled “auth/permissions (listens)”Fired by Auth (auth) when Adobe Commerce permissions are updated.
Event payload
Section titled “Event payload”AuthPermissionsPayloadExample
Section titled “Example”import { events } from '@dropins/tools/event-bus.js';
events.on('auth/permissions', (payload) => { console.log('auth/permissions event received:', payload);});checkout/updated (listens)
Section titled “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
Section titled “Event payload”Cart | NegotiableQuote | nullSee Cart, NegotiableQuote for full type definitions.
Example
Section titled “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)
Section titled “quote-management/file-upload-error (emits)”Emitted when uploadFile() fails to upload or finalize a file attachment.
Event payload
Section titled “Event payload”{ error: string; fileName?: string;}Example
Section titled “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)
Section titled “quote-management/initialized (emits and listens)”Emitted when the Quote Management initializer finishes loading store configuration.
Event payload
Section titled “Event payload”{ config: StoreConfigModel;}See StoreConfigModel for full type definition.
When triggered
Section titled “When triggered”- After
initialize()function completes - On drop-in first load
Example
Section titled “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)
Section titled “quote-management/line-item-note-set (emits)”Emitted after setLineItemNote() updates a line item note for a negotiable quote.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; input: { quoteUid: string; itemUid: string; note: string; quantity?: number;}}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- After calling
setLineItemNote() - When merchant or buyer adds/updates item notes
Example
Section titled “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)
Section titled “quote-management/negotiable-quote-close-error (emits and listens)”Emitted when closeNegotiableQuote() fails to close one or more negotiable quotes.
Event payload
Section titled “Event payload”{ error: Error; attemptedQuoteUids: string[];}Example
Section titled “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)
Section titled “quote-management/negotiable-quote-closed (emits and listens)”Emitted after closeNegotiableQuote() closes one or more negotiable quotes.
Event payload
Section titled “Event payload”{ closedQuoteUids: string[]; resultStatus: string;}When triggered
Section titled “When triggered”- After calling
closeNegotiableQuote() - When quote reaches final state
Example
Section titled “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)
Section titled “quote-management/negotiable-quote-delete-error (emits)”Emitted when deleteQuote() fails to delete one or more negotiable quotes.
Event payload
Section titled “Event payload”{ error: Error; attemptedQuoteUids: string[];}Example
Section titled “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)
Section titled “quote-management/negotiable-quote-deleted (emits)”Emitted after deleteQuote() deletes one or more negotiable quotes.
Event payload
Section titled “Event payload”{ deletedQuoteUids: string[]; resultStatus: string;}When triggered
Section titled “When triggered”- After calling
deleteQuote() - After successful quote deletion
Example
Section titled “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)
Section titled “quote-management/negotiable-quote-requested (emits)”Emitted after requestNegotiableQuote() creates a negotiable quote from a cart.
Event payload
Section titled “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
Section titled “When triggered”- After calling
requestNegotiableQuote() - When buyer submits quote request
Example
Section titled “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)
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).
Event payload
Section titled “Event payload”typeof state.permissionsWhen triggered
Section titled “When triggered”- After permission changes
- On user role updates
- After company context switches
Example
Section titled “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)
Section titled “quote-management/quantities-updated (emits and listens)”Emitted after updateQuantities() updates item quantities in a negotiable quote.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; input: { quoteUid: string; items: Array<{ quoteItemUid: string; quantity: number }>;}}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- After calling
updateQuantities() - When buyer or merchant updates quantities
Example
Section titled “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)
Section titled “quote-management/quote-data (emits and listens)”Emitted when negotiable quote data is loaded or updated.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; permissions: typeof state.permissions;}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- After loading quote details
- After any quote modification
- After status changes
Example
Section titled “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)
Section titled “quote-management/quote-data/error (emits)”Emitted when Quote Management fails to load negotiable quote data during initialization.
Event payload
Section titled “Event payload”{ error: Error;}Example
Section titled “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)
Section titled “quote-management/quote-data/initialized (emits)”Emitted the first time Quote Management successfully loads negotiable quote data during initialization.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; permissions: typeof state.permissions;}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- On first load of quote details
- After quote context is established
Example
Section titled “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)
Section titled “quote-management/quote-duplicated (emits and listens)”Emitted after duplicateQuote() creates a copy of a negotiable quote.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; input: { quoteUid: string; duplicatedQuoteUid: string;} hasOutOfStockItems?: boolean;}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- After calling
duplicateQuote() - When creating copy of existing quote
Example
Section titled “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)
Section titled “quote-management/quote-items-removed (emits and listens)”Emitted after removeNegotiableQuoteItems() removes one or more items from a negotiable quote.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; removedItemUids: string[]; input: RemoveNegotiableQuoteItemsInput;}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- After calling
removeNegotiableQuoteItems() - When items are deleted from quote
Example
Section titled “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)
Section titled “quote-management/quote-renamed (emits and listens)”Emitted after renameNegotiableQuote() updates the name (and optional comment) of a negotiable quote.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; input: { quoteUid: string; quoteName: string; quoteComment?: string;}}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- After calling
renameNegotiableQuote() - When quote name is updated
Example
Section titled “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)
Section titled “quote-management/quote-sent-for-review (emits and listens)”Emitted after sendForReview() submits a negotiable quote for merchant review.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; input: { quoteUid: string; comment?: string; attachments?: { key: string }[];}}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- After calling
sendForReview() - When buyer submits quote for negotiation
Example
Section titled “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)
Section titled “quote-management/quote-template-data (emits and listens)”Emitted when quote template data is loaded or updated.
Event payload
Section titled “Event payload”{ quoteTemplate: NegotiableQuoteTemplateModel; permissions: typeof state.permissions;}See NegotiableQuoteTemplateModel for full type definition.
When triggered
Section titled “When triggered”- After loading template details
- After template modifications
- After template status changes
Example
Section titled “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)
Section titled “quote-management/quote-template-data/error (emits)”Emitted when Quote Management fails to load quote template data during initialization.
Event payload
Section titled “Event payload”{ error: Error;}Example
Section titled “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)
Section titled “quote-management/quote-template-deleted (emits)”Emitted after deleteQuoteTemplate() deletes a quote template.
Event payload
Section titled “Event payload”{ templateId: string;}When triggered
Section titled “When triggered”- After calling
deleteQuoteTemplate() - After successful template deletion
Example
Section titled “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)
Section titled “quote-management/quote-template-generated (emits)”Emitted after generateQuoteFromTemplate() creates a new negotiable quote from a template.
Event payload
Section titled “Event payload”{ quoteId: string;}When triggered
Section titled “When triggered”- After calling
generateQuoteFromTemplate() - When creating quote from template
Example
Section titled “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
Section titled “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)
Section titled “quote-management/quote-templates-data (emits)”Emitted after getQuoteTemplates() loads the quote templates list.
Event payload
Section titled “Event payload”{ quoteTemplates: NegotiableQuoteTemplatesListModel; permissions: typeof state.permissions;}See NegotiableQuoteTemplatesListModel for full type definition.
When triggered
Section titled “When triggered”- After loading templates list
- After template creation/deletion
- After template status changes
Example
Section titled “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)
Section titled “quote-management/shipping-address-set (emits and listens)”Emitted after setShippingAddress() updates the shipping address for a negotiable quote.
Event payload
Section titled “Event payload”{ quote: NegotiableQuoteModel; input: { quoteUid: string; addressId?: number; addressData?: AddressInput;}}See NegotiableQuoteModel for full type definition.
When triggered
Section titled “When triggered”- After calling
setShippingAddress() - When shipping address is updated
Example
Section titled “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
Section titled “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 eventsevents.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 changesevents.on('quote-management/quote-data', handleQuoteUpdate);events.on('quote-management/quantities-updated', handleQuantityChange);
// Listen to template eventsevents.on('quote-management/quote-template-generated', handleTemplateGeneration);events.on('quote-management/quote-templates-data', handleTemplatesLoad);
// Clean up listenersevents.off('quote-management/quote-data', handleQuoteUpdate);Event flow examples
Section titled “Event flow examples”Data Models
Section titled “Data Models”The following data models are used in event payloads for this drop-in.
NegotiableQuoteModel
Section titled “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
Section titled “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
Section titled “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
Section titled “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;}