LinkedIn Milestone and PR Announcement
When a milestone event fires - a deal closed in CRM, a product released, an award won, or a new hire added - the flow drafts a branded announcement, routes a quick approval, and posts it to the LinkedIn company page, then cross-posts a heads-up to Teams. Turns business milestones into timely LinkedIn announcements.
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 turns business milestones into timely, approved LinkedIn company-page announcements. When a new Milestone row is created in Dataverse - a closed deal, a product release, an award, or a new hire - the flow resolves the post's visibility, routes a quick approval to a configured reviewer, and on approval posts a branded article update to the LinkedIn company page, writes the outcome back to the milestone row, and cross-posts a heads-up to a marketing Teams channel. On rejection it marks the row and notifies Teams with the reviewer's comments.
Why it matters: great milestones often go unannounced because no one gets around to posting. Event-driven drafting plus a light approval gate makes public celebration consistent, accurate, and on-brand - with a governed record of what was approved and when.
Ships Off (demo).
Use Case
Marketing and Sales teams want notable business events automatically turned into reviewed LinkedIn posts, without manual drafting each time. A simple Dataverse table acts as the milestone intake: any system (CRM plugin, Power Apps form, another flow) can drop a row in, and this flow handles review, publishing, and team notification.
Flow Architecture
When a Milestone Is Created
Dataverse - SubscribeWebhookTriggerFires when a new row is created in the flowlibs_milestone table (Create, organization scope).
Initialize Config & Visibility
Initialize variable (x7)Loads the LinkedIn company page id, builds the company URN, resolves default vs row-level visibility, loads the approver email, and the Teams group/channel ids.
Request Announcement Approval
Approvals - StartAndWaitForAnApprovalRoutes the drafted announcement to the approver before anything is posted publicly.
Check Approval Outcome
Conditionoutcome == Approve goes to the publish branch; otherwise the reject branch.
Post to Company Page (approved)
LinkedIn - PostCompanyUpdateV2Posts the approved milestone as a branded article update to the company page.
Mark Published (approved)
Dataverse - UpdateRecordWrites status = Published, outcome, comments, and approved/published timestamps.
Notify Teams Published (approved)
Teams - PostMessageToConversationHeads-up to the marketing channel that it went live.
Mark Rejected (rejected)
Dataverse - UpdateRecordWrites status = Rejected, outcome, and reviewer comments.
Notify Teams Rejected (rejected)
Teams - PostMessageToConversationNotifies the channel of the rejection with reviewer comments.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_CompanyPageId | String | <your-linkedin-org-id> | LinkedIn organization numeric ID (becomes urn:li:organization:{id}). |
| flowlibs_ApproverEmail | String | approver@yourcompany.com | Reviewer who signs off the announcement. |
| flowlibs_TeamsGroupId | String | <your-team-id> | Teams team (group) ID for the heads-up. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Teams channel ID for the heads-up. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| shared_linkedinv2 | PostCompanyUpdateV2 | |
| Approvals | shared_approvals | StartAndWaitForAnApproval |
| Microsoft Dataverse | shared_commondataserviceforapps | SubscribeWebhookTrigger UpdateRecord |
| Microsoft Teams | shared_teams | PostMessageToConversation |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
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.
- Milestone intake
- Point any source (CRM plugin, model-driven form, another flow) at the flowlibs_milestone table; populate commentary, article url/title/description, and milestone type.
- Approver
- Change flowlibs_ApproverEmail, or swap the Basic approval for an approver-group / first-to-respond pattern.
- Default visibility
- Edit Initialize Default Visibility (Public / Logged in members only). Per-row override via flowlibs_visibility.
- Consent gate
- Add a condition that holds New Hire types until a consent flag column is set.
- Channels
- Repoint flowlibs_TeamsGroupId / flowlibs_TeamsChannelId to the right marketing channel.
- Personal vs company
- To post to a personal profile instead, swap PostCompanyUpdateV2 for PostUpdateV2 and drop body/author.
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.01Company URN
Builds the LinkedIn organization URN used as the post author.
EXPR.02Effective visibility
Uses the row's visibility, or the org default when blank.
EXPR.03Approval branch
True when the reviewer approved.
EXPR.04Reviewer comments
Captures the reviewer's comments from the approval.
EXPR.05Record id for write-back
The milestone row id used by the Update actions.
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.