Staff Quote Management

Staff Quote gives representatives and Magento administrators a quotation workspace tied to the Sales Staff customer model. A customer can request a quote, or an authorized representative can prepare one for an assigned customer, set item prices and discounts, choose addresses, shipping and payment, attach files, send a PDF and follow the response through to cart or order.

Install

composer require mageb2b/staff-quote:*
php bin/magento module:enable MageB2B_StaffQuote
php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento cache:flush

Enable Manage Quotes on each representative who should use the workflow. Magento administrators manage all quotes under Staff > Staff Quotes.

Admin permissions

The add-on provides granular ACL resources for Magento Admin roles under Staff Quote: view, create, edit, delete, duplicate, send, change status, generate PDF and view history. Grant only the actions a back-office role actually needs — for example a read-only review role receives view and history without edit, send or delete.

A practical quote workflow

  1. A customer submits a request, or Staff creates a draft for an assigned customer.
  2. Staff adds products and quantities, adjusts prices or discounts, and selects billing, shipping and payment details.
  3. Staff sets the validity date, adds customer-visible or internal context and uploads relevant files.
  4. The quote follows the internal approval state used by the team.
  5. Staff sends the approved offer. The customer receives the configured email and, optionally, a PDF and permitted attachments.
  6. The customer views the quote, asks for changes, accepts it or rejects it.
  7. An accepted quote can be added to the customer's cart. Direct order creation is available only when it is enabled and the quote has complete, valid checkout data.

Staff can also duplicate a quote, recalculate totals, collect shipping rates and generate a PDF. The history records status and action changes so a later user can see what happened.

Pending-approval quote for Elena Fischer with customer follow-up actions

Internal and customer states

The module deliberately keeps two state tracks:

  • Internal: Draft, Pending Approval, Approved or Rejected
  • Customer-facing: Customer Requested, Unsent, Sent, Viewed, Feedback, Accepted, Rejected, Expired or Order Created

This prevents an internal review step from being confused with the customer's answer. For example, a quote may be internally approved but still unsent, or customer-accepted but not yet converted into an order.

Expiry and reminders

The default validity period is 30 days. A daily job expires eligible quotes at midnight, and a second job sends reminders at 06:00, three days before expiry by default.

Enable Require Valid Until Date Before Sending when every outbound offer must have a customer-visible deadline. Magento cron must be healthy for expiry and reminder automation.

Customer access and token policy

Quote links can be governed by one of three policies:

  • Hybrid: the logged-in owner may perform most account actions, while quote viewing still requires the token.
  • Login Only: the logged-in owner does not need the email token.
  • Always Require Token: even the logged-in owner must present it.

The separate token-action allowlist controls which actions may run without customer login when a valid token is present: viewing, PDF download, acceptance, rejection, feedback, attachment download, add to cart and create order.

Start with the narrowest policy your buying process allows. Do not enable order creation or attachment download for token-only access merely for convenience. Quote tokens and emailed URLs are credentials and should not be logged or forwarded publicly.

Cart and direct order conversion

Adding an accepted quote to cart is enabled by default. Direct customer order creation is disabled by default.

Both flows require an accepted, unexpired quote. Direct order creation also needs a customer, valid addresses, a permitted shipping method for physical products, a permitted payment method and salable products. The module prevents a second order from being created from the same quote.

Admin order creation requires both internal approval and customer acceptance. This two-sided check is useful when sales operations completes conversion for the buyer.

Attachments and email

Customer uploads are enabled by default. The default limit is ten files, 10 MB each, with document, spreadsheet, text and common image extensions allowed. Outgoing emails do not attach existing quote files by default; when enabled, the combined default email limit is 15 MB. Above that limit the email contains a link instead.

Review the extension allowlist, sizes and retention policy before production. A customer-visible attachment should never contain internal pricing notes.

Quote emails have separate templates for the quote, direct send, status updates, expiry reminders, internal notifications and customer requests. Sending the same quote is rate-limited to once per 60 seconds by default.

PDF identity

Configure the company logo, name, address, contact line and footer under Quote Settings. Generate a real quote PDF in staging and inspect line wrapping, taxes, discounts, shipping, currency and non-ASCII customer names before using it with buyers.

Key defaults

Setting Default
Show Request Quote for Customer Yes
Default Quote Expiry 30 days
Expiry Reminder Yes, 3 days before
Quote Number Format Q-{increment_id}
Require Valid Until No
Add accepted quote to cart Yes
Direct customer order creation No
Customer token policy Hybrid
Customer attachments Yes, 10 files at 10 MB each
Attach quote PDF to customer email No
Attach quote files to emails No
Email send rate limit 60 seconds

Common questions

Why can the representative not open the quote?

Check Manage Quotes, the Staff-to-customer assignment and the quote's Staff owner. Access all customers still follows the Staff website boundary.

Why can the customer not accept the quote?

Confirm it was sent, has not expired and the current login/token satisfies the configured policy. A rejected or expired quote is terminal and should be duplicated or revised through the Staff workflow instead of forcing its state.

Why are shipping methods empty?

Check the shipping address, website/store, product salability and carrier rules. Recalculate totals and collect rates after changing the address or lines.

Why was no reminder sent?

Confirm the reminder setting, validity date, reminder offset, email template and Magento cron execution at 06:00.

Why can an accepted quote not become an order?

Direct order creation may be disabled, checkout data may be incomplete, a product may no longer be salable, or the quote may already have an order. Review payment and shipping availability in the same store and customer context.

Related: Customer Assignment, Order Management and Staff Quote Sample Data.