Copyright© Mat Bao Company. All Reserved.
Sử dụng nội dung ở trang này và dịch vụ tại Mắt Bão có nghĩa là bạn đồng ý với Thỏa thuận sử dụng và Chính sách bảo mật của chúng tôi.
Công ty cổ phần Mắt Bão - Giấy phép kinh doanh số: 0302712571 cấp ngày 04/09/2002 bởi Sở Kế Hoạch và Đầu Tư Tp. Hồ Chí Minh.
Giấy phép cung cấp dịch vụ Viễn thông số 247/GP-CVT cấp ngày 08 tháng 05 năm 2018.
📢 Lưu ý: Bài viết mang tính chất tham khảo. Quý khách có thể tự điều chỉnh hoặc bổ sung thêm các tính năng khác theo nhu cầu sử dụng của mình.
1. Giới thiệu
Workflow “Tự động chúc mừng sinh nhật nhân viên” giúp tự động gửi lời chúc mừng sinh nhật đến nhân viên vào 08:00 mỗi ngày. Dữ liệu nhân viên được lấy từ file Excel trên OneDrive (Microsoft 365). Nếu hôm nay có nhân viên sinh nhật, hệ thống sẽ:
- Gửi email chúc mừng trực tiếp đến nhân viên qua Outlook.
- Đăng lời chúc mừng lên một kênh (Channel) Microsoft Teams của công ty.
Workflow gồm 6 node:
- Schedule – 08:00 mỗi ngày – chạy tự động lúc 08:00 hằng ngày.
- Excel – Danh sách nhân viên – đọc danh sách nhân viên từ file Excel.
- Kiểm tra sinh nhật hôm nay (Code) – lọc nhân viên có ngày, tháng sinh trùng hôm nay.
- Có nhân viên sinh nhật? (IF) – chỉ đi tiếp khi có tên và email hợp lệ.
- Outlook – Gửi Email chúc mừng – gửi email đến nhân viên.
- Teams – Chúc mừng sinh nhật – đăng lời chúc lên kênh Teams.

Hình 1: Tổng quan 6 node của workflow trong n8n
2. Chuẩn bị
- Đã import file JSON của workflow vào n8n (xem mục 12 nếu cần lấy lại mã JSON).
- Tài khoản Microsoft 365 có sử dụng OneDrive (Excel), Outlook và Microsoft Teams.
- Quyền quản trị Microsoft Entra ID (Azure Portal) để tạo App Registration và cấp quyền.
- Một Team và Channel trên Microsoft Teams dùng để đăng lời chúc (tài khoản kết nối phải là thành viên của Team này).
3. Bước 1 – Chuẩn bị file Excel danh sách nhân viên
- Tạo file Excel trên OneDrive (ví dụ:
DanhSachNhanVien.xlsx). - Đặt tên sheet là Employees.
- Dòng đầu tiên là tiêu đề cột, đặt đúng tên như sau:
| Họ tên | Ngày sinh | Phòng ban | |
|---|---|---|---|
| Nguyễn Văn A | nguyenvana@congty.vn | 1995-10-29 | Kỹ thuật |
| Trần Thị B | tranthib@congty.vn | 1998-03-15 | Kinh doanh |
(Dữ liệu trong bảng là ví dụ minh họa.)
⚠️ Lưu ý về cột “Ngày sinh”: nên định dạng cột này là Văn bản (Text) và nhập theo dạng yyyy-MM-dd (ví dụ 1995-10-29). Nếu để định dạng ngày của Excel, dữ liệu trả về có thể là số (ví dụ 34999) hoặc dạng dd/MM/yyyy, khiến workflow không nhận diện đúng ngày sinh.
4. Bước 2 – Tạo App Registration trên Azure (Microsoft Entra ID)
Nếu Quý khách đã tạo App Registration ở bài hướng dẫn nhắc lịch họp, có thể dùng lại ứng dụng đó và chỉ cần bổ sung thêm quyền (API permissions) bên dưới.
- Truy cập https://portal.azure.com → App registrations → New registration.
- Đặt tên ứng dụng (ví dụ:
n8n-m365), chọn Single tenant. - Mục Redirect URI: chọn Web và dán OAuth Redirect URL lấy từ n8n (xem Hình 4) – có dạng
https://<tên-miền-n8n>/rest/oauth2-credential/callback. - Bấm Register, sao chép Application (client) ID.
- Vào Certificates & secrets → New client secret → sao chép ngay giá trị Value (chỉ hiển thị một lần).
- Vào API permissions → Add a permission → Microsoft Graph → Delegated permissions, thêm các quyền:
- Chung:
offline_access,User.Read - Excel (OneDrive):
Files.Read(hoặcFiles.ReadWrite) - Outlook:
Mail.Send - Teams:
Team.ReadBasic.All,Channel.ReadBasic.All,ChannelMessage.Send
Sau đó bấm Grant admin consent.
- Chung:

