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.
Additional information
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.
Frequently asked questions
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?
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.