Client meeting prep briefs for wealth advisors
Every weekday at 6:30am ET, get a one-page Google Doc for each client review on your calendar, pre-loaded with portfolio prices, returns, and talking points.
Build me an agent workflow that runs every weekday at 6:30am America/New_York and files a one-page client meeting prep brief as a Google Doc for each client review on my calendar that day. I am a wealth advisor and this runs before my workday starts.
Trigger: cron, every weekday (Mon-Fri) at 6:30am ET.
Inputs the agent should accept as configuration:
- work_calendar_id: the Google Calendar to read (default: primary).
- client_meeting_title_prefix: optional string like "Review" or "Annual Review" used to identify client meetings by event title.
- client_attendee_domains: optional list of email domains that mark an event as a client meeting (use either the prefix, the domains, or both — if both are set, an event matching either rule counts).
- holdings_sheet_id and holdings_range: the Google Sheets spreadsheet that maps client name to holdings. Assume columns: client_name, ticker, security_type ("stock" or "mutual_fund"), shares. Mutual fund tickers in the sheet may or may not include the M: prefix — normalize before calling YCharts.
- output_drive_folder_id: optional folder where the briefs should live (otherwise drop in root).
Steps:
1. Call google-calendar List Events on work_calendar_id for today's date range in America/New_York (timeMin = today 00:00 ET, timeMax = today 23:59 ET, singleEvents = true). Filter to events whose title starts with client_meeting_title_prefix OR whose attendees include an address whose domain is in client_attendee_domains. Skip declined events and events you organized but have no external attendees on.
2. For each matched client meeting, derive the client name. Prefer an explicit "Client: <name>" line in the event description; fall back to the non-internal attendee's display name, then to the event title with the prefix stripped.
3. Call google-sheets Get Values on holdings_sheet_id/holdings_range and filter rows where client_name matches (case-insensitive, trimmed). If no rows match, still produce a brief with the meeting context but a note that no holdings were found.
4. Split holdings by security_type. For stocks/ETFs, batch tickers (up to 100) into a single ycharts Get Company Data Points call with calculation codes: price, day_price_pct_change, ytd_total_return, dividend_yield. For mutual funds, prepend M: to each ticker and batch into a single ycharts Get Mutual Fund Data Points call with the same calculation codes. Handle YCharts response envelope (top-level meta + response keyed by symbol) and surface any per-symbol errors gracefully without aborting the whole brief.
5. Compute, per holding: market_value = shares * price; day_change_value = market_value * (day_price_pct_change / 100). Sum to portfolio_value. Rank holdings by day_change_value to identify the top contributors and top detractors. Flag any holding whose absolute day move is more than 2% as "news-worthy."
6. Draft a one-page brief with these sections: header with client name, meeting time (in ET), and attendees; Portfolio snapshot (total value, day change in $ and %, YTD return weighted by market value, weighted dividend yield); Biggest contributors today (top 3 with $ impact); Biggest detractors today (bottom 3 with $ impact); Notable moves (any "news-worthy" flagged holdings); Suggested talking points (2-3 concise bullets the advisor can riff on, grounded in the data — for example a position that has driven YTD performance, a position whose dividend yield has shifted, a fund whose YTD diverges from the rest of the book).
7. Call google-docs Create Document with title "<Client name> — Prep <YYYY-MM-DD HH:MM ET>" then google-docs Batch Update Document to insert the brief content with simple structure (Heading 1 for the client name, Heading 2 for each section, bullets where appropriate). If output_drive_folder_id is set, move the doc into that folder.
8. After all meetings are processed, write a short run summary to the workflow log: how many meetings matched, how many briefs were created, any clients skipped for missing holdings, and any YCharts symbols that returned errors.
Guardrails: never make up prices or returns — if YCharts has no value for a symbol, mark it as "data unavailable" in the brief instead of guessing. Keep each brief to roughly one page. Use a consistent professional tone, not casual. Do not include client personal data beyond what is on the calendar and in the holdings sheet.
What does this prompt do?
- Scans your work calendar each morning and picks out today's client review meetings using a title prefix or attendee email domain.
- Looks up each client's holdings in your master Google Sheet and pulls current prices, day moves, year-to-date returns, and dividend yields for every position.
- Drafts a clean one-page brief covering portfolio value, biggest movers, news-worthy moves, and two or three talking points for the conversation.
- Files a Google Doc per meeting, named with the client and meeting time, so it is right where you need it before the call.
What do I need to use this?
- A Google Workspace login with access to your work calendar, your client holdings spreadsheet, and Google Docs.
- A YCharts subscription with API access for current prices and fund data on stocks and mutual funds.
- A Google Sheet that maps each client name to the tickers they hold (and ideally share counts) so the brief can compute portfolio value.
How can I customize it?
- Change the run time or skip weekends, holidays, or any day you set aside for planning instead of client meetings.
- Adjust how client meetings are identified, by event title prefix, attendee domain, calendar label, or a specific calendar.
- Swap or extend the data points pulled from YCharts, for example adding 1-year return, beta, or expense ratio for fund-heavy books.
- Move the brief somewhere else, like a shared Drive folder, an email to yourself, or a Slack DM with a link to the doc.
FAQs
Does this replace my CRM meeting prep?
What if a client holds a mutual fund or ETF, not just stocks?
How does it know which meetings are client reviews?
Can the brief include something other than price and returns?
What happens if a client is not in my holdings sheet?
Related templates
Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.
Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.
Work every return, damage and warranty claim in one queue, with the order, the delivery date and a policy-backed recommendation already on screen.
A board of the questions your buyers ask, showing where your pages land, which competitors show up instead, and what you lost since the last check.
See exactly which ingredients next week needs based on what you actually sold, adjust anything by hand, then build a one-click grocery cart.
See follower growth, posting cadence, format mix and engagement rate for your brand and every competitor you track, side by side on one board.
Stop scrambling for portfolio numbers before client calls.
Connect Google Workspace and YCharts once, and Geni files a prep brief for every client review on your calendar by 6:30am.