Att ladda upp valutakurser i SAP Business One låter enkelt tills det blir en veckovis brandövning. Ett felaktigt datumformat, en saknad kurs eller en import som “lyckas” med dålig data – och du fastnar i att dubbelkolla allt en gång till.
Ekonomichefer märker det när månadsbokslutet blir tajt. Driftansvariga märker det när team börjar bygga egna “hjälparkalkylark”. Och om du driver en byrå eller konsultverksamhet som stöttar SAP B1-kunder är det här en typisk SAP B1-automatisering som tyst bränner timmar och förtroende.
Det här arbetsflödet tar valutakurser från Google Sheets (eller andra källor) och skickar dem till SAP B1:s Service Layer med konsekventa datum, valfri AI-validering och en tydlig logg i Sheets. Du får se vad det gör, vad du behöver och vilka resultat du kan förvänta dig.
Så fungerar automatiseringen
Hela n8n-flödet, från trigger till slutresultat:
n8n Workflow Template: SAP B1 + Google Sheets: rensade valutakurser
flowchart LR
subgraph sg0["OpenAI Flow"]
direction LR
n0["<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/>Webhook"]
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Enviar SAP (JSON)"]
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/>Conectar SAP"]
n4@{ icon: "mdi:cog", form: "rounded", label: "Microsoft SQL", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extraer Query", pos: "b", h: 48 }
n6["<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/>Enviar SAP (SQL)"]
n7@{ icon: "mdi:cog", form: "rounded", label: "Limit", 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/>Enviar SAP (MANUAL)"]
n9@{ icon: "mdi:robot", form: "rounded", label: "OpenAI", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Google Sheets", 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/>Enviar SAP (SHEET)"]
n13@{ icon: "mdi:database", form: "rounded", label: "Success", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Fallo", pos: "b", h: 48 }
n15@{ icon: "mdi:database", form: "rounded", label: "Success1", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "Comprobar Fecha", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "Fallo1", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "Success2", pos: "b", h: 48 }
n19@{ icon: "mdi:database", form: "rounded", label: "Fallo2", pos: "b", h: 48 }
n20@{ icon: "mdi:database", form: "rounded", label: "Success3", pos: "b", h: 48 }
n21@{ icon: "mdi:database", form: "rounded", label: "Fallo3", pos: "b", h: 48 }
n7 --> n16
n9 --> n10
n1 --> n9
n1 --> n5
n1 --> n11
n1 --> n8
n0 --> n3
n10 --> n2
n3 --> n1
n5 --> n4
n11 --> n12
n4 --> n7
n16 --> n6
n6 --> n15
n6 --> n17
n2 --> n13
n2 --> n14
n12 --> n18
n12 --> n19
n8 --> n20
n8 --> n21
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 n9,n16 ai
class n1 decision
class n11,n13,n14,n15,n17,n18,n19,n20,n21 database
class n0,n2,n3,n6,n8,n12 api
classDef customIcon fill:none,stroke:none
class n0,n2,n3,n6,n8,n12 customIcon
Problemet: valutakurser är “små” tills de får allt att haverera
Valutakurser ser inte ut som en stor process. Det är oftast ett kalkylark, ett datum och en siffra. Sedan underkänner SAP uppladdningen för att RateDate inte är i exakt formatet yyyyMMdd, eller för att någon klistrar in en tidsstämpel, eller för att arket har ett extra mellanslag som gör att en siffra blir text. Värst är osäkerheten. Du fixar inte bara den ena kursen – du omgranskar hela batchen eftersom du inte kan bevisa vad som skickades, när det skickades och vad SAP faktiskt accepterade.
Det summerar snabbt. Här är var det brukar fallera i verkliga team.
- Manuella importer blir en återkommande uppgift som stjäl ungefär en timme varje vecka, särskilt om du räknar in kontroll, dubbelkontroll och jakten på “rätt” fil.
- Datumformatering är en konstant fälla, eftersom SAP B1 är strikt och människor inte är det.
- När en uppladdning misslyckas har du sällan en tydlig spårbarhet av payloads och svar, så felsökningen blir gissningslek.
- Team börjar improvisera egna arbetssätt, vilket ger inkonsekventa kurser mellan system och röriga revisioner senare.
Lösningen: automatiserade uppladdningar med validering och loggar
Det här n8n-arbetsflödet automatiserar uppladdning av valutakurser till SAP Business One via Service Layer, och är byggt för verkligheten där kurser kommer från olika håll. Det börjar med en webhook som tar emot ett enkelt “origen”-värde (JSON, SQL, GoogleSheets eller Manual). Sedan loggar det in i SAP B1, hämtar sessionscookien och routar flödet baserat på din källa. Om indata är stökig kan valfria AI-steg normalisera strukturen och standardisera RateDate till exakt det format SAP kräver. Till sist postas varje kurs till SAP, och varje lyckat eller misslyckat försök skrivs till en Google Sheets-logg så att du kan bevisa vad som hände.
Arbetsflödet startar när du skickar data till webhook-endpointen. Det autentiserar en gång och behandlar sedan kurser från vald källa i en kontrollerad sekvens. Efter varje post till SAP B1 lägger det till en rad i ditt LOGS_N8N-ark med metod, URL, payload, statuskod och meddelande.
Det du får: automatisering vs. resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut i praktiken
Säg att du laddar upp 15 valutakurser varje måndag. Manuellt kan du lägga cirka 3 minuter per kurs på att exportera, formatera datumet, importera och sedan fixa 2–3 som felar – vilket landar på ungefär en timme. Med det här arbetsflödet uppdaterar du Google-arket (eller skickar JSON) och triggar webhooken en gång, vilket tar runt 5 minuter. Automatiseringen postar sedan varje kurs och loggar utfallen. Du granskar fortfarande loggen, men du granskar bevis – inte gissningar.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- SAP Business One Service Layer för att posta valutakurser via API
- Google Sheets för indata och LOGS_N8N-revisionslogg
- OpenAI API-nyckel (hämta den i din OpenAI-dashboard)
Kompetensnivå: Medel. Du klistrar in inloggningsuppgifter, mappar några fält och testar med exempeldata, men du behöver inte skriva kod.
Vill du inte sätta upp detta själv? Prata med en automationsspecialist (gratis 15-minuters konsultation).
Så fungerar det
En webhook tar emot din kursbegäran. Du skickar en HTTP POST till arbetsflödets endpoint med “origen” (JSON, SQL, GoogleSheets eller Manual) och den data som behövs för den vägen.
Autentisering mot SAP B1 sker direkt. Arbetsflödet anropar SAP B1 Login-endpointen, fångar B1SESSION-cookien och använder den för alla postningar av valutakurser så att du inte behöver autentisera om för varje rad.
Din valda källa bearbetas och städas upp. Google Sheets hämtar rader från RATE-arket, SQL kör en fråga mot Microsoft SQL Server och JSON normaliseras till en förutsägbar lista. Om datumen är tveksamma skriver AI-valideringssteget om RateDate till yyyyMMdd så att SAP godkänner det.
Varje kurs postas och loggas. Varje request mot /SBOBobService_SetCurrencyRate avslutas med att en rad för lyckat eller misslyckat skrivs till LOGS_N8N, inklusive payload och detaljer från SAP-svaret.
Du kan enkelt justera reglerna för indatakällor för att införa extra kontroller (som tillåtna valutor eller maxförändring i kurs) utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera webhook-triggern
Konfigurera den inkommande webhooken som startar arbetsflödet och skickar källdata vidare till efterföljande routning och bearbetning.
- Lägg till och öppna Incoming Webhook Trigger.
- Ställ in HTTP Method på
POST. - Ställ in Path på
b81a1fa5-2138-4b70-80ee-945fa44e69ce. - Skicka en test-POST-payload som innehåller body.origen och relevanta datafält för JSON-, SQL-, GoogleSheets- eller Manual-vägarna.
JSON, SQL, GoogleSheets, Manual) så att switchen routar korrekt.Steg 2: anslut Google Sheets- och SQL-datakällor
Konfigurera åtkomst till datakällor för att läsa kurser från Google Sheets och köra SQL-frågor, och routa sedan anrop baserat på webhook-payloaden.
- Öppna Route by Source och bekräfta att varje regel använder uttrycket
{{ $('Incoming Webhook Trigger').item.json.body.origen }}med rätt värdenJSON,SQL,GoogleSheetsochManual. - Öppna Extract SQL Statement och ställ in select_sql på
{{ $('Incoming Webhook Trigger').item.json.body.sql }}. - Öppna SQL Server Query och ställ in Query på
{{ $json.select_sql }}. - Inloggningsuppgifter krävs: Anslut era microsoftSql-inloggningsuppgifter i SQL Server Query.
- Öppna Read Sheet Rates, ställ in Document ID på
1xFcJSzQyhPOaC-zeX2dJ7LaUxpg-vxiN3EAOBxLTQ4goch Sheet Name påHoja 1(gid0). - Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-inloggningsuppgifter i Read Sheet Rates och alla Google Sheets-loggnoder (det finns totalt 9 Google Sheets-noder för läsning och loggning).
body.origen-strängen exakt (skiftlägeskänsligt), kommer flödet inte att nå Extract SQL Statement, Read Sheet Rates eller Post SAP Rate Manual.Steg 3: sätt upp AI-bearbetning och normalisering
Använd AI för att normalisera JSON-payloads och validera datumformatet för kursdatum innan ni postar till SAP.
- Öppna Normalize JSON via AI och låt JSON Output vara aktiverat.
- Bekräfta att meddelandet använder JSON-inmatningsuttrycket
{{ $('Incoming Webhook Trigger').item.json.body.json }}. - Inloggningsuppgifter krävs: Anslut era openAiApi-inloggningsuppgifter i Normalize JSON via AI.
- Öppna Split Rate Items och ställ in Field to Split Out på
message.content.rate. - Öppna Validate Rate Date och låt JSON Output vara aktiverat för att normalisera
RateDatetillyyyyMMdd. - Inloggningsuppgifter krävs: Anslut era openAiApi-inloggningsuppgifter i Validate Rate Date.
gpt-4o-mini som standard; säkerställ att ert OpenAI-konto har åtkomst till den modellen.Steg 4: konfigurera utdata och noder för SAP-postning
Logga in i SAP och posta sedan kurser till SAP för varje källtyp (JSON, SQL, Google Sheets eller Manual).
- Öppna SAP Login Session och ställ in URL på
{{ $vars.url_sap }}Loginmed JSON-body som använder{{ $vars.user_sap }},{{ $vars.password_sap }}och{{ $vars.company_db }}. - Öppna Post SAP Rate JSON och ställ in URL på
{{ $vars.url_sap }}SBOBobService_SetCurrencyRatemed JSON-body som mappar{{ $json.Currency }},{{ $json.Rate }}och{{ $json.RateDate }}. - Säkerställ att Post SAP Rate JSON inkluderar headern Cookie
=B1SESSION={{ $('SAP Login Session').item.json.SessionId }}. - Öppna Post SAP Rate SQL och mappa värden från
{{ $json.message.content.Currency }},{{ $json.message.content.Rate }}och{{ $json.message.content.RateDate }}. - Öppna Post SAP Rate Sheet och mappa värden från
{{ $json.Currency }},{{ $json.Rate }}och{{ $json.RateDate }}. - Öppna Post SAP Rate Manual och mappa värden från
{{ $('Incoming Webhook Trigger').item.json.body.currency }},{{ $('Incoming Webhook Trigger').item.json.body.rate }}och{{ $('Incoming Webhook Trigger').item.json.body.rateDate }}. - Bekräfta att Limit Batch Size är inställd på Max Items
10för att strypa SQL-resultat innan AI-validering.
Steg 5: lägg till felhantering och loggning
Logga lyckade och misslyckade körningar för varje postningsväg till Google Sheets för att behålla en komplett revisionsspårning.
- Verifiera att varje SAP-postningsnod skickar vidare till sina loggnoder: Post SAP Rate JSON → Log Success JSON och Log Failure JSON, Post SAP Rate SQL → Log Success SQL och Log Failure SQL, Post SAP Rate Sheet → Log Success Sheet och Log Failure Sheet, Post SAP Rate Manual → Log Success Manual och Log Failure Manual.
- Bekräfta att varje loggnod använder Operation
appendför att skriva en ny rad till logg-kalkylarket. - Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-inloggningsuppgifter till Log Success JSON, Log Failure JSON, Log Success SQL, Log Failure SQL, Log Success Sheet, Log Failure Sheet, Log Success Manual och Log Failure Manual.
Steg 6: testa och aktivera ert arbetsflöde
Kör end-to-end-tester för varje källtyp för att verifiera routning, bearbetning och SAP-postning.
- Klicka på Execute Workflow och skicka en test-webhook-payload med
origensatt tillJSON,SQL,GoogleSheetsellerManual. - Bekräfta att SAP Login Session returnerar ett session-id och att motsvarande SAP-postningsnod tar emot det.
- Kontrollera att en rad för lyckad körning visas i rätt loggnod (till exempel Log Success JSON efter Post SAP Rate JSON).
- Om fel uppstår, verifiera att felrader visas i motsvarande fel-loggblad.
- När testerna lyckas, slå på arbetsflödet till Active för användning i produktion.
Vanliga fallgropar
- Inloggningsuppgifter för SAP Business One Service Layer kan gå ut eller kräva specifika behörigheter. Om det strular: kontrollera först svaret från Login-endpointen och ditt CompanyDB-värde.
- Om du använder Wait-noder eller extern rendering kan processtiderna variera. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- OpenAI-prompter som fungerar “i allmänhet” kan ändå ge konstiga datumkonverteringar. Lägg in dina föredragna format och exempel i valideringsprompten tidigt – annars kommer du fortsätta punktfixa specialfall.
Vanliga frågor
Cirka 30 minuter om dina SAP- och Google-uppgifter är klara.
Nej. Du kopplar mest konton och mappar fält. Flödeslogiken är redan byggd.
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 volymer. Du behöver också räkna med kostnader för OpenAI API, som oftast är några cent per batch beroende på hur många rader du validerar.
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 är en vanlig justering. Du kan lägga in ett godkännandesteg efter “Validate Rate Date” (för SQL) eller efter “Read Sheet Rates” (för Google Sheets) innan HTTP Request som postar till SAP. Vissa team skickar väntande poster till Telegram för ett snabbt ja/nej, andra skriver dem till ett separat “APPROVAL”-ark och postar bara godkända rader.
Oftast beror det på ett ogiltigt Login-svar eller en saknad/utgången sessionscookie. Bekräfta SAP-URL:en (inklusive /b1s/v1/), CompanyDB-värdet och att Login-endpointen returnerar en B1SESSION-cookie som n8n kan återanvända. Om det fungerar en gång och sedan fallerar i skov kan det bero på miljöskillnader (test vs prod) eller SSL-/certifikatdetaljer på SAP-servern.
Tillräckligt för typiska ekonomibatcher, och den inbyggda noden “Limit Batch Size” hjälper till att hålla körningen stabil.
Ofta, ja – eftersom det här är mer än en enkel “skicka rad till SAP”-zap. Du loggar in i SAP, bär med dig en sessionscookie, förgrenar per källa, validerar datum och skriver detaljerade loggar – den typen av flersteglogik blir snabbt klumpig (och dyr) i enklare verktyg. n8n ger också ett self-hosted-alternativ, vilket spelar roll när antalet körningar växer. Zapier eller Make kan fortfarande vara helt okej för mycket små volymer med en enda källa och utan validering. Om du är osäker, prata med en automationsspecialist och få en rak rekommendation.
Felfria kurser, korrekta datum, tydliga loggar. Sätt upp det en gång, så slutar dina SAP B1-valutauppdateringar vara en veckovis distraktion.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.