Common Issues

Start with the failed step, the actor, and the quote's current state. A missing storefront action, a rejected status change, and an expired-quote cron problem have different causes; clearing every cache or reindexing every indexer rarely explains the underlying issue.

Before changing configuration, record:

  • quote ID and increment number
  • store view and customer group
  • customer, guest, administrator, REST, or GraphQL context
  • current state and status
  • exact action and error message
  • request time for matching the event to Magento logs

“Add to Quote” is not visible

Check these items in order:

  1. MageB2B_B2BQuote is enabled and b2bquote/general/enable resolves to 1 for the current store.
  2. The current customer group is selected under Allowed Customer Groups. Guest visibility additionally requires guest quotes to be enabled.
  3. Display on Product Page or Display on Category Page is enabled for the location you are checking.
  4. The product type and page are handled by the installed storefront implementation.
  5. If the store uses Hyvä, MageB2B_B2BQuoteHyva is installed and the Hyvä CSS sources have been rebuilt.
  6. Full-page cache and block cache were cleaned after configuration or layout changes.

Test once as the affected customer rather than only as an administrator. Customer-group and store-scope differences are common causes.

The customer cannot create or submit a quote

Creation is refused

Review the store-scoped limits:

  • b2bquote/general/max_quotes_per_customer
  • b2bquote/general/max_quote_items
  • b2bquote/general/max_item_qty
  • b2bquote/general/allowed_customer_groups
  • b2bquote/customer_experience/allow_empty_draft_quote

A value of 0 disables the corresponding quote-count or item-count limit where documented by the setting. Do not assume it means zero allowed records.

Submission is refused

Check that the quote contains the required data for its workflow:

  • at least one valid item unless the current operation explicitly allows an empty draft
  • billing and shipping data when required
  • shipping method when b2bquote/shipping/required is enabled
  • payment method when b2bquote/payment/required is enabled
  • a permitted transition from the current status for the customer actor

If the public message is deliberately generic, correlate the request time with var/log/system.log and var/log/exception.log to find the internal cause without exposing it to the customer.

A status change is rejected

B2B Quote separates the system state from the configurable status. A status transition record controls the source status, target status, allowed actor, note requirement, and notification behavior.

  1. Open B2B Quotes > Status Transitions.
  2. Confirm that a transition exists for the quote's store, source status, target status, and actor.
  3. If Workflow Rules Validate Transitions is enabled, review active workflow rules as well.
  4. Supply a note when the transition requires one.
  5. Confirm the administrator has the required quote ACL resource.

Use the transition Health Check before manually editing core workflow records. The Reload Fixtures action can restore core data, but review its impact in a non-production environment first.

Expiration, reminders, draft cleanup, or revision cleanup does not run

All four module jobs are registered in Magento's default cron group:

Job Schedule
b2bquote_quote_check_expired Daily at 02:00
b2bquote_send_expiration_reminders Hourly
b2bquote_delete_old_drafts Daily at 03:00
b2bquote_cleanup_old_revisions Daily at 04:00

Run Magento's default group once for diagnosis:

php bin/magento cron:run --group=default

Then inspect cron_schedule for the exact job code and check var/log/cron.log, var/log/system.log, and var/log/exception.log. Also verify:

  • the store-local expiration date and status are eligible
  • expiration reminder emails are enabled and intervals are configured
  • draft lifetime and notice settings are greater than zero where needed
  • revision cleanup is enabled and its retention period is configured

Do not create a separate b2bquote cron group; the package does not declare one.

Pricing rules do not apply as expected

  1. Confirm b2bquote/pricing_rules/pricing_rules_enabled is enabled for the quote's store.
  2. Check the rule's active dates, priority, store/customer conditions, and quote conditions.
  3. Decide whether rule stacking is allowed. With stacking disabled, evaluation stops after the first applicable rule.
  4. Check whether an administrator has already entered an offered item price. Automatic repricing is designed to preserve existing manual offers in supported save flows.
  5. Recalculate the quote totals and inspect the applied rule IDs.

Magento catalog reindexing is relevant only when the underlying catalog data or index is stale. It is not a general repair step for quote-rule configuration.

Accepted prices or adjustments are missing from the cart or order

