SharePoint to Gmail, newsletter drafts ready for approval
Your newsletter workflow probably breaks in the same place every time. You have trends in SharePoint, a template somewhere, and a draft that gets built through copy-paste, “quick edits,” and last-minute formatting fixes.
Marketing managers feel it when approvals drag. Content creators feel it when “just one newsletter” turns into an afternoon. And SEO specialists end up chasing consistency across issues. This SharePoint Gmail automation turns trend data into a draft that’s already structured, branded, and ready for review.
Below, you’ll see exactly how the workflow pulls a trending topic from SharePoint, generates a newsletter draft (with optional creative), and sends it to Gmail for approval before anything gets stored or published.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: SharePoint to Gmail, newsletter drafts ready for approval
flowchart LR
subgraph sg0["Generate Video and A Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Read Trends Data", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Select Topic from Trends"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Build Newsletter"]
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Approval Status", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Get Trends XLSX", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Get Newsletter Template", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Video"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Create FAL Video"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Create Audio"]
n11@{ icon: "mdi:cog", form: "rounded", label: "Wait for Audio", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Audio"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Create Merge Request"]
n14@{ icon: "mdi:cog", form: "rounded", label: "Wait for Merge", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Merged Video"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge1"]
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Configuration Settings", pos: "b", h: 48 }
n18@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n19@{ icon: "mdi:robot", form: "rounded", label: "Generate Video and Audio Pro..", pos: "b", h: 48 }
n20@{ icon: "mdi:robot", form: "rounded", label: "Determine Intent", pos: "b", h: 48 }
n21@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n22["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Parse Fields"]
n23["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Parse Intent Fields"]
n24["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>HTML to Binary"]
n25["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>TXT to Binary"]
n26["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>JPG to Binary"]
n27@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Save Video URL if exists", pos: "b", h: 48 }
n28@{ icon: "mdi:cog", form: "rounded", label: "Upload HTML", pos: "b", h: 48 }
n29@{ icon: "mdi:cog", form: "rounded", label: "Upload JPG", pos: "b", h: 48 }
n30@{ icon: "mdi:cog", form: "rounded", label: "Upload Video URL", pos: "b", h: 48 }
n31@{ icon: "mdi:message-outline", form: "rounded", label: "Send message and wait for re..", pos: "b", h: 48 }
n32@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Base64 Field", pos: "b", h: 48 }
n33@{ icon: "mdi:cog", form: "rounded", label: "Convert Base64 to File", pos: "b", h: 48 }
n34["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Receive Request"]
n35@{ icon: "mdi:robot", form: "rounded", label: "Prepare Newsletter Data", pos: "b", h: 48 }
n36@{ icon: "mdi:cog", form: "rounded", label: "Extract from Text File", pos: "b", h: 48 }
n37["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Generate Image"]
n38["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Send Data to Download Service"]
n39@{ icon: "mdi:cog", form: "rounded", label: "Wait For Video", pos: "b", h: 48 }
n40@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Video Still Processing", pos: "b", h: 48 }
n41@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Audio Still Processing", pos: "b", h: 48 }
n16 --> n31
n7 --> n9
n7 --> n16
n12 --> n41
n8 --> n40
n29 --> n27
n28 --> n26
n10 --> n11
n22 --> n37
n26 --> n29
n25 --> n30
n37 --> n32
n24 --> n28
n39 --> n8
n11 --> n12
n14 --> n15
n5 --> n0
n34 --> n20
n2 --> n16
n9 --> n39
n20 --> n23
n15 --> n16
n0 --> n1
n32 --> n33
n4 -.-> n35
n18 -.-> n19
n21 -.-> n20
n23 --> n17
n13 --> n14
n3 --> n24
n41 --> n11
n41 --> n13
n17 --> n5
n33 --> n16
n33 --> n38
n36 --> n2
n40 --> n39
n40 --> n10
n6 --> n36
n35 --> n6
n27 --> n25
n1 --> n35
n1 --> n19
n38 --> n7
n19 --> n22
n31 --> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n19,n20,n35 ai
class n4,n18,n21 aiModel
class n3,n7,n27,n40,n41 decision
class n8,n9,n10,n12,n13,n15,n34,n37,n38 api
class n1,n2,n22,n23,n24,n25,n26 code
classDef customIcon fill:none,stroke:none
class n1,n2,n8,n9,n10,n12,n13,n15,n16,n22,n23,n24,n25,n26,n34,n37,n38 customIcon
The Problem: Newsletter drafts take too long to assemble
Building a newsletter draft from “what’s trending” sounds simple until you actually do it every week. First you hunt down the latest trends spreadsheet in SharePoint. Then you pick a topic (often the loudest idea in the room, not the best one). After that comes the messy part: writing the content, translating or adapting it, fitting it into your HTML template, tracking versions, and getting someone to approve it. One tiny formatting change can ripple through the whole email, so you end up re-checking everything… again.
The friction compounds. And it shows up in ways that are hard to measure until you’re already behind schedule.
- Trend spreadsheets get updated, but your draft starts from an outdated file or the wrong folder.
- Manual drafting leads to inconsistent sections, which means more editing and weaker brand voice.
- Approvals happen in DMs and random threads, so nobody knows which draft is “the” draft.
- Creative assets become a blocker, especially when you want images (or video) but don’t have time.
The Solution: SharePoint trends → AI draft → Gmail approval
This workflow starts with a simple webhook request that tells n8n what you’re creating (for example, “newsletter”) and whether you want video. From there, it pulls your latest trends spreadsheet from SharePoint, selects a topic automatically, and generates bilingual newsletter content using GPT-4o. It then fetches your HTML newsletter template from SharePoint and injects the content into the correct placeholders, so the draft comes out formatted the same way every time. If you want creative assets, it can generate a social-sized image and optionally produce a short video by combining visuals and audio, then merging the results. Finally, it emails the full draft to Gmail for approval and only continues once it’s approved.
The workflow starts when you POST to the webhook. It then builds the newsletter draft (and optional assets) from your SharePoint data and template. After the Gmail approval step, it uploads the final files back to storage so you have a clean, reusable trail.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish one newsletter per week. Manually, you might spend about 30 minutes finding the right SharePoint trend file, another 2 hours writing and formatting inside your HTML template, and 30 minutes chasing approvals and consolidating edits. Call it about 3 hours. With this workflow, you send a webhook in a minute, wait roughly 10–20 minutes for drafting (longer if you enable video), then approve it in Gmail. You typically get most of those 3 hours back, every week.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Microsoft 365 (SharePoint) to store trends and templates.
- Gmail to handle the approval email loop.
- OpenAI API key (get it from your OpenAI dashboard).
Skill level: Intermediate. You’ll connect a few accounts, edit variables (ENV_*), and test with a sample webhook request.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A webhook kicks things off. You POST a small payload like your use case and whether to include video. That single request becomes the “brief” for the whole run.
SharePoint provides the inputs. The workflow downloads your trends spreadsheet (XLSX) from SharePoint, loads it into n8n, then selects a topic automatically. No tabs. No searching through folders.
AI drafts the content and fits it into your template. GPT-4o generates bilingual newsletter copy based on the chosen trend, and the workflow injects it into your stored HTML template. This is where your consistency comes from, because the structure is controlled.
Gmail handles approval, then storage gets updated. The draft is emailed for review, and the workflow only continues when it’s approved. After approval, it uploads the HTML and any assets (image, plus a video URL if enabled) to your storage provider.
You can easily modify the topic selection logic to prioritize categories, regions, or “highest growth” items based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the workflow entry point so external systems can initiate the content pipeline.
- Add and open Incoming Webhook Trigger.
- Configure the webhook path, HTTP method, and response settings needed by your client app.
- Copy the webhook URL and store it in the service that will send the trigger request.
Step 2: Set Up Intent & Configuration Preprocessing
This segment extracts intent and prepares configuration before pulling trend data.
- Open Determine User Intent and confirm the input mapping from Incoming Webhook Trigger.
- Connect OpenAI Chat Engine C as the language model for Determine User Intent. Credential Required: Connect your OpenAI credentials (set these on OpenAI Chat Engine C).
- Review Extract Intent Fields to ensure the expected output schema is generated for downstream nodes.
- Use Apply Configuration to normalize settings that will feed the trend retrieval branch.
Step 3: Connect Trend Data Sources
Retrieve trend data from SharePoint and convert it into a usable sheet.
- Open Retrieve Trends XLSX and select the SharePoint site and file path for your trend workbook. Credential Required: Connect your Microsoft SharePoint credentials.
- Confirm Load Trend Sheet reads the file output from Retrieve Trends XLSX and parses rows correctly.
- Review Choose Trend Topic logic to ensure it selects the right trend record for the newsletter and media prompts.
Step 4: Configure AI Content Generation Branches
Choose Trend Topic outputs to both Prepare Newsletter Info and Compose Media Prompt in parallel, creating text content and media prompts simultaneously.
- In Prepare Newsletter Info, verify the prompt template uses the selected trend topic.
- Connect OpenAI Chat Engine A as the language model for Prepare Newsletter Info. Credential Required: Connect your OpenAI credentials (set these on OpenAI Chat Engine A).
- In Compose Media Prompt, validate the prompt structure for image/video generation.
- Connect OpenAI Chat Engine B as the language model for Compose Media Prompt. Credential Required: Connect your OpenAI credentials (set these on OpenAI Chat Engine B).
- Review Extract Prompt Fields and Extract Text Content to ensure they parse agent outputs correctly for downstream steps.
Step 5: Build the Newsletter Assembly Path
This path turns the AI output into a final HTML newsletter and prepares it for approval.
- Configure Fetch Newsletter Template to pull the HTML template from SharePoint. Credential Required: Connect your Microsoft SharePoint credentials.
- Ensure Extract Text Content outputs the template content expected by Assemble Newsletter.
- Validate Assemble Newsletter generates final HTML using the AI content and template.
- Review Combine Streams to confirm it merges outputs from media, newsletter HTML, and video assets before approval.
Step 6: Configure Media Asset Generation & File Handling
Generate visual media, convert base64 to files, and route files to downstream services.
- Set up Generate Visual Asset to call your image generation endpoint. Credential Required: Connect your HTTP Request credentials or API headers.
- In Assign Base64 Value, confirm the response field holding the base64 image is set for conversion.
- Base64 to File outputs to both Combine Streams and Send to Download Service in parallel.
- Configure Send to Download Service to post the image file where it can be downloaded or processed. Credential Required: Connect your HTTP Request credentials or API headers.
Step 7: Configure Video & Audio Processing Loops
These steps create video, generate audio, and merge assets using wait-and-check loops.
- Configure Request FAL Video to submit video generation requests. Credential Required: Connect your HTTP Request credentials or API headers.
- Confirm Pause for Video waits long enough for the video to render, then Fetch Video Result retrieves the output. Credential Required: Connect your HTTP Request credentials or API headers.
- Use Video Processing Check to loop back to Pause for Video until a completed status is detected, then proceed to audio generation.
- Set up Generate Audio Clip, Pause for Audio, and Retrieve Audio Output with your audio endpoint. Credential Required: Connect your HTTP Request credentials or API headers.
- Ensure Audio Processing Check loops back to Pause for Audio until audio is ready, then triggers Initiate Merge Task and Hold for Merge.
- Configure Retrieve Merged Video to pull the final merged asset once the merge job completes. Credential Required: Connect your HTTP Request credentials or API headers.
Step 8: Route Output, Store Files, and Request Approval
This stage routes assets, uploads files to SharePoint, and sends an approval email.
- Confirm Route by Choice routes output to Request FAL Video or directly to Combine Streams based on your selection logic.
- Use Verify Approval State to gate file conversion and upload only after approval.
- Configure Convert HTML Binary, Convert Image Binary, and Convert Text Binary to format data for file uploads.
- Set up Upload HTML File, Upload Image File, and Upload Video Link to store assets in SharePoint. Credential Required: Connect your Microsoft SharePoint credentials.
- Configure Email Approval Request to send approval messages. Credential Required: Connect your Gmail credentials.
- Check Store Video URL logic to verify it only stores valid video URLs before Convert Text Binary.
Step 9: Test and Activate Your Workflow
Run a full end-to-end test to confirm data flows across parallel branches and wait loops.
- Click Execute Workflow and send a test request to Incoming Webhook Trigger.
- Verify Choose Trend Topic outputs to both Prepare Newsletter Info and Compose Media Prompt in parallel.
- Confirm Base64 to File outputs to both Combine Streams and Send to Download Service in parallel.
- Check that Email Approval Request is sent and Verify Approval State allows downstream uploads.
- When successful, activate the workflow by toggling it to Active for production use.
Common Gotchas
- Microsoft SharePoint credentials can expire or need specific permissions. If things break, check the Microsoft 365 connection inside n8n credentials and confirm the folder/file access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 45 minutes if your accounts and template are ready.
No. You will mostly connect credentials and edit a few variables. The only “code-like” part is adjusting selection logic if you want a custom topic rule.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs and (if enabled) FAL AI video generation costs.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s pretty straightforward. To skip video, set include_video to false in the webhook request and the workflow routes around the FAL video steps using the choice logic (the “Route by Choice” switch and related If checks). To change storage, replace the SharePoint upload nodes (like “Upload HTML File” and “Upload Image File”) with Google Drive, Dropbox, or S3 equivalents. Common tweaks also include changing the topic picker in “Choose Trend Topic” and tightening the brand tone in the “Prepare Newsletter Info” prompt.
Usually it’s expired Microsoft 365 credentials or missing SharePoint permissions to the folder where the XLSX and template live. Reconnect the Microsoft account in n8n, then confirm the exact site and path match what the nodes expect. If you recently moved files, that can break it too. Also check whether your tenant requires conditional access, which can block token refresh in automations.
Plenty for a normal marketing cadence.
For this workflow, n8n is a better fit when you need multi-step branching (video on/off), waits for external processing, and a real approval gate in the middle of the run. Zapier and Make can do parts of it, but the moment you add “download XLSX, select a row, generate content, inject into HTML, optionally render assets, then pause for approval,” costs and complexity climb fast. n8n also gives you the self-host option, which is handy when you’re running frequent drafts. If your goal is just “SharePoint file changed → send email,” then sure, simpler tools are fine. Talk to an automation expert if you want a quick recommendation based on your volume and stack.
Once this is running, the draft shows up ready for a decision, not a rebuild. Honestly, that’s the difference between “we should send a newsletter” and actually sending it.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.