Recued
Menu
← Back to recipes

Open a quote request

by recued-core v3 11 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 “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 v3

Use “Observe a quote payment” in Recued. It carries out the named workflow using the connections and settings you choose.

pack:seller-quote-requestsellerquotepayment
by recued-core pinned v1

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 v3
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 ?
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 ?
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 ?
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 ?
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 ?
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 ?
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
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]

Trust & control

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

Data it touches

Warehousedata.maildata.form

About

Tags

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

Details

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