Check the configured accept mode and these settings:

  • b2bquote/general/accept_mode
  • b2bquote/general/allow_quote_accept_mode_choice
  • b2bquote/general/clear_cart_before_accept_add_to_cart
  • b2bquote/general/clear_cart_after_conversion
  • b2bquote/order_creation/price_change_behavior
  • b2bquote/order_creation/stock_validation_behavior
  • b2bquote/order_creation/product_availability_check

Confirm that the quote reached a state allowed for acceptance and that the selected transition exists. If conversion fails, do not repeatedly submit the same request until you know whether an order or cart update was already created.

Shipping methods are missing

Verify that the quote has a complete shipping address and that Magento can estimate rates for its products and quantities. Then check:

  • b2bquote/shipping/required
  • b2bquote/shipping/disallowed_methods
  • Magento carrier enablement, country restrictions, price/weight rules, and store scope

The quote module can disallow methods, but it cannot make a carrier method available when Magento's carrier configuration rejects the request.

Payment methods are missing

Check b2bquote/payment/disallowed_methods and the payment method's own country, currency, order-total, customer, and store restrictions. B2B Quote filters Magento's available methods; it does not reactivate a method rejected by its payment provider or another availability rule.

Inventory reservation is not balanced

Inventory reservations can be created on approval and released on rejection, expiration, or order creation, depending on configuration. Review:

  • b2bquote/inventory/reserve_on_approval
  • b2bquote/inventory/release_on_expiration
  • b2bquote/inventory/release_on_rejection
  • the reservation compensation code
  • the quote's status history and any resulting order

Do not insert or delete MSI reservation rows manually. First establish which lifecycle event ran and whether it was retried. Preserve logs and database evidence for support.

Email notifications do not arrive

  1. Confirm quote notifications are enabled for the quote's store.
  2. Check the sender identity, administrator recipients, and the template for the specific event.
  3. For reminders, also check the direct reminder flag and configured intervals.
  4. Test another Magento transactional email through the same transport.
  5. Review var/log/system.log and var/log/exception.log at the action time.

The module uses Magento's mail transport. It does not require the async.operations.all consumer for its normal notification observers, and Magento does not guarantee a var/log/mail.log file.

PDF generation fails or the button is unavailable

  • Check whether the quote's current status is selected under PDF Download Restricted Statuses.
  • Confirm company fields, logo file, and chosen base layout are valid for the store view.
  • If the PDF Designer add-on is installed, confirm that the selected custom layout still exists and is valid for the current store.
  • Review font and image errors in Magento logs.
  • For a stale designer preview, save the layout again and confirm that the request reaches the current layout definition.

See PDF Export & Layouts and PDF Designer Add-On.

REST returns 401 or 403

  • Use an administrator/integration token for ACL-protected routes.
  • Use a customer token for self routes.
  • Grant the integration the exact MageB2B_B2BQuote::* resource declared for the route.
  • Confirm that MageB2B_B2BQuoteApi is enabled.

The REST add-on does not provide quote webhooks or its own rate-limit configuration. See REST API Add-On for the supported routes.

GraphQL rejects an owned-quote operation

Confirm that MageB2B_B2BQuoteGraphQl is enabled, the customer token is current, and the quote belongs to that customer. A valid customer token still cannot bypass status transitions or ownership checks. Refresh the client's cached schema after module upgrades.

Import validation fails

Use the header from an export or sample file for the same entity and installed schema. Check encoding, delimiter, required identifiers, and behavior. CLI imports require one of append, add_update, replace, or delete.

Keep the file during diagnosis:

php bin/magento b2bquote:import-projects \
  var/import/b2bquote_projects.csv \
  --behavior=append \
  --delete_file_after_import=0

The add-on prints row-specific validation errors before it attempts the import.

Information to include in a support request

  • base and add-on package identity and dependency constraints
  • Magento and PHP versions
  • store view and actor type
  • quote increment number and current status, without customer-sensitive attachments
  • exact reproduction steps and error text
  • relevant log excerpt around the request time
  • whether the problem reproduces with third-party checkout, payment, shipping, and theme customizations disabled in a safe staging environment

Do not send access tokens, passwords, complete customer exports, or production database dumps through a normal support message.