Recued
Menu
← Back to recipes

Observe a quote payment

by recued-core v3 38 views

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

Complete workflow

Seller Quote Payment Events 1 pinned recipe

Use Seller Quote Payment Events in Recued for webhook and provider source truth. It includes 2 related packs in one install.

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

Observe a quote payment
This recipe Background automation

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

pack:seller-quote-payment-eventsrecipe-role:webhooksellerquote
by recued-core pinned v3
View pack details, dependencies, and permissions →

Closing the loop

Without this recipe a quote reaches awaiting_payment and stops: core.seller.order.confirm-payment is the only route to paid, and it needs provider evidence that only a webhook-scoped run can gather.

  1. Install Seller Quote Payment Events. If Seller Quote Request is not installed yet, the same dialog lists it under the packs it brings in: choose Read + write for it. Its own workflows open and price requests, and Read only refuses them. (If the dialog does not list it — a server older than this feature — install Seller Quote Request first, with Read + write.)
  2. The install asks you to pick the Stripe webhook ingress that quote_payment_events listens on — enabled, paired with your Stripe connection, and subscribed to checkout.session.completed + checkout.session.async_payment_succeeded (the async one matters for delayed methods — a bank debit completes minutes or days later).
  3. Use the same Stripe connection the pricing recipe uses.
  4. Set Sender account if you want the customer to get a confirmation from you as well as Stripe's own card receipt.

⚠ Why this lives in its own pack. Seller Quote Request keeps its requests in pack-owned Records storage, and a Records pack cannot carry a webhook binding — its install promotes storage atomically and a webhook sidecar cannot join that. Until this recipe moved here, quote_payment_events had nowhere to be bound, so a paid quote never reached paid.

⚠ The webhook payload is never the evidence. Every figure that authorizes the transition comes from a fresh Session read over your connection. That is why an attacker who could forge a delivery still cannot mark an order paid.

⚠ Offline payments do not come through here. A cheque or bank transfer produces no Stripe session, so no evidence can exist and the order stays in awaiting_payment by design — paid is evidence-backed on purpose. Track that work on the job board instead of forcing it through an order.

How it works 49 steps

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

Process (49 steps)
◆ webhook_event core.webhook.event.get
Get webhook event
■ profile_exact compare
Check if webhook event delivery profile id is one of stripe.event.v1
■ decoded_schema_exact compare
Check if webhook event delivery decoded schema id is one of stripe.event.v1
■ transport_exact compare
Check if webhook event delivery transport assurance is one of authenticated
■ source_truth_policy_exact compare
Check if webhook event delivery minimum source truth policy is one of provider_readback_required
■ freshness_exact compare
Check if webhook event delivery freshness checked is one of true
■ payload_object_exact compare
Check if webhook event payload object is one of event
■ payload_event_id_exact compare
Check if webhook event payload id is one of webhook event event provider event id
■ payload_event_type_exact compare
Check if webhook event payload type is one of webhook event event provider event type
■ envelope_shared_valid all
Check if all conditions are true
■ payment_event_type compare
Check if webhook event event provider event type is one of checkout.session.completed,checkout.session.async_payment_succeeded
■ payment_resource_object_exact compare
Check if webhook event payload data object object is one of checkout.session
■ payment_session_id_exact compare
Check if webhook event payload data object id is one of webhook event event provider resource id
■ payment_session_id_prefix starts_with
Check if webhook event event provider resource id starts with cs_
■ payment_session_id_truncated truncate
Truncate webhook event event provider resource id to a max length
■ payment_session_id_bounded compare
Check if webhook event event provider resource id is one of payment session id truncated
■ order_handle_prefix starts_with
Check if webhook event payload data object client reference id starts with oh_
■ order_handle_truncated truncate
Truncate webhook event payload data object client reference id to a max length
■ order_handle_bounded compare
Check if webhook event payload data object client reference id is one of order handle truncated
■ payment_envelope_valid all
Check if all conditions are true
◆ payment_order_read core.seller.order.get
Get seller order
skip: step.payment_envelope_valid equal false
■ payment_order_found compare
Check if payment order read order exists
■ payment_phase_eligible compare
Check if payment order read order phase is one of awaiting_payment
■ payment_already_paid compare
Check if payment order read order phase is one of paid,fulfilling,approved,delivering,complete
■ payment_session_matches_order compare
Check if webhook event payload data object id is one of payment order read order provider session id
■ payment_read_allowed all
Check if all conditions are true
◆ payment_session_read recued-core.seller-stripe.checkout.session.read
Read checkout session on seller stripe
skip: step.payment_read_allowed equal false
■ session_id_matches compare
Check if payment session read result id is one of payment order read order provider session id
■ session_status_complete compare
Check if payment session read result status is one of complete
■ session_paid compare
Check if payment session read result payment status is one of paid
■ session_mode_payment compare
Check if payment session read result mode is one of payment
■ session_reference_matches compare
Check if payment session read result client reference id is one of payment order read order order handle
■ session_metadata_matches compare
Check if payment session read result metadata recued workflow key is one of payment order read order order key
■ session_amount_matches compare
Check if payment session read result amount total equals payment order read order amount minor
■ payment_order_currency_lower lowercase
Convert payment order read order currency to lowercase
■ session_currency_matches compare
Check if payment session read result currency equals payment order currency lower
■ session_payment_intent_present compare
Check if payment session read result payment intent exists
■ payment_confirm_allowed all
Check if all conditions are true
◆ confirm_payment core.seller.order.confirm-payment
Confirm payment seller order
skip: step.payment_confirm_allowed equal false
■ payment_advanced compare
Check if confirm payment order phase is one of paid
■ payment_source_mismatch all
Check if all conditions are true
■ payment_correlation_mismatch all
Check if all conditions are true
■ payment_phase_ineligible all
Check if all conditions are true
■ sender_mail trim
Trim whitespace from setting sender mail instance
■ defaults defaults
Apply defaults
■ receipt_skip any
Check if any of the conditions are true
■ receipt_reconciliation template
Generate text from a template
◆ receipt_send core.mail.send
Send mail
skip: step.receipt_skip equal true
■ event_summary to_summary
Format results as a summary card
▼
Output
summary event_summary
Settings 1 configurable

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

sender mail instance setting =

Uses (5 operations)

Webhooks Get webhook event core.webhook.event.get
Selling Get seller order core.seller.order.get
Pack operation Read checkout session on seller stripe recued-core.seller-stripe.checkout.session.read
Selling Confirm payment seller order core.seller.order.confirm-payment
Mail Send mail core.mail.send

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 Webhooks core.webhook.event.get read-only
Read Selling core.seller.order.get read-only
Write Selling core.seller.order.confirm-payment external change
Write Mail core.mail.send external change

1 more isn't listed here. You'll see it at install.

Data it touches

SurfacesWebhooksSellingMail
Warehousedata.objectdata.mail

About

Tags

pack:seller-quote-payment-eventsrecipe-role:webhooksellerquotepaymentwebhookstripeverified-eventmoneyv1

Details

49 steps 1 configurable settings recipe_id: observe-quote-payment