Skip to content
Recued
Menu
← Back to recipes

Send approved Stripe invoice recovery exception

by recued-core v1

Action half for the Stripe invoice recovery exception queue. Use this only when Stripe native reminders, failed-payment emails, Smart Retries, or Billing Automations are insufficient: missing primary email with an owner-supplied recipient, additional recipient, custom owner context, disabled recovery, or exhausted recovery. The recipe re-reads the invoice and customer live from Stripe, confirms the invoice remains unpaid and exception-eligible, drafts one concise exception note, sends it through the mail-send approval gate, links the sent mail to the Stripe invoice/customer, and seeds data.shared watch state so the watcher can close the loop. It never changes Stripe invoices, payments, customers, subscriptions, refunds, or payouts.

Complete workflow

One-person-company billing workflow pack over the Stripe capability pack. It installs operating views for daily billing review, invoice recovery exceptions, payment exceptions, and customer cleanup, plus owner-approved recovery-exception email actions that seed the shared reply watcher so customer responses re-enter the daily work loop. Stripe native reminders, failed-payment emails, Smart Retries, and Billing Automations own routine recovery; Stripe invoice sends, refunds, voids, cancellations, and payouts stay in the Stripe capability pack's approval-gated operations.

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

Action half for the Stripe invoice recovery exception queue. Use this only when Stripe native reminders, failed-payment emails, Smart Retries, or Billing Automations are insufficient: missing primary email with an owner-supplied recipient, additional recipient, custom owner context, disabled recovery, or exhausted recovery. The recipe re-reads the invoice and customer live from Stripe, confirms the invoice remains unpaid and exception-eligible, drafts one concise exception note, sends it through the mail-send approval gate, links the sent mail to the Stripe invoice/customer, and seeds data.shared watch state so the watcher can close the loop. It never changes Stripe invoices, payments, customers, subscriptions, refunds, or payouts.

billingstripeinvoice-recoveryrecovery-exceptions
by recued-core pinned v1

Read-only daily billing cockpit for a one-person company. It scans recent Stripe invoices, payments, and customers, then shows open invoice pressure, payment exceptions, and customer data gaps without sending invoices, issuing refunds, or changing Stripe records.

billingstripeback-officecashflow
by recued-core pinned v1

Read-only Stripe invoice recovery exception queue. It assumes Stripe native reminders, failed-payment emails, Smart Retries, and Billing Automations own routine recovery. It surfaces invoices that may need owner exception handling: subscription invoices whose recovery has already started and remains unpaid, and normal invoices past the configured exception window. It drafts an owner action plan without sending invoices or emails.

billingstripeinvoice-recoveryrecovery-exceptions
by recued-core pinned v1

Read-only payment exception queue for Stripe. It separates PaymentIntents that may need customer action from statuses that should stay internal, while assuming Stripe native failed-payment emails, confirmation emails, Smart Retries, and Billing Automations own routine recovery. Customer-actionable rows should only be followed up manually when a documented exception applies.

billingstripepaymentspayment-exceptions
by recued-core pinned v1

Action half for the Stripe payment exceptions queue. Use this only when Stripe native failed-payment emails, payment-confirmation emails, Smart Retries, or Billing Automations are insufficient: missing primary email with an owner-supplied recipient, additional recipient, custom owner context, unavailable recovery, disabled recovery, or exhausted recovery. The recipe re-reads the payment and customer live from Stripe, confirms the status requires customer payment action, sends the owner-configured subject/body or a deterministic fallback through the mail-send approval gate, links the sent mail to the Stripe payment/customer, and seeds data.shared watch state so the watcher can close the loop. It never calls AI, captures payments, retries charges, updates payment methods, creates refunds, changes invoices, changes subscriptions, or mutates Stripe records.

billingstripepaymentspayment-exceptions
by recued-core pinned v1

Read-only Stripe customer cleanup queue. It finds customers missing email or display name so billing, support, and invoice follow-up stay usable without automatically updating Stripe records.

