The GraphQL operations of SI Request a Quote, Hide Price. They use the same address, keys and rules as all our apps: see GraphQL API reference: Rentals & Bookings for how to send a request, and the API overview for keys, limits and errors. The same operations are in REST: REST API reference: Request a Quote.
Needs the SI Request a Quote, Hide Price app. It works on a store without Rentals & Bookings. Make the key on its API access page; a key made in any of our apps works too, because keys belong to the store. On a store without the app, its operations are refused before anything runs, with errors[].extensions.code: "app_not_installed" and data.app: "quotes". Every operation needs a secret key; mutations need Allow changes (write).
If the store’s Quotes plan doesn’t include API access, the operations answer plan_required. Ids are gid://sirentals/SalesQuote/<id>; salesQuote(id:) also takes the number (Q-1042) or the public id. Lines keep Shopify’s gid://shopify/ProductVariant/…. The codes are the REST API’s: invalid, invalid_status, not_found, plan_required, shopify_error.
Operations #
| Operation | Arguments | What it does |
|---|---|---|
salesQuotesquery · secret key returns SalesQuoteConnection! | filter: SalesQuoteFilterInputfirst: Intafter: Stringlast: Intbefore: String | The store’s quotes, newest first, by status, source, customer, a search or a change date. |
salesQuotequery · secret key returns SalesQuote | id: ID! | One quote by id, number (Q-1042) or public id, with its versions, events, notes and emails; null when there is none. |
createSalesQuotemutation · secret key returns SalesQuotePayload! | input: SalesQuoteCreateInput! | Create a quote: DRAFT (you prepare it; nothing is emailed until it is sent, or send: true) or REQUEST (as if the customer asked). |
updateSalesQuotemutation · secret key returns SalesQuotePayload! | id: ID!input: SalesQuoteUpdateInput! | Change the working version. A sent version never changes: editing it starts the next version. |
sendSalesQuotemutation · secret key returns SalesQuotePayload! | id: ID! | Send the working version to the customer. |
cancelSalesQuotemutation · secret key returns SalesQuotePayload! | id: ID!reason: String | Withdraw a quote that isn’t accepted yet. |
reopenSalesQuotemutation · secret key returns SalesQuotePayload! | id: ID! | Reopen an expired, declined, rejected or cancelled quote. |
convertSalesQuotemutation · secret key returns SalesQuoteConvertPayload! | id: ID!mode: SalesQuoteConvertMode = INVOICE | Turn the sent version into a Shopify draft order: INVOICE (the customer gets the payment link) or ORDER (the order is made now, payment pending). |
addSalesQuoteNotemutation · secret key returns SalesQuoteMessagePayload! | id: ID!body: String! | Add an internal note (staff only). |
addSalesQuoteMessagemutation · secret key returns SalesQuoteMessagePayload! | id: ID!body: String! | Send the customer a message (emailed and shown on their quote page). |
mutation NewQuote {
createSalesQuote(input: {
as: DRAFT
customer: {email: "[email protected]", name: "Jordan Lee"}
lines: [{variantId: "gid://shopify/ProductVariant/44001", title: "Party tent 6×12 m", quantity: 1, unitPrice: "1350.00"}]
customerMessage: "Here is the price for your December event."
send: true
}) {
salesQuote { id number status total }
userErrors { code field message }
}
}
SalesQuoteFilterInput
| Field | Type | Notes |
|---|---|---|
status | [SalesQuoteStatus!] | |
search | String | Number, customer name or email, product title or SKU. |
source | String | storefront, cart, quick, admin, api, b2b_review, import. |
customerId | ID | |
updatedSince | String | Only quotes changed at or after this moment (ISO 8601). |
SalesQuoteCreateInput
| Field | Type | Notes |
|---|---|---|
as | SalesQuoteCreateAs = DRAFT | |
customer | SalesQuoteCustomerInput | |
lines | [SalesQuoteLineInput!] | |
locale | String | |
send | Boolean | DRAFT only: send it at once. |
customerMessage | String | |
terms | String | |
expiresAt | String | Y-m-d (end of that day in the store’s time zone) or ISO 8601. |
discount | SalesQuoteDiscountInput | |
shipping | SalesQuoteShippingInput | |
tags | [String!] |
SalesQuoteCustomerInput
| Field | Type | Notes |
|---|---|---|
id | ID | The Shopify customer (gid://shopify/Customer/… or the number), when there is one. |
email | String | |
name | String | |
phone | String |
SalesQuoteLineInput
| Field | Type | Notes |
|---|---|---|
variantId | ID | A catalog variant (gid://shopify/ProductVariant/… or the number). Leave it out for a custom item. |
productId | ID | |
title | String! | |
variantTitle | String | |
sku | String | |
quantity | Int! | |
listPrice | String | The catalog price (defaults to what the variant costs when the line comes from the storefront). |
unitPrice | String | Your price per unit. Empty = the list price. Required for a custom item. |
requestedPrice | String | |
discount | SalesQuoteDiscountInput | |
taxable | Boolean | |
requiresShipping | Boolean | |
properties | JSON | Line properties (visible, and product-option data with keys starting with _). |
note | String |
SalesQuoteDiscountInput
| Field | Type | Notes |
|---|---|---|
type | SalesQuoteDiscountType! | |
value | String! | A percentage (0–100) or an amount; FIXED on a line is per unit. |
title | String |
SalesQuoteShippingInput
| Field | Type | Notes |
|---|---|---|
title | String | |
price | String! |
SalesQuoteUpdateInput
| Field | Type | Notes |
|---|---|---|
customer | SalesQuoteCustomerInput | |
lines | [SalesQuoteLineInput!] | Replaces every line of the working version. |
customerMessage | String | |
terms | String | |
expiresAt | String | |
discount | SalesQuoteDiscountInput | |
shipping | SalesQuoteShippingInput | |
taxExempt | Boolean | |
tags | [String!] |
| Enum | Values |
|---|---|
SalesQuoteStatus | NEWIN_REVIEWDRAFTSENTCHANGES_REQUESTEDACCEPTEDORDEREDEXPIREDDECLINEDREJECTEDCANCELLED |
SalesQuoteCreateAs | DRAFTREQUEST |
SalesQuoteDiscountType | PERCENTFIXED |
SalesQuoteConvertMode | INVOICEORDER |
| Type | Fields |
|---|---|
SalesQuoteA quote (the customer’s request and every version the store sent). | id: ID!, number: String!, publicId: String!, status: SalesQuoteStatus!, source: String!, customer: SalesQuoteCustomer!, total: String, currency: String, expiresAt: String, viewedAt: String, createdAt: String, updatedAt: String, draftOrderId: ID, orderId: ID, orderName: String, invoiceUrl: String, tags: [String!]!, answers: JSON, working: SalesQuoteVersion, sent: SalesQuoteVersion, request: SalesQuoteVersion, versions: [SalesQuoteVersionSummary!]!, notes: [SalesQuoteMessage!]! |
SalesQuoteCustomer | id: ID, name: String, email: String, phone: String |
SalesQuoteVersion | n: Int!, author: String!, locked: Boolean!, sentAt: String, currency: String, subtotal: String!, discountTotal: String!, shippingTotal: String!, taxTotal: String!, total: String!, taxesIncluded: Boolean!, customerMessage: String, terms: String, discount: JSON, shipping: JSON, lines: [SalesQuoteLine!]! |
SalesQuoteLine | variantId: ID, productId: ID, title: String!, variantTitle: String, sku: String, custom: Boolean!, quantity: Int!, listPrice: String, requestedPrice: String, unitPrice: String, discount: JSON, lineTotal: String!, taxable: Boolean!, requiresShipping: Boolean!, properties: JSON, note: String |
SalesQuoteVersionSummary | n: Int!, author: String!, locked: Boolean!, sentAt: String, total: String!, currency: String |
SalesQuoteMessage | id: ID!, author: String!, body: String!, internal: Boolean!, at: String |
SalesQuotePayload | salesQuote: SalesQuote, userErrors: [RentalUserError!]! |
SalesQuoteConvertPayload | salesQuote: SalesQuote, draftOrderId: ID, invoiceUrl: String, orderId: ID, orderName: String, userErrors: [RentalUserError!]! |
SalesQuoteMessagePayload | message: SalesQuoteMessage, userErrors: [RentalUserError!]! |
