Ditt team missar inte deadlines för att folk tar ledigt. Det missar deadlines för att ingen ser det komma förrän den dag någon är borta.
Den här Odoo Slack alerts-automationen träffar projektledare först, men teknikledare och IT-drift får ofta hantera följderna också. Resultatet är enkelt: rätt personer får en tydlig förvarning om morgondagens frånvaro, tillräckligt tidigt för att kunna omfördela arbetet.
Du sätter upp ett dagligt arbetsflöde som hämtar godkänd ledighet från Odoo, matchar den mot Redmine-projekt, tar bort dubbletter av kollegor och postar riktade Slack-notiser (med valfria chefslarm).
Så fungerar den här automationen
Här är hela arbetsflödet som du kommer att sätta upp:
n8n Workflow Template: Odoo till Slack: semesteraviseringar utan överraskningar
flowchart LR
subgraph sg0["Step 1: Schedule the trigger to run every weekday at 5:15 PM. Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Step2: Set Variables", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Step 1: Schedule the trigger..", pos: "b", h: 48 }
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/>Step3: Get datetime"]
n3["<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/>Step4: Get all user in Redmi.."]
n4["<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/>Step5: Get a list of closed .."]
n5["<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/>Step7: Get the list of membe.."]
n6@{ icon: "mdi:cog", form: "rounded", label: "End", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "End1", pos: "b", h: 48 }
n17["<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/slack.svg' width='40' height='40' /></div><br/>Step6: Get many users"]
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Step8: Check if there is a r..", pos: "b", h: 48 }
n19["<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/>Step9: Handling and get user.."]
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Step10: Loop Over Items", pos: "b", h: 48 }
n21["<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/>Step11: Get leave record inf.."]
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/>Step12: Get name record"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Step13: Get employee informa.."]
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/>Step14: Get work_email"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Step15: Get information for .."]
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/>Step16: Get work_email of ma.."]
n27["<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/>Step17: Get user info in Red.."]
n28@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Step18: Check if there is a..", pos: "b", h: 48 }
n29["<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/>Step19.1: Get membership lis.."]
n30["<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/>Step19.2: Return isAccountRe.."]
n31["<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/>Step20: Get project IDs that.."]
n32["<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/>Step21: Merge data"]
n33@{ icon: "mdi:swap-vertical", form: "rounded", label: "Step22: Loop Over Items", pos: "b", h: 48 }
n34@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Step 23: If redmine_listProj..", pos: "b", h: 48 }
n35@{ icon: "mdi:cog", form: "rounded", label: "Step 24: Call subflow: 'Get ..", pos: "b", h: 48 }
n36["<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/>Step25: Get email Redmine pr.."]
n37@{ icon: "mdi:swap-vertical", form: "rounded", label: "Step26: Loop Over Items", pos: "b", h: 48 }
n38@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Step 27: If redmine_listProj..", pos: "b", h: 48 }
n39["<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/>Step28.1: Prepare informatio.."]
n40["<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/>Step28.2: Prepare informatio.."]
n41@{ icon: "mdi:cog", form: "rounded", label: "Step29: Call subflow: 'Push ..", pos: "b", h: 48 }
n32 --> n20
n2 --> n3
n0 --> n2
n17 --> n5
n24 --> n32
n24 --> n25
n20 --> n33
n20 --> n21
n20 --> n32
n22 --> n23
n22 --> n32
n33 --> n37
n33 --> n34
n37 --> n6
n37 --> n38
n3 --> n4
n26 --> n27
n26 --> n32
n27 --> n28
n21 --> n22
n4 --> n17
n30 --> n32
n18 --> n19
n18 --> n7
n23 --> n24
n28 --> n29
n28 --> n30
n41 --> n37
n34 --> n35
n34 --> n33
n38 --> n39
n38 --> n40
n29 --> n31
n36 --> n33
n19 --> n20
n5 --> n18
n31 --> n32
n1 --> n0
n25 --> n26
n35 --> n36
n39 --> n41
n40 --> n41
end
subgraph sg1["Flow 2"]
direction LR
n14@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Step2: Loop Over Items", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Step3: Wait 1s", pos: "b", h: 48 }
n42@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Step4: Switch", pos: "b", h: 48 }
n43["<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/>Step5.1: Send a message to t.."]
n44["<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/>Step5.2: Send a message to t.."]
n42 --> n43
n42 --> n44
n16 --> n42
n15 --> n14
n15 --> n16
n43 --> n15
n44 --> n15
end
subgraph sg2["Step1: When Executed by Another Workflow Flow"]
direction LR
n8@{ icon: "mdi:play-circle", form: "rounded", label: "Step1: When Executed by Anot..", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Step3: Loop Over Items", pos: "b", h: 48 }
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/>Step4: Get membership list o.."]
n11["<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/>Step2: Return redmine list P.."]
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/code.svg' width='40' height='40' /></div><br/>Step5: Get redmine project T.."]
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/code.svg' width='40' height='40' /></div><br/>Step6: Remove duplicate id"]
n9 --> n13
n9 --> n10
n8 --> n11
n12 --> n9
n11 --> n9
n10 --> n12
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 n1,n8 trigger
class n18,n28,n34,n38,n42 decision
class n3,n4,n5,n21,n23,n25,n27,n29,n43,n44,n10 api
class n2,n19,n22,n24,n26,n30,n31,n36,n39,n40,n11,n12,n13 code
classDef customIcon fill:none,stroke:none
class n2,n3,n4,n5,n17,n19,n21,n22,n23,n24,n25,n26,n27,n29,n30,n31,n32,n36,n39,n40,n43,n44,n10,n11,n12,n13 customIcon
Varför det här spelar roll: morgondagens ledighet ska inte komma som en överraskning
När någon är borta i morgon och teamet får veta det i morgon, betalar du för det på obekväma sätt. Standups blir till detektivarbete. Ärenden fastnar och “väntar på” någon som inte är där. Ett möte med intressenter flyttas i sista minuten, vilket får teamet att se oorganiserat ut även när leveransen är bra. Det mest frustrerande är att informationen redan finns i Odoo. Den når bara inte de personer som behöver den, i det läge när de fortfarande kan göra något åt det.
Det blir snabbt dyrt. Här är var det faller isär i verkliga team.
- Ledighet godkänns i Odoo, men når aldrig ingenjörerna som är tilldelade samma Redmine-projekt.
- Team övernotifierar “hela kanalen”, så folk börjar ignorera frånvaromeddelanden helt.
- Du tappar det enda användbara fönstret: eftermiddagen innan, när du fortfarande kan möblera om ärenden och mötesagendor.
- Manuella kontroller (Odoo, sedan Redmine, sedan Slack-DM) tar runt en timme om dagen och missar ändå edge cases.
Vad du bygger: dagliga ledighetslarm matchade mot Redmine-projekt
Det här arbetsflödet körs varje vardag kl. 17:15 och gör “morgon-checken” åt dig. Det hämtar alla godkända ledighetsposter som börjar nästa dag från Odoo och berikar sedan varje post med medarbetarens detaljer (inklusive e-post och chef-information). Därefter slår det upp personen i Redmine, hittar vilka aktiva projekt personen tillhör och samlar kollegorna i samma projekt. Till sist tar det bort dubbletter i målgruppen så att ingen blir spammande över överlappande projekt, och skickar ett riktat Slack-meddelande som faktiskt är relevant för dem som påverkas av frånvaron. Om ledighetstypen spelar roll (ledig vs distans) skickas meddelandet via rätt väg.
Arbetsflödet startar på ett schema, inte via en manuell trigger. Därifrån blir det en matchningsövning: Odoo-ledighet → Redmine-projektmedlemskap → lista över kollegor. Sista steget är meddelanden, strypta med en kort väntan så att Slack-anropen blir stabila.
Det här bygger du
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du ansvarar för 6 aktiva Redmine-projekt och försöker “rimlighetskolla” morgondagens tillgänglighet själv. En typisk dag ser ut så här: öppna Odoo (10 minuter), identifiera vilka som är borta (10), slå upp medlemskap i Redmine (30) och sedan meddela några Slack-kanaler eller DM (20). Det är ungefär en timme, och du riskerar ändå att missa någon i ett delat projekt. Med det här arbetsflödet blir “arbetet” noll minuter efter att det är uppsatt. Det kör kl. 17:15, postar rätt larm, och du lägger bara tid om du väljer att ombalansera ärenden.
Innan du börjar
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Odoo för godkända ledighetsposter och medarbetarprofiler.
- Redmine för att koppla frånvaro till projektkollegor.
- Slack för riktade notiser till rätt personer.
- Odoo API-nyckel (hämta den i dina Odoo användar-/API-inställningar).
- Redmine API-nyckel (hämta den på din Redmine-sida “My account”).
- Slack Bot Token eller webhook (skapa den i Slack API Apps).
Nivå: Medel. Du klistrar in API-nycklar, testar några anrop och justerar mappningsfält (e-post och ID:n) så att de matchar din Odoo/Redmine-setup.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Ett vardagsschema startar allt. Arbetsflödet kör kl. 17:15, vilket är sent nog för att fånga godkännanden som sker under dagen men tidigt nog för att agera innan i morgon.
Datumsträngar beräknas för “i morgon”. n8n förbereder de exakta datumformat som behövs av Odoo- och Redmine-anropen, så att arbetsflödet konsekvent frågar efter rätt tidsfönster.
Ledighetsposter hämtas från Odoo och valideras. Det hämtar bara “godkända” ledigheter som startar nästa dag och berikar sedan varje objekt med medarbetarprofil och chefdetaljer så att du kan routa eller eskalera om du vill.
Redmine används för att hitta vilka som påverkas. Arbetsflödet slår upp medarbetaren i Redmine, samlar deras aktiva projektmedlemskap och hämtar sedan kollegor i de projekten. Det tar bort dubbletter av ID:n så att en person inte blir notifierad fem gånger bara för att de delar fem projekt.
Slack-meddelanden routas och skickas. En kort fördröjning hjälper till att undvika instabila efterföljande anrop, och sedan routar arbetsflödet efter ledighetstyp och postar rätt meddelande. Du kan enkelt justera vem som blir larmad (bara kollegor, även chefer eller specifika “hög påverkan”-roller) utifrån dina behov. Se hela implementationsguiden nedan för alternativ för anpassning.
Steg-för-steg-guide för implementering
Steg 1: konfigurera schematriggern
Det här arbetsflödet körs automatiskt på vardagar och startar kedjan för frånvaronotifieringar.
- Öppna Weekday Schedule Trigger och ställ in schemaregeln så att den körs dagligen med Days Interval
{{ 1 }}, Trigger At Hour{{ 17 }}och Trigger At Minute{{ 15 }}. - Koppla Weekday Schedule Trigger till Assign Config Values enligt arbetsflödet.
Tips: Triggern använder uttryck för tidsstyrning. Om ni byter tidszon, uppdatera dessa värden så att de matchar era kontorstider.
Steg 2: ställ in konfiguration och datumlogik
Dessa noder definierar bas-URL:er, gränser och beräknar datumsträngar som används i alla HTTP-anrop.
- Öppna Assign Config Values och fyll i den råa JSON:en i JSON Output med era miljövärden (till exempel Redmine-URL:er, Odoo-endpoints, gränser och
time_off_approval_link). - Verifiera att Compute Date Strings innehåller den angivna JavaScript-koden för att beräkna
today,tomorrowoch andra datumsträngar.
⚠️ Vanlig fallgrop: Om ni lämnar Assign Config Values tom kommer varje HTTP-anrop att misslyckas eftersom URL:er byggs från dessa fält.
Steg 3: anslut datakällor (Redmine, Odoo, Slack)
Flera HTTP Request- och Slack-noder hämtar Redmine-användare, projektdata, Odoo-frånvaroposter och katalogdata från Slack.
- I Fetch Redmine Users ställer ni in URL till
{{ $node['Assign Config Values'].json.redmine6_Url}}users.json?limit={{ $node['Assign Config Values'].json.limit}}. Credential Required: Anslut erahttpHeaderAuth-uppgifter. - I Retrieve Closed Projects ställer ni in URL till
{{ $node['Assign Config Values'].json.get_prj_closed}}. Credential Required: Anslut erahttpHeaderAuth-uppgifter. - I Fetch Tomorrow Leave Records ställer ni in Method till
POSToch behåller JSON Body som angivet, inklusive uttrycken{{ $node['Compute Date Strings'].json.today}}och{{ $node['Compute Date Strings'].json.tomorrow}}. Credential Required: Anslut erahttpHeaderAuth-uppgifter. - I Retrieve Slack Users ställer ni in Resource till
user, Operation tillgetAlloch Limit till100. Credential Required: Anslut eraslackApi-uppgifter. - Koppla Fetch Leave Details, Fetch Employee Profile, Fetch Manager Profile, Lookup Redmine User och Get User Memberships till samma uppgiftstyp
httpHeaderAuthsom används för Odoo- och Redmine-API-anrop.
Tips: Det finns 11+ httpRequest-noder. Säkerställ att alla Redmine- och Odoo-anrop delar giltiga httpHeaderAuth-uppgifter för att undvika inkonsekventa behörighetsfel.
Steg 4: konfigurera frånvarobearbetning och sammanslagning
Det här avsnittet validerar frånvaroposter, berikar dem och slår ihop flera dataströmmar för att förbereda notifieringar.
- I Validate Leave Records behåller ni villkoret
{{ $json.result.length }}not equals0för att stoppa arbetsflödet när det inte finns några frånvaroposter. - Säkerställ att Map Leave User Data och Cycle Leave Records är kopplade så att varje post bearbetas i batchar.
- Låt Fetch Leave Details och Derive Leave Name vara oförändrade; de beräknar
display_name_leave_record,date_fromochdate_to. - Derive Leave Name skickar utdata parallellt till både Fetch Employee Profile och Combine Data Streams.
- Extract Work Email skickar utdata parallellt till både Combine Data Streams och Fetch Manager Profile.
- Extract Manager Email skickar utdata parallellt till både Lookup Redmine User och Combine Data Streams.
- Bekräfta att Combine Data Streams är inställd på Mode
combine, Combine BycombineByPositionoch Number Inputs5.
Steg 5: konfigurera projektmedlemskap och förberedelse av aviseringar
Detta steg avgör vilka projekt och medlemmar som ska notifieras och förbereder aviseringsobjekt.
- I Evaluate Project List behåller ni boolean-kontrollen
{{ $json.isAccountRedmine }}equalstrueoch listkontrollen{{ $json.redmine_listProjectID }}not empty. - Ställ in Iterate Project Items till batchstorlek
{{ 1 }}och säkerställ att den flödar vidare till Fetch Redmine Memberships och Deduplicate Member IDs. - Låt Map Team Member Emails, Prepare Leave Notices A och Prepare Leave Notices B vara oförändrade; de bygger notifieringspayloads med hjälp av katalogdata från Slack.
- Check Project List For Notify routar till Prepare Leave Notices A och Prepare Leave Notices B beroende på Redmine-kontokontrollen.
⚠️ Vanlig fallgrop: Run Sub-Workflow (Configure Required) och Run Sub-Workflow (Configure Required) 2 har tomma workflow-ID:n. Ni måste välja rätt underarbetsflöden i båda noderna innan ni kör detta arbetsflöde.
Steg 6: konfigurera routing för Slack-notifieringar
Notifieringar routas efter typ och skickas till Slack via direkta chat.postMessage API-anrop.
- I Route By Type behåller ni reglerna som jämför
{{ $node['Subflow Execution Trigger'].json.type}}medtimeoffochremote. - I Send Slack Timeoff behåller ni URL som
https://slack.com/api/chat.postMessageoch säkerställer att body innehållerchannelsatt till{{ $node['Subflow Execution Trigger'].json.memberID}}samt malltexten för meddelandet. Credential Required: Anslut erahttpBearerAuth- ochhttpQueryAuth-uppgifter. - I Send Slack Remote behåller ni samma Slack-endpoint och body-format. Credential Required: Anslut era
httpBearerAuth- ochhttpQueryAuth-uppgifter. - Säkerställ att Delay 1 Second finns med för att strypa notifieringstakten innan Route By Type.
Steg 7: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att bekräfta att frånvaroposter hämtas, transformeras och skickas till Slack utan problem.
- Klicka på Execute Workflow och följ körningen som startar vid Weekday Schedule Trigger.
- Verifiera att Fetch Tomorrow Leave Records returnerar en icke-tom
result.recordsoch att Validate Leave Records följer true-grenen. - Bekräfta att Combine Data Streams ger sammanslagna poster och att Prepare Leave Notices A eller Prepare Leave Notices B skapar notifieringsobjekt.
- Kontrollera Slack för meddelanden som skickas av Send Slack Timeoff eller Send Slack Remote.
- När ni är nöjda, växla arbetsflödet till Active för att aktivera schemalagd körning.
Felsökningstips
- Odoo-uppgifter kan löpa ut eller sakna åtkomst till HR-ledighetsendpoints. Om det skapar fel, kontrollera först din Odoo API-nyckel/användarbehörigheter och de specifika rättigheterna för ledighetsmodellen.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder faller på tomma svar.
- Slack-fel orsakas ofta av mismatch vid användaruppslag. Bekräfta att arbetsflödet mappar samma e-postformat som Slack använder (arbetsmejl vs alias) innan du felsöker vidare.
Snabba svar
Cirka 30 minuter om dina API-nycklar är klara.
Nej. Du kopplar mest konton och klistrar in API-nycklar. Du kan behöva justera ett par fältmappningar (som e-post) så att de matchar dina system.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också ta höjd för kostnader för Odoo/Redmine/Slack API-åtkomst (ofta 0 USD om du använder inbyggda tokens i befintliga planer).
Två alternativ: n8n Cloud (hanterat, enklast att sätta upp) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och hanterar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det bör du troligen. Du kan ändra tiden för schema-triggern, byta Slack-leverans från HTTP-webhook till den inbyggda Slack-noden och justera routningen i switchen “Route By Type” så att den passar dina ledighetskategorier. Vanliga anpassningar är “endast chef”-larm, att notifiera en dedikerad projektkanal i stället för individer, och att lägga till ett dagligt sammanfattningsmeddelande efter att individuella larm har skickats.
Oftast är det ett API-nyckelproblem eller att Odoo-användaren saknar behörighet att läsa ledighetsposter. Skapa en ny nyckel, bekräfta att bas-URL:en är korrekt och testa sedan om anropet “Fetch Tomorrow Leave Records” igen. Om det fungerar isolerat men fallerar i full körning, kontrollera det beräknade datumformatet för “i morgon” och se till att din Odoo-instans förväntar sig exakt det filtret.
Mer än tillräckligt för de flesta små och medelstora team: dussintals ledighetsposter per dag är normalt. På n8n Cloud Starter kan du köra ett bra antal dagliga körningar, och högre planer hanterar mer. Om du self-hostar finns ingen körningsgräns, och den praktiska begränsningen blir din server och hur snabbt Slack/Redmine svarar.
Ofta, ja. Det här arbetsflödet gör mycket “join och filter”-arbete mellan Odoo, Redmine och Slack, plus deduplicering, batchning och villkorsstyrd routning, och det blir snabbt klumpigt (och dyrt) i enklare verktyg. n8n ger dig också ett self-host-alternativ, vilket är hjälpsamt om du kör detta dagligen och inte vill tänka på task counts. Zapier eller Make kan fortfarande vara bättre om din version i praktiken är “Odoo-ledighet godkänd → posta i en kanal”, utan Redmine-matchning. Om du är osäker, prata med en automationsexpert så får du ett rakt svar.
När det här väl rullar slutar frånvaro vara en morgonöverraskning och blir i stället en eftermiddagsplan. Arbetsflödet tar hand om den repetitiva koordineringen så att teamet kan hålla ärendena i rörelse.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.