billingstripecustomer-cleanupdata-hygiene
by recued-core pinned v1
Show all 15 recipes
Watch outbound follow-up replies
Background automation

Reactive reply-side of the outbound follow-up loop. On every inbound mail it matches the message by thread against durable data.shared watch state seeded by TWO producers — outbound-follow-up-pressure-producer (status followup_due, watched_contact = the primary recipient) and send-support-reply-from-mail (status watching_customer_response, watched_contact = the customer). It confirms the reply's sender is that watched contact — recovering the contact from the linked source mail (via the stored record_id) when a producer denormalized no address, and failing closed (skipping) when it cannot establish the counterparty — then classifies the reply, advances the shared state to responded_closed or response_needs_owner, and links the reply mail to the watched source mail. Those state transitions are what unified-work-queue and weekly-owner-review read to surface or retire the follow-up. It never sends mail or mutates an external system.

emailmailfollowupreply
by recued-core pinned v1
Stripe billing resolution watcher
Background automation

Scheduled adopter for Stripe billing recovery exception rows in data.shared. It reads the outbound-follow-up watch ledger, re-reads one watched invoice and one watched payment from Stripe, and marks the shared row responded_closed when the source of truth says the invoice is paid/void/uncollectible or the payment no longer needs customer action. It preserves the origin recipe id and does not send mail, notify customers, update Stripe, retry charges, capture payments, void invoices, or create refunds.

billingstripeinvoice-recoveryrecovery-exceptions
by recued-core pinned v1

Reactive outbound mirror of outbound-follow-up-response-watcher. It fires on the same data.mail created stream but processes the OWNER's outbound sends rather than inbound replies: when the owner sends on a thread already tracked in data.shared watch state, it confirms the sender is the owner (derived from the linked source mail's From via the stored record_id) and refreshes the row to watching_customer_response with a fresh last_outbound_at and sent_message_id, moving the ball back to the contact. Refresh-only: it never creates rows (the pressure producer and the send recipes own creation) and never reopens responded_closed threads, and it fails closed (skips) when it cannot confirm the owner or find a matching row. This captures owner replies sent from a normal mail client, which the send recipes cannot record.

emailmailfollowupoutbound
by recued-core pinned v1

Neutral detection recipe for the outbound follow-up loop. It scans one response_needs_owner data.shared watch row, fetches the reply body, extracts possible conversion facets for meeting, task, insight note, commitment, and linked CRM deal next-step updates, writes compatible proposal rows for the matching owner-invoked action recipes, records a per-reply notification marker, and sends one notification that the reply has conversion options. It does not choose an action and never creates calendar events, tasks, notes, commitments, or CRM updates. User intent is expressed later by running one or more manual action recipes.

emailmailfollowupconversion
by recued-core pinned v1

Owner-invoked create half of the meeting-request conversion edge. It reads one awaiting_owner_approval proposal written by outbound-follow-up-meeting-request-calendar (optionally targeted by proposal_thread_key), creates the calendar event from the proposal's already-extracted schedule, links the event back to the reply and source mail, closes the follow-up loop on the source watch row, and marks the proposal scheduled. This recipe is manual-only on purpose: the calendar create (and, on some providers, the attendee invite) is an outward-facing action, and running it is the owner's explicit approval. It takes no calendar action when there is no pending proposal or the proposal lacks a concrete start and end time.

emailmailcalendarmeeting
by recued-core pinned v1

Owner-invoked create half of the task conversion edge. It reads one awaiting_owner_approval proposal written by outbound-follow-up-task-from-reply, optionally targeted by proposal_thread_key, creates a Recued task from the proposal, links the task back to the reply and source mail, closes the source follow-up watch row, and marks the proposal created. This recipe is manual-only on purpose: running it is the owner's approval to turn the proposed reply action into durable work.

emailmailtaskfollowup
by recued-core pinned v1