Hình 2: Vào App registrations và bấm New registration

Hình 3: Điền thông tin đăng ký ứng dụng và Redirect URI
Khi bấm Connect my account trong n8n, Microsoft có thể yêu cầu thêm một số quyền mặc định của n8n. Quý khách nên đăng nhập bằng tài khoản quản trị để chấp thuận.
⚠️ Bảo mật: Không chia sẻ Client Secret, Tenant ID, Client ID cho người khác hoặc đưa lên các nơi công khai.
5. Bước 3 – Kết nối Microsoft Excel trong n8n
- Mở workflow Tự động chúc mừng sinh nhật nhân viên, nhấp đúp vào node Excel – Danh sách nhân viên.
- Bấm Set up credential.
- Sao chép OAuth Redirect URL (dán vào Azure ở Bước 2), dán Client ID, Client Secret.
- Bấm Save → Connect my account → đăng nhập Microsoft 365 → Accept.
- Quay lại node, tại Workbook chọn file Excel đã tạo ở Bước 1, tại Sheet chọn Employees.

Hình 4: Node Excel – Set up credential, chọn Workbook và Sheet

Hình 5: Sao chép OAuth Redirect URL và dán Client ID (thông tin đã che mờ)

Hình 6: Dán Client Secret, bấm Save rồi Connect my account
6. Bước 4 – Kiểm tra node “Kiểm tra sinh nhật hôm nay”
Node này so sánh ngày và tháng sinh với ngày hiện tại. Đoạn code đọc dữ liệu theo tên cột trong Excel:
- Ngày sinh:
Ngày sinh/birthDate/BirthDate - Họ tên:
Họ tên/Ho ten/name/Name - Email:
Email/email/Email Address - Phòng ban:
Phòng ban/Phong ban/department
Nếu file Excel của Quý khách dùng tên cột khác, hãy sửa lại tên cột trong đoạn code cho khớp.

Hình 7: Các tên cột được sử dụng trong node Code
7. Bước 5 – Kết nối Microsoft Outlook (gửi email)
- Nhấp đúp vào node Outlook – Gửi Email chúc mừng → Set up credential.
- Thực hiện tương tự Bước 3: dán Client ID, Client Secret → Save → Connect my account.
- Kiểm tra To (email nhân viên, tự lấy từ Excel), Subject và Message. Quý khách có thể chỉnh sửa nội dung email, chữ ký “Phòng Nhân sự” theo ý muốn.

Hình 8: Node Outlook – credential, người nhận, tiêu đề và nội dung email
Email sẽ được gửi từ tài khoản Microsoft 365 đã kết nối. Nên dùng tài khoản chung của phòng Nhân sự (ví dụ hr@congty.vn).
8. Bước 6 – Kết nối Microsoft Teams (đăng lời chúc lên kênh)
- Nhấp đúp vào node Teams – Chúc mừng sinh nhật → Set up credential, thực hiện tương tự Bước 3.
- Tại Team (From list) chọn Team của công ty.
- Tại Channel (From list) chọn kênh sẽ đăng lời chúc (ví dụ: General hoặc Chúc mừng).
- Kiểm tra Content Type = HTML và nội dung Message.

Hình 9: Node Teams – credential, chọn Team, Channel và nội dung lời chúc
9. Bước 7 – Thiết lập múi giờ
Để workflow chạy đúng 08:00 giờ Việt Nam, vào menu … (góc trên bên phải) → Settings → mục Timezone chọn Asia/Ho_Chi_Minh (GMT+7) → Save.
10. Bước 8 – Chạy thử và kích hoạt
- Thêm một dòng thử vào file Excel với ngày sinh trùng ngày hôm nay và email của chính Quý khách.
- Bấm Execute workflow để chạy thử; kiểm tra hộp thư và kênh Teams đã nhận lời chúc.
- Xóa dòng thử trong Excel, sau đó bấm Publish (một số phiên bản cũ là công tắc Active) để workflow tự động chạy mỗi ngày.

