Google Contacts Birthday and Anniversary Outreach
Each morning the flow checks Google Contacts for birthdays or work anniversaries that day, sends a personalized email or Teams message, logs the touch in Dataverse, and notifies the owner. Automates relationship-building outreach from the contact list.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow automates relationship-building outreach for birthdays and work anniversaries. Every morning it reads the Google Contacts directory, looks up which contacts have a birthday or work anniversary today from a Dataverse registry, sends each a personalized Outlook email, notifies the relationship owner in Microsoft Teams, and logs the touch to a Dataverse audit table.
Why it matters: Personal touches build relationships but are easy to forget. Automating birthday/anniversary outreach keeps it consistent and gives a governed, auditable record of every touch.
Status: Built and verified (Flow Checker 0 errors / 0 warnings). Ships Off — going live requires only authorizing the four connections and setting the environment variable values.
Use Case
A relationship-driven team (Sales / Marketing) wants timely, personalized outreach to contacts on their special dates, without a person having to remember and draft each message. The owner is kept in the loop via Teams, and every touch is recorded for reporting.
Design Note — Why Important Dates Live in Dataverse: The Google Contacts connector's PeopleApiListContactsV4 operation does not expose birthday, anniversary, or event fields (verified limitation). To stay connector-first while still honoring the brief, the flow reads the live Google Contacts directory with the real connector action (source of truth for the contact list and current display name), and sources the actual birthday / anniversary dates from a dedicated Dataverse table (Contact Important Date), which the V4 connector cannot surface. This keeps the contact directory governed by Google Contacts while making the date-driven logic reliable and reportable.
Flow Architecture
Recurrence
Recurrence (Day/1, 08:00 EST)Runs every morning.
Initialize Today Month
Initialize VariablevarTodayMonth = current MM.
Initialize Today Day
Initialize VariablevarTodayDay = current dd.
Initialize Owner Email
Initialize VariableFallback owner email (env var).
Initialize Teams Group Id
Initialize VariableTeams team id (env var).
Initialize Teams Channel Id
Initialize VariableTeams channel id (env var).
Initialize Company Name
Initialize VariableCompany name for templates (env var).
Initialize Birthday Template
Initialize VariableEditable HTML birthday greeting.
Initialize Anniversary Template
Initialize VariableEditable HTML anniversary greeting.
Read Google Contacts Directory
Google Contacts PeopleApiListContactsV4Reads the live contact directory (source system).
Get Today Important Dates
Dataverse ListRecordsGets Contact Important Date rows where month/day = today.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_OwnerEmail | String | — | Fallback relationship-owner email when a date row has no owner. |
| flowlibs_TeamsGroupId | String | — | Target Teams team (group) id for owner notifications. |
| flowlibs_TeamsChannelId | String | — | Target Teams channel id for owner notifications. |
| flowlibs_CompanyName | String | — | Company name injected into the greeting templates. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Google Contacts | shared_googlecontacts | PeopleApiListContactsV4 |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
| Microsoft Teams | shared_teams | PostMessageToConversation |
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Greeting wording
- Edit the Initialize Birthday Template / Initialize Anniversary Template values; keep the {Name} and {Company} placeholders.
- Send time
- Change the Recurrence schedule (default 08:00 EST).
- Owner approval
- Insert an Approvals action before Send Outreach Email to let the owner review the draft first.
- Lead time
- Add a second branch that notifies the owner one day before (match tomorrow's month/day).
- Channel choice
- Gate Send Outreach Email vs Notify Owner In Teams on a new env var to switch between email-only and Teams-only modes.
- Onboarding the dates
- Seed Contact Important Date from a one-time import or a companion flow; the V4 connector cannot read birthdays directly.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Today's month / day
Current month and day for the date match.
EXPR.02Dataverse today filter
ListRecords filter for today's events.
EXPR.03Match Google contact by email (Filter Array where)
Matches the celebrant to a live Google Contacts entry by email.
EXPR.04Greeting name (live, else stored)
Prefers the live Google display name.
EXPR.05Template select + substitute
Selects and personalizes the greeting template.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.