Owner-invoked create half of the customer-insight note conversion edge. It reads one awaiting_owner_approval proposal written by outbound-follow-up-insight-note-from-reply, optionally targeted by proposal_thread_key, creates a Recued note from the proposal, links the note back to the reply and source mail, and records the note id on the source follow-up watch row WITHOUT closing the loop — an insight note is complementary memory capture, so the thread stays open (its status is preserved) for the actual task/meeting/reply. It marks the proposal created so it is not re-proposed. This recipe is manual-only on purpose: running it is the owner's approval to turn the proposed customer signal into durable relationship memory.

emailmailnotecustomer-insight
by recued-core pinned v1

Owner-invoked create half of the commitment conversion edge. It reads one awaiting_owner_approval proposal written by outbound-follow-up-commitment-from-reply, optionally targeted by proposal_thread_key, creates a Recued commitment from the proposal, links the commitment back to the reply and source mail, and records the commitment id on the source follow-up watch row WITHOUT closing the loop. A commitment is complementary accountability capture, so the thread keeps its current status for the actual task/meeting/reply. It marks the proposal created so it is not re-proposed. This recipe is manual-only on purpose: running it is the owner's approval to turn the proposed promise into durable work.

emailmailcommitmentfollowup
by recued-core pinned v1

Housekeeping GC for the outbound follow-up loop. data.shared writes do not honor ttl (the durable store rejects it), so the per-thread conversion proposals written by the calendar/task/insight-note/commitment/CRM deal update detectors would otherwise persist forever after they are approved. This daily auto_run lists the outbound-follow-up namespace and deletes only proposal rows in a terminal status (scheduled / task_created / note_created / commitment_created / crm_deal_updated). It is safe because re-proposal is already blocked by the conversion id recorded on the source watch row for one-shot conversions (calendar_source_id / task_id / insight_note_id / commitment_id), while CRM deal-update duplicates for the same reply are blocked by the per-reply notification marker plus pending proposal rows. It never touches the watch rows themselves (they stay for re-open on a later reply), and it leaves awaiting_owner_approval proposals alone (they carry no timestamp, so a stale-unactioned proposal cannot be aged out here — record a created_at on proposals if that is wanted later).

followuphousekeepinggcclosed-loop
by recued-core pinned v1
View pack details, dependencies, and permissions →
How it works 88 steps

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

