FIGURE 20

Withdrawal & Termination Flows — Under-Claimed Patentable Methods

OFFRPORTL — Offer Withdrawal, Counter Withdrawal, Contract Termination, and Reinstatement State Machines with Per-Party Notification Dispatch
Abstract
A computer-implemented system for managing real estate offer withdrawal, counter offer withdrawal, contract termination, and post-termination reinstatement within a unified offer entity state machine. The system defines four distinct status-transition workflows, each with: eligibility validation (status gate), atomic document persistence (PDF URL + reason + timestamp), dedicated per-party notification dispatch, and per-viewer acknowledgment tracking arrays. Offer withdrawal transitions submitted/under_review/countered → withdrawn with buyer-agent-initiated action. Contract termination is gated exclusively to accepted offers and transitions to "terminated" with multi-party notification. A reinstatement sub-workflow allows either party to propose and the opposing party to accept/reject recovery, with acceptance reverting status to "accepted". All 19 workflow-specific fields are persisted on the Offer entity, creating a complete audit trail from submission through termination and reinstatement.
§1 — Complete State Transition Table (Withdrawal, Termination & Reinstatement)
From StateTriggering EventTo StateFields WrittenNotification
submittedBuyer agent withdrawswithdrawnwithdrawn_at, withdrawal_reason, withdrawal_pdf_urlsendWithdrawalNotifications → listing agent
under_reviewBuyer agent withdrawswithdrawnwithdrawn_at, withdrawal_reason, withdrawal_pdf_urlsendWithdrawalNotifications → listing agent
counteredBuyer agent withdrawswithdrawnwithdrawn_at, withdrawal_reason, withdrawal_pdf_urlsendWithdrawalNotifications → listing agent
counteredListing agent withdraws countersubmittedcounter_withdrawn, counter_withdrawal_pdf_url, counter_withdrawal_reason, counter_withdrawn_atsendCounterWithdrawalNotifications → buyer agent
acceptedListing agent terminatesterminatedterminated_at, termination_reason, termination_pdf_urlsendTerminationNotifications → buyer agent + buyer
terminatedEither party proposes reinstatementterminated (reinstatement pending)reinstatement_proposed_by, reinstatement_pdf_url, reinstatement_notes, reinstatement_proposed_at, reinstatement_status = pendingsendReinstatementNotifications → opposing party
terminated (reinstatement pending)Opposing party accepts reinstatementacceptedreinstatement_status = accepted, reinstatement_accepted_at, reinstatement_accepted_pdf_urlsendReinstatementAcceptedNotifications → both parties
terminated (reinstatement pending)Opposing party rejects reinstatementterminatedreinstatement_status = rejectedNo email sent
§2 — Offer Withdrawal Flow (6 Steps)
1
BUYER AGENT — Initiates Offer Withdrawal
Buyer agent accesses OfferDetails page for a submitted or countered offer. Clicks "Withdraw Offer" action. WithdrawOfferModal opens. Agent may optionally upload a withdrawal PDF (e.g., signed withdrawal form) and enter a withdrawal reason/message.
2
SYSTEM — Validates Withdrawal Eligibility
System checks offer.status is withdrawable: "submitted", "under_review", or "countered". Offers in "accepted", "rejected", "sold", or "terminated" states cannot be withdrawn. If ineligible, withdrawal action is hidden from UI.
3
SYSTEM — Atomic Status Transition + Document Persistence
Offer entity updated atomically: status → "withdrawn", withdrawn_at → server timestamp (ISO datetime), withdrawal_reason → agent-entered text, withdrawal_pdf_url → uploaded PDF URL (if provided). All fields written in a single entity update call.
4
SYSTEM — Dispatches Withdrawal Notification Email
sendWithdrawalNotifications backend function invoked with offer_id. Function loads offer entity, identifies listing agent email, and sends timestamped withdrawal notification. Email body includes property address, offer price, withdrawal reason (if provided), and withdrawal timestamp.
5
SYSTEM — Listing Agent Notification Acknowledged
Layout notification system surfaces withdrawal to listing agent: "↩️ Offer Withdrawn — [property]". withdrawal_notification_acknowledged_by array tracks per-viewer acknowledgment. Unacknowledged withdrawals increment unread badge count. Clicking notification marks as acknowledged.
6
LISTING AGENT — Views Updated Offer Status
OfferDetails page reflects updated status badge: "Withdrawn". withdrawn_at timestamp displayed. withdrawal_reason shown if provided. withdrawal_pdf_url rendered as downloadable document link. Offer removed from active pipeline views but retained in full offer history.
§3 — Contract Termination Flow (6 Steps)
1
LISTING AGENT — Initiates Contract Termination
Listing agent accesses OfferDetails for an accepted offer (status = "accepted"). Clicks "Terminate Contract" action. TerminateContractModal opens. Agent uploads termination PDF (required — e.g., Notice of Termination) and enters termination reason.
2
SYSTEM — Validates Termination Eligibility
System checks offer.status = "accepted". Only accepted offers (active contracts) can be terminated. Offers in pre-acceptance states use the withdrawal flow instead. Termination action gated in UI: only visible when status = "accepted".
3
SYSTEM — Atomic Status Transition + Document Persistence
Offer entity updated atomically: status → "terminated", terminated_at → server timestamp (ISO datetime), termination_reason → agent-entered text, termination_pdf_url → uploaded termination document URL. Written in single entity update call alongside all existing offer data.
4
SYSTEM — Dispatches Termination Notification to All Parties
sendTerminationNotifications backend function invoked with offer_id. Loads full offer entity. Sends notification emails to: buyer agent (buyer_agent_email), buyer (buyer_email), and optionally seller (seller_email). Email includes property address, termination reason, timestamp, and link to portal.
5
SYSTEM — Reinstatement Pathway Becomes Available
After termination, either party may propose reinstatement via ProposeReinstatementModal. Reinstatement fields on offer entity: reinstatement_proposed_by (listing_agent | buyer_agent), reinstatement_pdf_url, reinstatement_notes, reinstatement_proposed_at, reinstatement_status (pending | accepted | rejected). This creates a structured recovery workflow from a terminated contract.
6
BUYER AGENT — Receives & Acknowledges Termination
Buyer agent and buyer receive termination email notification. termination_notification_acknowledged_by array tracks per-viewer acknowledgment on offer entity. Unacknowledged terminations surface in notification bell. OfferDetails reflects status = "terminated", terminated_at, and downloadable termination_pdf_url.
§4 — Post-Termination Reinstatement Flow (3 Steps)
1
EITHER PARTY
Proposes Reinstatement
After termination, either listing agent or buyer agent accesses OfferDetails and clicks "Propose Reinstatement". ProposeReinstatementModal opens. Party uploads reinstatement proposal PDF and enters notes. reinstatement_proposed_by set to the initiating party's role.
2
SYSTEM
Persists Reinstatement Proposal
Offer entity updated: reinstatement_proposed_by, reinstatement_pdf_url, reinstatement_notes, reinstatement_proposed_at, reinstatement_status = "pending". Offer status remains "terminated" until reinstatement is accepted. Opposing party notified via sendReinstatementNotifications.
3
OPPOSING PARTY
Reviews & Responds to Reinstatement
Opposing party (the party who did not propose) sees reinstatement proposal in OfferDetails. Can Accept (uploads acceptance PDF → sendReinstatementAcceptedNotifications called, offer status → "accepted", reinstatement_status → "accepted") or Reject (reinstatement_status → "rejected", status remains "terminated").
§5 — Offer Entity: All Withdrawal, Termination & Reinstatement Fields (19 Fields)
FieldTypeDescription
withdrawal_pdf_urlstringURL to uploaded withdrawal document. Optional. Rendered as downloadable link in OfferDetails.
withdrawal_reasonstringFree-text reason for withdrawal entered by buyer agent at time of withdrawal.
withdrawn_atdatetimeServer-side ISO timestamp of withdrawal. Set atomically with status = "withdrawn".
withdrawal_notification_acknowledged_byarrayArray: [{viewer_email, acknowledged_at}]. Tracks per-party acknowledgment of withdrawal notification.
termination_pdf_urlstringURL to uploaded termination notice document. Required for termination flow.
termination_reasonstringFree-text reason for contract termination entered by listing agent.
terminated_atdatetimeServer-side ISO timestamp of termination. Set atomically with status = "terminated".
termination_notification_acknowledged_byarrayArray: [{viewer_email, acknowledged_at}]. Tracks per-party acknowledgment of termination notification.
reinstatement_proposed_byenumWhich party proposed reinstatement after termination.Values: listing_agent | buyer_agent
reinstatement_pdf_urlstringURL to uploaded reinstatement proposal document.
reinstatement_notesstringFree-text notes accompanying reinstatement proposal.
reinstatement_proposed_atdatetimeTimestamp of reinstatement proposal.
reinstatement_statusenumCurrent status of reinstatement proposal.Values: pending | accepted | rejected
reinstatement_accepted_atdatetimeTimestamp when opposing party accepted reinstatement. Offer status reverts to "accepted".
reinstatement_accepted_pdf_urlstringURL to acceptance document uploaded by opposing party upon reinstatement acceptance.
counter_withdrawnbooleanTrue when listing agent withdraws a previously issued counter offer. Separate from offer withdrawal.
counter_withdrawal_pdf_urlstringURL to counter offer withdrawal document.
counter_withdrawal_reasonstringReason for counter offer withdrawal.
counter_withdrawn_atdatetimeTimestamp of counter offer withdrawal.
§6 — Backend Notification Functions (5)
sendWithdrawalNotifications
Trigger: Buyer agent withdraws offer via WithdrawOfferModal
Recipients: Listing agent (listing_agent_email)
Payload: property_address, offer_price, withdrawal_reason, withdrawn_at, portal link
sendCounterWithdrawalNotifications
Trigger: Listing agent withdraws counter offer
Recipients: Buyer agent (buyer_agent_email)
Payload: property_address, counter_price, counter_withdrawal_reason, counter_withdrawn_at, portal link
sendTerminationNotifications
Trigger: Listing agent terminates accepted contract
Recipients: Buyer agent + Buyer (buyer_agent_email, buyer_email)
Payload: property_address, termination_reason, terminated_at, termination_pdf_url, portal link
sendReinstatementNotifications
Trigger: Either party proposes reinstatement
Recipients: Opposing party (buyer_agent or listing_agent)
Payload: property_address, proposed_by, reinstatement_notes, reinstatement_proposed_at, portal link
sendReinstatementAcceptedNotifications
Trigger: Opposing party accepts reinstatement
Recipients: Both parties (buyer_agent_email + listing_agent_email)
Payload: property_address, reinstatement_accepted_at, portal link — offer reverts to accepted
§7 — UI Modal Components (5)
WithdrawOfferModal
Buyer agent only. Validates offer is in withdrawable state. Optional PDF upload + reason. Sets status = "withdrawn" atomically.
WithdrawCounterOfferModal
Listing agent only. Withdraws a countered offer back to "submitted" state. Separate document and reason fields.
TerminateContractModal
Listing agent only. Only visible when status = "accepted". Requires PDF upload + reason. Sets status = "terminated".
ProposeReinstatementModal
Either party. Only visible when status = "terminated". Uploads reinstatement PDF, enters notes. Sets reinstatement_status = "pending".
AcceptReinstatementModal
Opposing party only. Accepts reinstatement proposal. Uploads acceptance PDF. Reverts offer status to "accepted".
§8 — Key Patentable Claims Summary
Claim 1.A computer-implemented method for managing offer withdrawal in a real estate portal comprising: validating that offer.status is in a withdrawable set (submitted | under_review | countered) before rendering the withdrawal action, atomically updating offer.status to "withdrawn" alongside withdrawn_at timestamp, withdrawal_reason, and withdrawal_pdf_url in a single entity write, and dispatching a withdrawal notification email to the listing agent via a dedicated backend function.
Claim 2.The method of claim 1, further comprising a counter offer withdrawal sub-flow distinct from offer withdrawal, wherein the listing agent may retract a previously issued counter offer, transitioning offer.status from "countered" back to "submitted" and setting counter_withdrawn, counter_withdrawal_pdf_url, counter_withdrawal_reason, and counter_withdrawn_at fields, with notification dispatched exclusively to the buyer agent.
Claim 3.A computer-implemented method for managing contract termination in a real estate offer portal comprising: gating the termination action to offers with status = "accepted" only, requiring a termination PDF upload alongside a free-text reason, atomically updating offer.status to "terminated" with terminated_at timestamp and termination_pdf_url, and dispatching termination notifications to both buyer agent and buyer email addresses via a dedicated backend function.
Claim 4.The method of claim 3, further comprising a structured reinstatement workflow triggered by contract termination, wherein either party may propose reinstatement by uploading a reinstatement PDF and entering notes (reinstatement_status = "pending"), and the opposing party may accept (reverting offer.status to "accepted", recording reinstatement_accepted_at and reinstatement_accepted_pdf_url) or reject (reinstatement_status = "rejected"), with dedicated notification functions for each outcome, creating a complete terminated-to-reinstated state recovery path on the Offer entity.
Fig. 20 — Withdrawal & Termination Flows. Four distinct status-transition workflows: (1) Offer withdrawal (submitted|under_review|countered → withdrawn) initiated by buyer agent with optional PDF and reason; (2) Counter offer withdrawal (countered → submitted) initiated by listing agent; (3) Contract termination (accepted → terminated) initiated by listing agent with required PDF, multi-party notification; (4) Post-termination reinstatement (terminated → accepted) via bilateral proposal-acceptance workflow. All 19 workflow-specific fields persisted on Offer entity with per-viewer acknowledgment tracking arrays. Five dedicated backend notification functions with targeted recipient lists. Five role-gated UI modal components controlling access by offer status and initiating party.