Quotes & Orders
Soryk's quote workflow lets agents save a cart, send the customer a public link, and convert it to a real Shopify draft order on acceptance. The lifecycle is short: draft → pending → accepted (or rejected/expired) → converted. Every step is auditable and the public link is token-based, no login required.
Save cart as quote
- In the agent app, build a cart for a company / location as usual.
- Instead of Slide to confirm, tap Save as quote.
- Fill the quote form:
- Quote name (e.g. "Q-2026-04-001")
- Customer email + name
- Optional note (visible to the customer)
- Expiry days (default 7)
- Send by email now? (checkbox)
- Submit. A
soryk_quotemetaobject is created with a unique token. Status:draft(orpendingif email sent).
Public quote link
Each quote has a token-based URL: https://your-shop.myshopify.com/apps/soryk/quotes/<token>. The customer can open it without logging in and see:
- Logo + your branding
- Line items, quantities, prices
- Subtotal, applied discount, tax preview, shipping preview
- The note from the agent
- Two buttons: Accept / Reject
- Expiry date
Token security. Tokens are 32-byte URL-safe random strings. Guessable in roughly never. Even so, treat the link as semi-private — share it with the named customer only.
Customer accept/reject
- Accept — quote status flips to
accepted. A push notification fires back to the originating agent (push notifications, if subscribed). The agent then converts the quote to a draft order from their app. - Reject — status flips to
rejected. Agent gets notified. Quote is preserved for audit. - Expiry — quotes auto-expire at midnight after the expiry date. Status flips to
expired. The link still resolves but shows an "expired" message instead of buttons.
Convert to draft order
- Open the accepted quote in the agent app.
- Tap Convert to draft order.
- A native Shopify draft order is created with all the quote's lines + the appropriate Soryk tags (
soryk,soryk_quote_accepted,soryk_agent:<email>). - If the discount is over the agent's auto-approve cap, the draft is created with
soryk_discount_pendingand routes to your approval queue. - Otherwise, the draft is ready to invoice / mark as paid in Shopify.
Edit a pending quote
Sometimes the customer asks to change quantities or swap an item before accepting. Soryk supports edit on both draft and pending statuses without breaking the public token — the link the customer already received still works.
- Open the quote in the agent app.
- Tap Edit.
- Modify lines, save.
- Optionally Resend to refresh the customer's view.
Edits on accepted/rejected/expired quotes are blocked — duplicate the quote instead.
Resend / duplicate / delete
| Action | What it does |
|---|---|
| Resend | Re-sends the quote email to the customer. Returns emailDelivered: true|false — UI surfaces a warning toast if delivery failed. |
| Duplicate | Creates a new quote with the same lines, fresh token and fresh expiry. Useful for "same again next month". |
| Delete | Removes the metaobject. The public link 404s. Customer's email reference becomes a dead link — use sparingly. |
Discount approval workflow
Per the agentDiscountMaxPercent setting:
- Discount ≤ cap → auto-applied to the draft order. Tag:
soryk_discount:5%. - Discount > cap → pending approval. Tag:
soryk_discount_pending. Asoryk_pending_discountmetaobject is created and surfaces in the admin Discounts queue + home banner.
- Admin reviews from Discounts.
- Approve → discount applied to the draft.
- Reject → draft is deleted, agent notified.
Payment terms
Soryk uses Shopify's native PaymentTermsTemplate:
NET_7,NET_14,NET_30,NET_60,NET_90FIXED(custom date)
Display labels can be overridden via paymentTermLabels in settings — useful for industry-specific terms like "2/10 Net 30" or "30 GG D.F. F.M." (typical Italian construction-industry term).
Tax + shipping preview
Both the cart and the public quote page show a tax + shipping preview computed live via Shopify's cart-preview API. This isn't a hard quote — final taxes and shipping rates apply at checkout — but it's accurate enough to give customers a real expectation.
If the preview can't compute (e.g. missing shipping zone for the destination), it shows "calculated at checkout" instead of a wrong number.