Data fetch
shared_billing_followups ?
Process (87 steps)
target_invoice_id trim
Trim whitespace from setting invoice id
has_invoice_id compare
Check if target invoice id has data
has_sender compare
Check if setting sender mail instance has data
configured_exception_note trim
Trim whitespace from setting exception note
configured_recipient_email trim
Trim whitespace from setting recipient email
configured_subject_override trim
Trim whitespace from setting subject override
has_exception_note compare
Check if configured exception note has data
has_configured_recipient compare
Check if configured recipient email has data
has_subject_override compare
Check if configured subject override has data
allow_repeat_while_open_enabled compare
Check if setting allow repeat while open equals true
invoice ?
skip: step.has_invoice_id not_equal true
invoice_customer_raw default
Apply default
invoice_customer_id default
Apply default
has_customer_id compare
Check if invoice customer id has data
customer ?
skip: step.has_customer_id not_equal true
invoice_status default
Apply default
amount_remaining default
Apply default
amount_due default
Apply default
currency default
Apply default
hosted_invoice_url default
Apply default
invoice_number default
Apply default
due_date default
Apply default
has_due_date compare
Check if due date has data
due_date_ms math
Calculate: {{step.due_date}} * 1000
days_past_due date_diff
Calculate days between due date ms and now
skip: step.has_due_date not_equal true
subscription_id default
Apply default
has_subscription_id compare
Check if subscription id has data
invoice_attempted default
Apply default
attempt_count default
Apply default
has_invoice_attempted compare
Check if invoice attempted equals true
subscription_attempt_threshold_met compare
Check if attempt count is at least setting subscription exception min attempts
subscription_attempt_seen all
Check if all conditions are true
customer_email_from_read default
Apply default
customer_email_from_invoice default
Apply default
has_customer_email_from_read compare
Check if customer email from read has data
customer_email ternary
Apply ternary
has_customer_email compare
Check if customer email has data
target_recipient_email ternary
Apply ternary
has_target_recipient_email compare
Check if target recipient email has data
customer_name default
Apply default
has_remaining_balance compare
Check if amount remaining is greater than 0
subscription_recovery_candidate all
Check if all conditions are true
normal_invoice_old_enough compare
Check if days past due is at least setting normal invoice grace days
normal_invoice_recovery_candidate all
Check if all conditions are true
invoice_recovery_candidate any
Check if any of the conditions are true
invoice_exception_reason ternary
Apply ternary
missing_customer_email_exception all
Check if all conditions are true
additional_recipient_exception all
Check if all conditions are true
owner_documented_exception compare
Check if has exception note equals true
native_recovery_disabled_exception compare
Check if setting exception reason equals native_recovery_disabled
native_recovery_exhausted_exception compare
Check if setting exception reason equals native_recovery_exhausted
exception_eligible any
Check if any of the conditions are true
active_watch_rows_for_invoice filter
Filter by condition
blocking_watch_rows filter
Filter by condition
blocking_watch_count count
Count items in blocking watch rows
has_blocking_watch compare
Check if blocking watch count is greater than 0
block_existing_watch all
Check if all conditions are true
skip_exception_send any
Check if any of the conditions are true
draft ?
skip: step.skip_exception_send equal true
draft_body default
Apply default
has_draft_body compare
Check if draft body has data
skip_send any
Check if any of the conditions are true
subject_text ternary
Apply ternary
send ?
skip: step.skip_send equal true
fail: config.sender_mail_instance is_empty
sent_thread_id default
Apply default
sent_message_id default
Apply default
sent_record_id_primary default
Apply default
sent_record_id default
Apply default
has_sent_thread compare
Check if sent thread id has data
has_sent_record compare
Check if sent record id has data
thread_key_colon replace
Replace text in sent thread id
thread_key_slash replace
Replace text in thread key colon
thread_key_dot replace
Replace text in thread key slash
thread_key_at replace
Replace text in thread key dot
thread_key_space replace
Replace text in thread key at
thread_key_left_angle replace
Replace text in thread key space
thread_key_right_angle replace
Replace text in thread key left angle
thread_key_plus replace
Replace text in thread key right angle
thread_key_equals replace
Replace text in thread key plus
thread_key_question replace
Replace text in thread key equals
skip_watch_seed any
Check if any of the conditions are true
seed_invoice_recovery_exception_watch ?
skip: step.skip_watch_seed equal true
link_sent_mail_to_invoice ?
skip: step.skip_watch_seed equal true
skip_customer_link any
Check if any of the conditions are true
link_sent_mail_to_customer ?
skip: step.skip_customer_link equal true
summary to_summary
Format results as a summary card
draft_preview to_table
Format results as a data table
Settings 12 configurable

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

tone setting = concise_professional
stripe setting =
invoice id setting =
exception note setting =
recipient email setting =
business context setting =
exception reason setting = custom_context
subject override setting =
sender mail instance setting =
allow repeat while open setting = false
normal invoice grace days setting = 14
subscription exception min attempts setting = 2

Trust & control

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

Where it runs

Device + server Runs on your device (browser) or your server.

Permissions it requires

Read your Stripe connectionMail send
Declared by the recipe — Recued grants these at install, where you review them before approving.

Data it touches

Warehousedata.shareddata.maildata.billing

About

Tags

billingstripeinvoice-recoveryrecovery-exceptionscashflowemailmailsend-classclosed-loopone-person-companystate:outbound-follow-up-response-watcherpack:billing-back-office-workflowsai_surface

Details

88 steps 12 configurable settings recipe_id: send-approved-stripe-invoice-chase