> For the complete documentation index, see [llms.txt](https://orbit-b2b.gitbook.io/orbit-b2b-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://orbit-b2b.gitbook.io/orbit-b2b-docs/quotes-rfq/troubleshooting.md).

# Troubleshooting

Quick fixes for common issues. If your problem isn't listed, contact support with the quote number and a screenshot.

## "You are not eligible to submit a quote request"

The buyer submitted a quote but got an eligibility error.

### Possible causes

| Cause                                               | Fix                                                                                                                           |
| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| Eligibility = Approved B2B, customer has no B2B tag | Add a `b2b`, `wholesale`, or `tier-*` tag to the customer in Shopify → Customers                                              |
| Customer is logged in via new customer accounts     | App tries to look up the customer by email — make sure the customer's email in the form matches their Shopify Customer record |
| Eligibility = Public + rate limit triggered         | Check Quote settings → Auto-reject → Rate limit per IP. Increase or disable                                                   |

## The Request a Quote button doesn't appear

The block is on the product page in theme editor, but storefront shows nothing.

### Possible causes

* **Customer isn't logged in** + eligibility is Approved B2B → behavior by design. Test with a logged-in B2B account.
* **Eligibility check fails** → check the customer's tags in Shopify admin
* **Block hidden via `eligibility_visibility = b2b_only`** → block-level setting in theme editor. Customer must have a B2B tag

## Modal opens but variants list is empty

The buyer clicked the button, modal opened, but the items table is blank.

### Possible cause

The `/products/<handle>.json` endpoint returned nothing — usually because the product is unpublished or hidden from the buyer's market. Republish the product or check market scope.

## Customer accepted but PDF invoice email never arrived

Buyer reports they clicked Accept on a Net 30 quote but never got the PDF.

### Checklist

1. **SMTP configured?** Apps → Orbit B2B → Email Templates → Configuration → SMTP Settings. Click Send test email.
2. **`quote_accepted_invoice` template enabled?** Email Templates → Quote → Quote Invoice (Net terms). Toggle Enabled.
3. **Buyer's email correct?** Open the quote → check the customer card. If the buyer's email is wrong, edit the customer in Shopify → Customers, then ask them to re-submit.
4. **PDF generation logs** — check your backend logs for `[QuoteEmailService] PDF generation failed`. If pdfkit threw an error, the email is skipped.
5. **Spam folder** — large attachments sometimes get flagged. Ask buyer to check spam.

## Net 30 buyer doesn't see Mark as paid working

You marked a Net 30 order as paid in Shopify but the quote still shows the buyer hasn't paid.

### Cause

The `orders/paid` webhook is what links the order back to the quote. If the webhook didn't fire:

* Check Partner Dashboard → App → Webhooks → `orders/paid` is subscribed and pointing to your app's `/api/webhooks` endpoint
* Manually trigger from Shopify Orders → click the order → Resend webhook (if visible)
* Check backend logs for `[Webhook] orders/paid linked to quote ...`

## "Quote has expired" error when buyer tries to accept

Buyer opens the email link and clicks Accept, but gets a "quote has expired" message.

### Cause

The quote's `validity.validUntil` is in the past. Either:

* The hourly cron just ran and marked it Expired
* The validity was too short (e.g. 3 days)

### Fix

Open the quote in your inbox → status will be Expired. Click anywhere in the items / adjustments → set a new validity → click Send price update again. This re-extends the quote and lets the buyer accept.

## Hourly cron job not running

Quotes never auto-expire and reminder emails never fire.

### Checklist

* `DISABLE_SCHEDULED_JOBS` env var is **not** set to "1" on production
* Backend log on boot shows `[scheduler] reconcile next ...` — if not, the scheduler module didn't start
* Mongo connection is up (cron uses a Mongo-backed lock)

## Translations show in wrong language

Buyer is on the French version of your store but sees English buttons.

### Cause

The translations aren't synced to the metafield, OR the French locale isn't published.

### Fix

1. Shopify admin → Settings → Languages → make sure French is **published**
2. Apps → Orbit B2B → Settings → Storefront Text → switch language tab to French → fill in any empty values
3. Save — this triggers a metafield sync
4. Hard-refresh the storefront page (Cmd+Shift+R)

## Need more help

Send the quote number + a screenshot of the issue to your account manager. Include the customer's email and approximate time so we can locate the request in our logs.

## Related

* [Overview](/orbit-b2b-docs/quotes-rfq/overview.md)
* [Payment terms](/orbit-b2b-docs/quotes-rfq/payment-terms.md)
* [Email templates](/orbit-b2b-docs/quotes-rfq/emails.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://orbit-b2b.gitbook.io/orbit-b2b-docs/quotes-rfq/troubleshooting.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
