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.

Agentic Task
YChartsGoogle CalendarGoogle SheetsGoogle DocsSalesFinanceMeeting WorkflowsAI ReportsDaily Digests

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?
No, it complements it. Most advisor CRMs surface client notes and tasks but do not pull live market data. This brief layers a same-morning portfolio snapshot on top of whatever you already do in Salesforce FSC, Wealthbox, or Redtail.
What if a client holds a mutual fund or ETF, not just stocks?
Both are covered. Stock and ETF tickers use the company lookup, and mutual fund tickers use the fund lookup, so a mixed portfolio gets refreshed in one pass.
How does it know which meetings are client reviews?
You tell it once during setup. You can match by event title prefix like Review or Annual, by attendee email domain, by calendar, or by any combination that fits how you book client meetings.
Can the brief include something other than price and returns?
Yes. YCharts exposes thousands of data points, so you can add things like 52-week high, P/E, dividend coverage, or fund expense ratio, and the brief will fold them into the talking points.
What happens if a client is not in my holdings sheet?
The agent skips the portfolio section and still produces a brief with the meeting time, attendees, and a note that no holdings were found, so you can add them and re-run.

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.