Hình 10: Execute workflow để chạy thử, Publish để kích hoạt
🎂🎉 CHÚC MỪNG SINH NHẬT! 🎉🎂
Hôm nay là sinh nhật của Nguyễn Văn A!
🏢 Phòng ban: Kỹ thuật
🎈 Chúc bạn tuổi mới thật nhiều sức khỏe, niềm vui và thành công.
🥳 Chúc mừng sinh nhật!
Ví dụ tin nhắn hiển thị trên kênh Teams.
11. Tùy chỉnh thường dùng
- Đổi giờ gửi: trong node Schedule, sửa giờ chạy (mặc định 08:00).
- Đổi nội dung lời chúc: sửa ô Message trong node Outlook và node Teams.
- Chỉ gửi email hoặc chỉ đăng Teams: xóa node không dùng.
- Bổ sung tính năng: gửi thông báo cho quản lý trực tiếp, đính kèm thiệp chúc mừng, nhắc trước sinh nhật 1 ngày, v.v.
12. Mã JSON của workflow
Quý Khách có thể tham khảo đoạn mã JSON dưới đây. Quý Khách có thể tùy chỉnh hoặc bổ sung thêm các tính năng theo nhu cầu sử dụng.
Các giá trị dạng <YOUR_...> là thông tin riêng của từng tài khoản và sẽ được n8n tự điền khi Quý khách kết nối credential, chọn file Excel, Team và Channel.
{
"name": "Tự động chúc mừng sinh nhật nhân viên",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"id": "f96e8f78-f1d4-4e4d-89dc-9d26ed871069",
"name": "Schedule - 08:00 mỗi ngày",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-1024,
128
]
},
{
"parameters": {
"resource": "worksheet",
"operation": "readRows",
"workbook": {
"__rl": true,
"value": "<YOUR_EXCEL_WORKBOOK_ID>",
"mode": "list",
"cachedResultName": "<TEN_FILE_EXCEL>"
},
"worksheet": {
"__rl": true,
"value": "<YOUR_WORKSHEET_ID>",
"mode": "list",
"cachedResultName": "Employees"
},
"options": {}
},
"id": "6fc88970-e1d7-4035-b909-5c94221edf38",
"name": "Excel - Danh sách nhân viên",
"type": "n8n-nodes-base.microsoftExcel",
"typeVersion": 2.2,
"position": [
-768,
128
],
"credentials": {
"microsoftExcelOAuth2Api": {
"id": "<YOUR_EXCEL_CREDENTIAL_ID>",
"name": "Microsoft Excel account"
}
}
},
{
"parameters": {
"jsCode": "const now = new Date();\nconst todayDay = now.getDate();\nconst todayMonth = now.getMonth() + 1;\n\nreturn items.filter(item => {\n const value = item.json['Ngày sinh'] ?? item.json['birthDate'] ?? item.json['BirthDate'];\n if (!value) return false;\n\n const birthDate = new Date(value);\n if (Number.isNaN(birthDate.getTime())) return false;\n\n return birthDate.getDate() === todayDay &&\n birthDate.getMonth() + 1 === todayMonth;\n}).map(item => {\n const name = item.json['Họ tên'] ?? item.json['Ho ten'] ?? item.json['name'] ?? item.json['Name'] ?? 'Nhân viên';\n const email = item.json['Email'] ?? item.json['email'] ?? item.json['Email Address'] ?? '';\n const department = item.json['Phòng ban'] ?? item.json['Phong ban'] ?? item.json['department'] ?? '';\n\n return {\n json: {\n ...item.json,\n employeeName: name,\n employeeEmail: email,\n department\n }\n };\n});"
},
"id": "390281a1-5b3e-417a-932f-3363a52638fb",
"name": "Kiểm tra sinh nhật hôm nay",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-496,
128
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "has-name",
"leftValue": "={{ $json.employeeName }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty"
}
},
{
"id": "has-email",
"leftValue": "={{ $json.employeeEmail }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "0a7fbc7b-48a1-4215-8083-1b87d42d0416",
"name": "Có nhân viên sinh nhật?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-256,
128
]
},
{
"parameters": {
"toRecipients": "={{ $json.employeeEmail }}",
"subject": "=🎂 Chúc mừng sinh nhật {{ $json.employeeName }}!",
"bodyContent": "=🎂🎉 <b>CHÚC MỪNG SINH NHẬT!</b> 🎉🎂<br><br>Xin chào <b>{{ $json.employeeName }}</b>,<br><br>Hôm nay là ngày đặc biệt của bạn!<br><br>🎈 Chúc bạn tuổi mới thật nhiều sức khỏe, niềm vui và thành công.<br><br>Chúc bạn luôn giữ được năng lượng tích cực và có thật nhiều thành công trong công việc cũng như cuộc sống.<br><br>🥳 <b>Chúc mừng sinh nhật!</b><br><br>Trân trọng,<br>Phòng Nhân sự",
"additionalFields": {
"bodyContentType": "html",
"saveToSentItems": true
}
},
"id": "255739db-aa25-4ce5-959f-238899e29fad",
"name": "Outlook - Gửi Email chúc mừng",
"type": "n8n-nodes-base.microsoftOutlook",
"typeVersion": 2,
"position": [
0,
0
],
"webhookId": "<YOUR_WEBHOOK_ID>",
"credentials": {
"microsoftOutlookOAuth2Api": {
"id": "<YOUR_OUTLOOK_CREDENTIAL_ID>",
"name": "Microsoft Outlook account"
}
}
},
{
"parameters": {
"resource": "channelMessage",
"teamId": {
"__rl": true,
"value": "<YOUR_TEAM_ID>",
"mode": "list",
"cachedResultName": "<TEN_TEAM>"
},
"channelId": {
"__rl": true,
"value": "<YOUR_CHANNEL_ID>",
"mode": "list",
"cachedResultName": "<TEN_CHANNEL>"
},
"contentType": "html",
"message": "=🎂🎉 <b>CHÚC MỪNG SINH NHẬT!</b> 🎉🎂<br><br>Hôm nay là sinh nhật của <b>{{ $json.employeeName }}</b>!<br><br>🏢 Phòng ban: <b>{{ $json.department || 'Chưa cập nhật' }}</b><br><br>🎈 Chúc bạn tuổi mới thật nhiều sức khỏe, niềm vui và thành công.<br><br>🥳 <b>Chúc mừng sinh nhật!</b>",
"options": {
"includeLinkToWorkflow": false
}
},
"id": "65b048a8-30f6-4a27-a4c8-802feda4cfd5",
"name": "Teams - Chúc mừng sinh nhật",
"type": "n8n-nodes-base.microsoftTeams",
"typeVersion": 2,
"position": [
0,
240
],
"webhookId": "<YOUR_WEBHOOK_ID>",
"credentials": {
"microsoftTeamsOAuth2Api": {
"id": "<YOUR_TEAMS_CREDENTIAL_ID>",
"name": "Microsoft Teams account"
}
}
}
],
"pinData": {},
"connections": {
"Schedule - 08:00 mỗi ngày": {
"main": [
[
{
"node": "Excel - Danh sách nhân viên",
"type": "main",
"index": 0
}
]
]
},
"Excel - Danh sách nhân viên": {
"main": [
[
{
"node": "Kiểm tra sinh nhật hôm nay",
"type": "main",
"index": 0
}
]
]
},
"Kiểm tra sinh nhật hôm nay": {
"main": [
[
{
"node": "Có nhân viên sinh nhật?",
"type": "main",
"index": 0
}
]
]
},
"Có nhân viên sinh nhật?": {
"main": [
[
{
"node": "Outlook - Gửi Email chúc mừng",
"type": "main",
"index": 0
},
{
"node": "Teams - Chúc mừng sinh nhật",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"binaryMode": "separate",
"availableInMCP": false
},
"versionId": "<YOUR_VERSION_ID>",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "<YOUR_INSTANCE_ID>"
},
"id": "<YOUR_WORKFLOW_ID>",
"tags": []
}
13. Một số lỗi thường gặp
- Không có ai được chúc dù hôm nay có sinh nhật: kiểm tra tên cột trong Excel và định dạng cột Ngày sinh (xem Bước 1).
- Không chọn được file Excel: file phải nằm trên OneDrive của tài khoản đã kết nối.
- Lỗi quyền (403 / Insufficient privileges): kiểm tra API permissions trên Azure và Grant admin consent.
- Lỗi redirect_uri mismatch: Redirect URI trên Azure phải trùng với OAuth Redirect URL trong n8n.
- Gửi sai giờ: kiểm tra Timezone trong Settings của workflow (Bước 7).
📢 Lưu ý: Bài viết mang tính chất tham khảo. Quý khách có thể tự điều chỉnh hoặc bổ sung thêm các tính năng khác theo nhu cầu sử dụng của mình.















