Home / Real Estate Agents / Contract deadline calendar: confirmed dates to Google Calendar with reminders (optional dotloop pre-fill)
Real Estate Agents problem 2: Contract deadlines live in a PDF and a sticky note
Contract deadline calendar: confirmed dates to Google Calendar with reminders (optional dotloop pre-fill)
After you or your transaction coordinator confirm the dates in a short form (option period, inspection, appraisal, financing, title, final walkthrough, closing), the workflow puts each one on Google Calendar as an all-day event with an email reminder 3 days before and a pop-up the day before, invites the TC, and emails a summary with an .ics file. Weekends and federal holidays are flagged, not moved: your contract decides how they count. Amendments move the existing events; a terminated deal removes them. Every morning you get a digest of what's due in the next 3 days.
The problem
A missed option or financing deadline can cost the client their earnest money or the deal. The figures below come from a vendor's count of forum comments and an industry survey.
- In Sifta's count of 7,439 agent comments, transaction paperwork and deadlines was the second most common complaint (319 comments), after prospecting (426). Vendor analysis. Source: Sifta: What real estate agents complain about (7,439 r/realtors and r/RealEstate comments, July 2026) (Vendor analysis of public forum comments)
- NAR's 2025 Member Profile: the typical member completed 10 transaction sides in 2024, so most agents juggle only a few deals at once and have no dedicated TC. Source: NAR, Income Steady, Even as Market Slows: 2025 Member Trends (Aug 6, 2025, on the 2025 Member Profile) (Industry association survey)
- dotloop and other transaction-management tools have task templates and due dates; if your team lives in them, you may not need this. This recipe puts the dates on everyone's normal calendar. Source: dotloop Public API v2 (OAuth 2.0; access tokens expire after about 12 hours and are refreshed) (Vendor API documentation)
Who it's for
US solo agents and small teams who track deadlines by hand or in a spreadsheet, with or without a transaction coordinator.
Tools and monthly cost
| Tool | Official price |
|---|---|
| Google Calendar (the deadline events and reminders) | Free with a Google account or the Google Workspace plan you already have; the Calendar API has no usage fee pricing page |
| Resend (sends the emails) | Free: 3,000 emails / month, 100 / day. Pro: $20 / month for 50,000 pricing page |
| dotloop (optional: pre-fills the deadline form from a loop) | Premium: $34.99 / month or $344 / year (dotloop's only published price). API access needs dotloop to approve your app; Teams and Business+ are quote-only pricing page |
| n8n | Community Edition: free if you self-host (you pay for the server). n8n Cloud: from EUR 20 / month (Starter) or EUR 50 (Pro) pricing page |
Example month: Illustrative arithmetic. Assume 3 new contracts and 2 amendments a month: about 21 calendar events and 10 summary emails, plus 30 daily digests. Google Calendar's API has no fee and the emails fit Resend's free tier. About $0 a month plus your n8n server. dotloop is optional and only if you already use it.
Setup
- Create a Google Calendar for deals (or use your own), share it with your TC, and connect n8n's Google Calendar credential (OAuth). Set GCAL_CALENDAR_ID and DEADLINE_REMINDER_MINUTES if you want different reminders.
- Host the deadline form (included) where you and the TC can reach it; set E2_FORM_KEY (a long random string the form sends) and E2_FORM_URL. The form has a hidden company_website field: bots that fill it are ignored.
- Optional dotloop pre-fill: register an app with dotloop's developer program (API access needs dotloop's approval; plan requirements are quote-based), then set DOTLOOP_CLIENT_ID, DOTLOOP_CLIENT_SECRET, DOTLOOP_ACCESS_TOKEN, DOTLOOP_REFRESH_TOKEN and DOTLOOP_PROFILE_ID. Tokens expire after about 12 hours; the workflow refreshes them and retries once.
- Set AGENT_NAME, AGENT_FIRST, AGENT_LICENSE, AGENT_PHONE, AGENT_MOBILE, AGENT_EMAIL, AGENT_TZ, BROKERAGE_NAME, BROKERAGE_LICENSE, OFFICE_ADDRESS and EMAIL_FROM from .env.example. Every message is signed with your name, license number, brokerage, phone and office address; ask your broker what your state requires. TC_EMAIL gets the summaries and invitations.
- Enter one past deal with known dates and compare the calendar against the contract before you rely on it. The workflow also has a manual 'run now' webhook used by our tests. Delete it, or put it behind n8n's header authentication, before you go live.
Download
Download real-estate-contract-deadline-calendar.zip
Contains the n8n workflow, the mock data, the test runner with its last results, and the mock server we tested against. All keys in .env.example are fake.
Test result
Every workflow was imported into n8n 2.45.4 and run end to end on our test machine. Follow Up Boss, dotloop, Google Calendar, Google Sheets, Twilio and the email sender (Resend, including its inbound webhook) were replaced by a local mock server built from their official API docs: it checks the same request shapes and required fields, enforces Follow Up Boss's rate limit (HTTP 429 with Retry-After), expires dotloop's access token so the refresh path runs, and records every call. Webhook signatures (Follow Up Boss FUB-Signature, Twilio X-Twilio-Signature, Resend/Svix) are really computed and checked. These recipes use no AI model; every decision is a written rule. Leads, clients, agents, brokerages and addresses are invented. Nothing was sent to a real phone, person or account.
8/8 scenarios passed (run 2026-10-28)
| PASS | C2 | dotloop loop id without confirmation: reads the loop (token expired -> refresh -> retry), emails the TC the dates to check with a pre-filled link; no calendar writes |
| PASS | C1 | Confirmed manual entry: 7 all-day events (email 3 days + popup 1 day before, agent + TC invited, sendUpdates=all), summary + .ics; Saturday and Thanksgiving flagged but not moved |
| PASS | C3 | Bad input: inspection after closing, an unparseable date, and no 'confirmed' tick: nothing written, one email listing every problem |
| PASS | C4 | Amendment moves closing to Dec 18: one PATCH of the existing event (no duplicate), summary shows old -> new |
| PASS | C5 | Same form submitted again: no calendar calls, 'no changes' email |
| PASS | C6 | Honeypot filled, then wrong form key: both ignored |
| PASS | C7 | Daily digest Nov 10: lists inspection (Nov 12) only; second run the same day sends nothing |
| PASS | C8 | Deal terminated: all 7 events deleted with sendUpdates=all; later digests skip it |
Actual output from the test run
Scenario C1: the summary email after the dates were confirmed (invented deal). Names and numbers are invented.
Subject: Deadline calendar updated - 9 Oak Ln, Austin TX 9 Oak Ln, Austin TX - Effective (binding) date: Mon Nov 2, 2026 added - Earnest money due: Thu Nov 5, 2026 added - Inspection / option period ends: Thu Nov 12, 2026 added - Appraisal deadline: Sat Nov 21, 2026 added - Title / survey objections due: Fri Nov 20, 2026 added - Financing contingency ends: Thu Nov 26, 2026 added - Closing: Fri Dec 11, 2026 added Check these: - Appraisal deadline falls on a Saturday (Sat Nov 21, 2026). Not moved: check how your contract counts weekends and holidays. - Financing contingency ends falls on a federal holiday (Thanksgiving Day) (Thu Nov 26, 2026). Not moved: check how your contract counts weekends and holidays. Calendar invites went to jordan@example.com, tc@example.com. The attached .ics has every current deadline for anyone not on Google Calendar. Dates come from the contract as confirmed by the team; this calendar is a reminder, not the contract.
Verified with mocks
- Confirmed manual entry: 7 all-day events with an email reminder 3 days before and a pop-up 1 day before, agent and TC invited, plus a summary email with an .ics attachment. A Saturday deadline and Thanksgiving are flagged in the summary and left on their dates.
- A dotloop loop id without confirmation: reads the loop (an expired token is refreshed and the call retried), emails the TC the dates to check with a pre-filled form link, and writes nothing to the calendar.
- Bad input (inspection after closing, an unreadable date, no 'confirmed' tick): nothing written, one email listing every problem.
- An amendment moving closing updates the existing event instead of adding a duplicate; the summary shows old and new dates. The same form sent twice changes nothing.
- Daily digest lists only deadlines in the next 3 days and is sent once a day. A terminated deal's events are all deleted and later digests skip it.
- Honeypot submissions and a wrong form key are ignored.
- Verified with mocks; fictional people only.
Documented from official API docs only
Built to the vendor's documentation but not run against a live account. Check these on yours.
- Google Calendar API events insert / patch / delete with reminders, attendees and sendUpdates (from Google's docs; tested against a mock).
- dotloop Public API v2 loop details and the OAuth 2.0 refresh flow (from dotloop's API docs; not run against a live dotloop account, which needs an approved app).
- US federal holiday list for flags: computed in the workflow; state holidays are not included.
Limitations
- It never reads dates out of a contract by itself: a person types or confirms every date. That is deliberate; a misread date is worse than none.
- Holiday and weekend handling differs by state form and contract. We flag those dates; we don't move them. Check your contract's definition of days.
- Built for Google Calendar. Outlook, SkySlope and other transaction tools are not built.
- Not legal advice. Your contract and your broker decide what each deadline means.