Recued
Menu
← Back to recipes

Open a quote request

by recued-core v3 36 views

Use “Open a quote request” in Recued. Exact-form template that turns one owner-accepted Reception intake response into an order awaiting your price, and records the request itself in the pack's own Records storage. Changes remain behind Recued's approval controls.

Complete workflow

Seller Quote Request 5 pinned recipes

Use Seller Quote Request in Recued for unspecified pricing, estimate, order, and reception. It includes 7 built-in actions and 4 ready-to-run workflows. Actions that change data use Recued's approval controls.

You are viewing one recipe in this workflow. Installing it opens the complete pack so its other recipes and background automations arrive together.

Open a quote request
This recipe

Use “Open a quote request” in Recued. Exact-form template that turns one owner-accepted Reception intake response into an order awaiting your price, and records the request itself in the pack's own Records storage. Changes remain behind Recued's approval controls.

pack:seller-quote-requestform-response-templatesellerquote
by recued-core pinned v3

Use “Open a quote request by hand” in Recued. Open a quote request you took by phone, in person, or in an email thread — an order waiting for your price, plus the request record Price and send a quote reads the customer's address from. Changes remain behind Recued's approval controls.

pack:seller-quote-requestsellerquoteunspecified-pricing
by recued-core pinned v1

Use “Price and send a quote” in Recued. Pin your price onto a waiting quote request, then send the customer a payment link for exactly that figure.

pack:seller-quote-requestsellerquoteunspecified-pricing
by recued-core pinned v6

Use “Quote board” in Recued. Every quote request against one offer, with the two things you act on: which ones are still waiting for your price, and which ones you have priced and are waiting on the customer. It reads information without changing data in the connected service.

pack:seller-quote-requestsellerquoteboard
by recued-core pinned v4
View pack details, dependencies, and permissions →

Taking a quote request in

  1. In Settings -> Seller, create an offer with pricing unspecified and activate it. That is the whole difference between this flow and a fixed-price sale: an unspecified offer has no amount, so an order against it opens in pricing and waits for you.
  2. In Reception, create one public intake form for enquiries. Require visitor email. This recipe declares the answers it reads in requires_form_fields, so pairing it to a form that spells them differently is refused while you are still setting up rather than storing nothing on every submission.

- Destination: form_response. ⛔ Not task — that destination materialises its own record from the visitor's answers on approve, which is not what you want in front of an order.

  1. Accept a test response, open it in Data -> Form responses, choose Automate this form, and clone this installed template. The clone is scoped to that exact form; installing the pack never arms a public trigger.
  2. Set Seller offer to the unspecified offer's id and Sender account to a registered send-capable mail account.
  3. Run one accepted response manually. The card shows the order handle — the only order id a customer may ever be shown — the order sitting in pricing, and the request record this run wrote.
  4. Price it with Price and send a quote. Arm the exact-form trigger only after one request has gone end to end.

⚠ Nothing here names a price, and that is structural rather than stylistic: core.seller.order.open refuses an amount argument outright, so the offer row is the only thing that can carry money and an unspecified offer carries none. The total arrives once, from you, through core.seller.order.quote.

What gets stored locally

Two things are written, in two different places, and they answer different questions.

  • The order lives in the seller store and is the authority on phase and money. Nothing here copies that.
  • The request record lives in this pack's Records storage and holds what the order cannot: the customer's own description of the work, who to address the quote to, their address, the order handle, and when they submitted. Price and send a quote later adds the subject and covering note it emailed.

The row id is derived by the kernel from (offer, submission), so it is the same row on every delivery of the same accepted response.

The run looks for that row before creating it, and the reason is recovery rather than duplication. Open a quote request reports the order as already open on every delivery after the first, so a write gated on that alone would skip forever if a run died between opening the order and writing the row — and the request would never reach the board at all. Gating on the search instead means the next delivery notices the row is missing and writes it.

⚠ requested_at is the visitor's submission time, not the moment the row was written. Sort a board on it for the customer's chronology and on _record.created_at for what this pack learned when — after a recovery run those two are legitimately far apart.

⚠ The description is stored up to 4000 characters, where the card still shows the first 500. The stored copy is the one the board reads.

How it works 56 steps

Inspect the data fetches, transforms, gates, and output this recipe runs.

Data fetch
▼ form_response core.data.form-response.get
Get data form response
▼
Process (55 steps)
■ submission_id default
Apply default
■ response_collection_exact compare
Check if form response record collection is one of form_response
■ response_submission_exact compare
Check if form response record submission id equals event payload record id
■ response_origin_actor_exact compare
Check if form response record origin actor equals anonymous
■ response_accepted compare
Check if form response record lifecycle state equals accepted
■ email_raw default
Apply default
■ email_trimmed trim
Trim whitespace from email raw
■ visitor_email lowercase
Convert email trimmed to lowercase
■ email_present compare
Check if visitor email has data
■ email_has_at compare
Check if visitor email contains @
■ email_bounded_value truncate
Truncate visitor email to a max length
■ email_bounded compare
Check if visitor email equals email bounded value
■ offer_id trim
Trim whitespace from setting seller offer id
■ offer_id_lowercase lowercase
Convert offer id to lowercase
■ offer_id_is_lowercase compare
Check if offer id equals offer id lowercase
■ offer_id_truncated truncate
Truncate offer id to a max length
■ offer_id_bounded compare
Check if offer id equals offer id truncated
■ sender_mail trim
Trim whitespace from setting sender mail instance
■ ack_line_value trim
Trim whitespace from setting ack line
■ inputs_valid all
Check if all conditions are true
⚠ inputs_guard guard
Stop if inputs valid equals
◆ offer_read core.seller.offer.get
Get seller offer
■ offer_found compare
Check if offer read offer exists
■ offer_active all
Check if all conditions are true
■ offer_is_unspecified compare
Check if offer read offer pricing kind is one of unspecified
■ offer_carries_no_amount compare
Check if offer read offer amount minor is missing
■ offer_valid all
Check if all conditions are true
⚠ offer_guard guard
Stop if offer valid equals
◆ order_open core.seller.order.open
Open seller order
■ order_handle default
Apply default
⚠ order_handle_guard guard
Stop if order handle is empty
■ order_in_pricing compare
Check if order open order phase equals pricing
■ order_unpriced compare
Check if order open order amount minor is missing
■ order_shape_valid all
Check if all conditions are true
⚠ order_shape_guard guard
Stop if order shape valid equals
■ already_open compare
Check if order open result does not equal created
■ work_description_raw default
Apply default
■ work_description truncate
Truncate work description raw to a max length
■ contact_name_raw default
Apply default
■ contact_name truncate
Truncate contact name raw to a max length
■ ack_reconciliation template
Generate text from a template
◆ ack_send core.mail.send
Send mail
skip: step.already_open equal true
■ asked_for truncate
Truncate work description raw to a max length
■ requested_at_ms default
Apply default
■ requested_at date_add
Add 0 seconds to
⚠ requested_at_guard guard
Stop if requested at is empty
◆ existing_request recued-core.seller-quote-request.quote_request.search
Search quote request on seller quote request
■ existing_request_rows default
Apply default
■ existing_request_count count
Count items in existing request rows
■ request_already_recorded compare
Check if existing request count is greater than 0
◆ request_create recued-core.seller-quote-request.quote_request.create
Create quote request on seller quote request
skip: step.request_already_recorded equal true
■ request_id coalesce
Use the first available value from: request create record id, existing request rows 0 id
■ request_recorded compare
Check if request id has data
⚠ request_guard guard
Stop if request recorded equals
■ card to_summary
Format results as a summary card
▼
Output
summary card
Settings 3 configurable

Configurable at install. Defaults shown — change them anytime in Recued.

ack line setting = Thanks for the enquiry — we have it, and we will send you a price shortly.
seller offer id setting = [object Object]
sender mail instance setting = [object Object]

Uses (6 operations)

Form responses Get data form response core.data.form-response.get
Selling Get seller offer core.seller.offer.get
Selling Open seller order core.seller.order.open
Mail Send mail core.mail.send
Pack operation Search quote request on seller quote request recued-core.seller-quote-request.quote_request.search
Pack operation Create quote request on seller quote request recued-core.seller-quote-request.quote_request.create

Trust & control

What installing this recipe would let it do. Recued grants these permissions at install — review them there before approving.

What it's allowed to do

Read Form responses core.data.form-response.get read-only
Read Selling core.seller.offer.get read-only
Write Selling core.seller.order.open external change
Write Mail core.mail.send external change
Write Pack Seller Quote Request external change
Read: quote_request.search · No approvalWrite: quote_request.create · No approval

Data it touches

SurfacesForm responsesSellingMail
Warehousedata.maildata.form

About

Tags

pack:seller-quote-requestform-response-templatesellerquoteunspecified-pricingorderreceptionintakemoneyrecordsv3

Details

56 steps 3 configurable settings recipe_id: open-quote-request