Dina offertförfrågningar kommer in. Sedan börjar röran. Du kopierar mått från ett formulär, översätter ”smooth plaster” till vad du nu råkade kalla det förra gången, letar upp rätt pris, räknar moms och oroar dig ändå för att du missat en rad.
Den här automatiseringen för JotForm Gmail quotes slår hårdast mot byggföretagare, men kontorsadministratörer och små byråteam som hanterar hantverkskunder känner av den också. Resultatet är enkelt: offerter går iväg snabbt, ser konsekventa ut och varje lead hamnar i en riktig pipeline i stället för att fastna i någons inkorg.
Nedan ser du hur flödet gör om en JotForm-inlämning till en sparad CRM-post plus ett momsredo, specificerat offertmejl i Gmail – och vad du behöver för att köra det stabilt.
Så fungerar automatiseringen
Se hur detta löser problemet:
n8n Workflow Template: JotForm + Gmail-offerter, momsredo och enhetliga
flowchart LR
subgraph sg0["Flow 1"]
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-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n2@{ icon: "mdi:location-exit", form: "rounded", label: "upsert form submission -error", pos: "b", h: 48 }
n3@{ icon: "mdi:location-exit", form: "rounded", label: "upsert form customer -error", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Parser", 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/supabase.svg' width='40' height='40' /></div><br/>Save Form Submission"]
n7["<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/supabase.svg' width='40' height='40' /></div><br/>Upsert Customer"]
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/supabase.svg' width='40' height='40' /></div><br/>Create Deal"]
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/supabase.svg' width='40' height='40' /></div><br/>Fetch Pricing Rules"]
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/code.svg' width='40' height='40' /></div><br/>Calculate Quote Line Items"]
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/supabase.svg' width='40' height='40' /></div><br/>Save Estimate Header"]
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/supabase.svg' width='40' height='40' /></div><br/>Insert Line Items"]
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Line Item Data", pos: "b", h: 48 }
n14["<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/supabase.svg' width='40' height='40' /></div><br/>Fetch Complete Quote"]
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/code.svg' width='40' height='40' /></div><br/>Generate Email HTML"]
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/supabase.svg' width='40' height='40' /></div><br/>Fetch Mapping Rules"]
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare AI Context", pos: "b", h: 48 }
n18["<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/>Normalize Form Data"]
n19@{ icon: "mdi:message-outline", form: "rounded", label: "Send Email node", pos: "b", h: 48 }
n5 --> n16
n5 --> n6
n0 --> n5
n1 --> n12
n8 --> n9
n7 --> n8
n7 --> n3
n12 --> n14
n17 --> n18
n16 --> n17
n9 --> n10
n15 --> n19
n18 --> n7
n14 --> n15
n11 --> n13
n6 --> n2
n13 --> n1
n10 --> n11
end
subgraph sg1["When clicking ‘Test workflow’ Flow"]
direction LR
n4@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n20["<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/>SQL Schema Generator"]
n4 --> n20
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 n4 trigger
class n0 api
class n10,n15,n18,n20 code
class n4 disabled
class n20 disabled
classDef customIcon fill:none,stroke:none
class n0,n6,n7,n8,n9,n10,n11,n12,n14,n15,n16,n18,n20 customIcon
Utmaningen: snabba offerter utan priskaos
I bygg och renovering är tempo viktigt, men precision är ännu viktigare. En kund skickar mått och tjänsteval via ett formulär, och plötsligt gör du små mängdningar för hand: vägg-m² här, takhöjd där, regler för våtrum någon annanstans. En ”snabb offert” kan bli en halvtimme av att kontrollera á-priser, lägga till förarbete, använda rätt momssats och skriva om samma mejl för hundrade gången. Och eftersom du har fullt upp hamnar datan sällan i ett prydligt CRM, vilket gör att uppföljningar glider och du tappar jobb du borde ha vunnit.
Det blir snabbt mycket. Här är var det skapar fel i verkligheten.
- Du skriver om samma kunduppgifter på flera ställen, och ett enda stavfel kan dela upp en kund i ”två” poster för alltid.
- Tjänstenamn glider över tid (”decorative plaster” vs ”ornamental finish”), vilket gör prissättningen inkonsekvent och rapporteringen i princip värdelös.
- Moms blir en sista-minuten-övning i kalkylark, särskilt när offerter innehåller blandade typer av arbete.
- Offerter ser olika ut beroende på vem som skickar dem, så ditt varumärke känns mindre än det är.
Lösningen: skapa offert från JotForm till CRM + skicka via Gmail
Det här flödet startar i samma sekund som en kund skickar in din JotForm-förfrågan. Det tolkar payloaden, plockar ut mått (som vägg- och takytor) och normaliserar rörigt mänskligt språk till konsekventa databasvärden (inklusive nederländska byggtermer mappade mot din katalog). Därefter sparar det råinlämningen för spårbarhet, upsertar kundposten baserat på e-post så att du inte skapar dubbletter och skapar en länkad ”deal” för projektet. Sedan hämtar det dina aktiva prisregler från Supabase, beräknar specificerade offerrader (material, arbete, påslag som höga tak och tillägg som förarbete), grupperar dubbletter och lagrar både offertens huvudpost och varje enskild rad. Till sist kör det en enda optimerad offertfråga och genererar ett varumärkesanpassat HTML-mejl med specificerad tabell och momsuppdelning, redo att skickas via Gmail.
Flödet triggas från en webhook kopplad till ditt formulär. Supabase fungerar som pris-motorn och ett lättviktigt CRM, medan n8n hanterar logik och formatering. Gmail skickar det färdiga offertmejlet med samma struktur varje gång.
Vad som förändras: före vs. efter
| Det här tar bort | Effekten du märker |
|---|---|
|
|
Effekt i verkligheten
Säg att du får 10 offertförfrågningar i veckan, och att varje tar cirka 45 minuter att göra om till ett korrekt, specificerat mejl (mått, prissättning, moms och formatering). Det är ungefär 7 timmar administrativ tid, och det hamnar ofta på kvällar. Med det här flödet är ”jobbet” i princip att granska den genererade offerten och trycka skicka i Gmail, vilket kanske tar 2 minuter per förfrågan. Du får tillbaka större delen av veckan, och dina offerter slutar variera från person till person.
Krav
- n8n-instans (prova n8n Cloud gratis)
- Självhostningsalternativ om du föredrar det (Hostinger fungerar bra)
- JotForm för att samla in strukturerade offertförfrågningar.
- Supabase för din CRM-databas och priskatalog.
- Gmail för att skicka det varumärkesanpassade offertmejlet.
Kunskapsnivå: medel. Du kopplar konton, klistrar in ett genererat SQL-schema i Supabase och justerar en offertmejlmall med dina företagsuppgifter.
Behöver du hjälp att implementera detta? Prata med en automationsexpert (gratis konsultation i 15 minuter).
Flödet steg för steg
En JotForm-inlämning träffar din webhook. Flödet tar emot payloaden direkt och delar sedan upp poster när formuläret innehåller flera efterfrågade tjänster eller upprepade sektioner.
Förfrågan städas upp och standardiseras. n8n tolkar mått som m² och takhöjd och normaliserar sedan valen med mappningsregler som lagras i Supabase (så att ”stucwerk” och ”plastering” kan landa på samma interna artikel).
Dina CRM-poster och prissättningslogik körs automatiskt. Supabase lagrar råinlämningen, upsertar kunden via e-post, skapar en länkad deal, hämtar aktiva prisregler och beräknar offerrader med villkorslogik för påslag och förarbete. Här blir ”tillräckligt bra uppskattningar” till konsekvent, upprepningsbar prissättning.
En polerad Gmail-offert skapas och skickas. Flödet hämtar hela offerten från en optimerad vy, bygger ett varumärkesanpassat HTML-mejl (logotyp, specificerad tabell, momsuppdelning, friskrivningar) och skickar det via Gmail.
Du kan enkelt ändra priskatalogen och mappningsreglerna så att de matchar din tjänstelista och lokal terminologi. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera webhook-triggern
Konfigurera inkommande webhook så att ert formulärsystem kan posta inskickade svar till arbetsflödet.
- Lägg till och öppna Incoming Webhook Trigger.
- Ställ in HTTP Method på
POST. - Ställ in Path på
b7ad1332-8112-4ba1-jotform. - Kopiera den genererade webhook-URL:en och klistra in den i ert formulärverktygs webhook-inställningar.
- Lämna Flowpast Branding som den är (endast informativt).
Steg 2: anslut Supabase (primär datalagring)
Det här arbetsflödet använder flera Supabase-noder för att lagra inskick, kunder, affärer, regler och offerter. Anslut behörigheter en gång och använd dem för alla Supabase-noder.
- Öppna varje Supabase-nod och välj behörighetstypen nedan.
- Credential Required: Anslut era supabaseApi-behörigheter för alla Supabase-noder (8+ noder hanterar inskick, kunder, affärer, regler, offerter, rader och rapportvyer).
- I Store Form Submission, bekräfta att Table är
form_submissionsoch att nyckelfält inkluderar{{ $json.submission_id }}och{{ $json.body.rawRequest }}. - I Retrieve Mapping Rules, bekräfta att Table är
form_value_mappings, att Operation ärgetAlloch att Return All är aktiverat. - I Retrieve Pricing Rules, bekräfta att Table är
service_rules_enriched, att Operation ärgetAlloch att Return All är aktiverat. - I Retrieve Full Quote, bekräfta att Table är
v_estimate_proformaoch att filtret använder{{ $('Store Estimate Summary').item.json.estimate_id }}.
Steg 3: konfigurera bearbetning och normalisering
Dessa noder standardiserar inkommande payload och förbereder normaliserade fält för efterföljande lagring och prissättning.
- I Parse Incoming Payload, bekräfta att tilldelningarna inkluderar
{{ $json.body.rawRequest }},{{ $json.ai.content }}och{{ $json.submission_id }}. - Notera den parallella körningen: Parse Incoming Payload skickar utdata till både Retrieve Mapping Rules och Store Form Submission parallellt.
- I Assemble AI Context, verifiera att de normaliserade mapping-arrayerna använder uttryck som
{{ [...new Set($input.all().filter(item => item.json.field_name === 'core_service_type').map(item => item.json.normalized_value))] }}. - I Normalize Form Inputs, behåll standardlogiken för mappning av namn, adress, tidslinje och normaliserade tjänstefält.
Steg 4: konfigurera offertberäkning och databasskrivningar
Det här avsnittet skapar kund-/affärsposter, beräknar offerrader och sparar offertdata.
- I Upsert Client Record, bekräfta fältmappningar som
{{ $json.normalized.ContactDetails.email }}och{{ $json.normalized.project_description }}. - I Generate Deal Entry, bekräfta att deal_name använder
{{ $json.last_name }}_{{ $json.phone }}och att form_submission_id använder{{ $('Assemble AI Context').item.json.submission_id }}. - I Compute Quote Items, granska kodlogiken för regelmatchning och totalsummor (inga behörigheter krävs).
- I Store Estimate Summary, bekräfta att estimate_number är satt till
{{ $execution.id }}och att valutan ärUSD. - I Map Line Item Data, bekräfta att lines mappas från
{{ $('Compute Quote Items').item.json.lines }}. - I Separate Records, bekräfta att Field to Split Out är
linesoch att Fields to Include ärestimate_id. - I Insert Quote Lines, bekräfta att radfälten mappas från
{{ $json.lines.description }},{{ $json.lines.quantity }}och{{ $json.lines.catalog_id }}.
Steg 5: konfigurera utdata och e-postleverans
Bygg HTML-offerten och skicka den till kunden via Gmail.
- I Build Email HTML, behåll HTML-mallen och mappningslogiken som hämtar från vyn
v_estimate_proforma. - Uppdatera bas-URL, Calendly-URL och företagets varumärkesprofil i Build Email HTML vid behov.
- Öppna Dispatch Email Notification och bekräfta att fälten använder uttryck som
{{ $('Build Email HTML').item.json.email_to }}och{{ $('Build Email HTML').item.json.html }}. - Credential Required: Anslut era gmailOAuth2-behörigheter i Dispatch Email Notification.
Steg 6: lägg till felhantering
Fel-noder fångar upp fel och stoppar körningen med strukturerade felobjekt.
- Säkerställ att Store Form Submission har On Error inställt på att fortsätta och att den routar till Handle Submission Error.
- Granska Handle Submission Error för att bekräfta att felpayloaden refererar till
{{ $('Incoming Webhook Trigger').item.json.body.submissionID }}och{{ $execution.id }}. - Säkerställ att Upsert Client Record routar till Handle Customer Error vid fel.
- Granska Handle Customer Error för att bekräfta att den fångar
submission_idochexecution_id.
v_estimate_proforma inte finns kommer Retrieve Full Quote och efterföljande e-postgenerering att misslyckas. Kör schemakonfigurationen först.Steg 7: (valfritt) generera Supabase-schema med manuell körning
Använd den inaktiverade manuella grenen för att generera SQL för er Supabase-databas om ni behöver bygga schemat snabbt.
- Aktivera Manual Run Trigger och Generate SQL Schema om ni vill skriva ut SQL-schemat.
- Kör arbetsflödet manuellt och kopiera utdata
sql_schematill Supabase SQL Editor. - När ni har kört SQL:en, inaktivera den manuella grenen för att undvika oavsiktlig körning.
price_catalog, service_rules och form_value_mappings för att undvika tomma offerter.Steg 8: testa och aktivera ert arbetsflöde
Kör ett fullständigt test från webhooken och verifiera datalagring och e-postleverans.
- Klicka på Execute Workflow och skicka ett exempel-POST till URL:en för Incoming Webhook Trigger.
- Bekräfta att Supabase-poster skapas i
form_submissions,customers,deals,estimatesochestimate_line_items. - Verifiera att Retrieve Full Quote returnerar data och att Build Email HTML genererar HTML-e-postmeddelandet.
- Kontrollera inkorgen för att bekräfta att Dispatch Email Notification skickar offerten utan problem.
- När allt fungerar, växla arbetsflödet till Active för att aktivera produktionskörning.
Se upp för
- Supabase-inloggning kan gå ut eller kräva specifika behörigheter. Om något slutar fungera, kontrollera Supabase-projektets Settings → API (Project URL och Service Role key) och bekräfta att nyckeln i n8n fortfarande är giltig.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in din varumärkesröst tidigt, annars kommer du redigera utdata för alltid.
Vanliga frågor
Cirka en timme om ditt formulär redan är byggt och du har Supabase redo.
Ja, men du vill ha någon som är bekväm med att kopiera den genererade SQL:en till Supabase och klistra in inloggningsuppgifter i n8n. Ingen ”riktig” kodning krävs, och det mesta av arbetet är bara att mappa dina formulärfält till din tjänstekatalog.
Ja. n8n har ett gratis självhostat 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å räkna in Supabase-kostnader (oftast gratisnivån) och vanlig Gmail-användning.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller självhosting på en VPS. För självhosting är Hostinger VPS prisvärd och hanterar n8n bra. Självhosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Börja med dina Supabase-tabeller: uppdatera price_catalog-artiklar och momssatser så att flödet prissätter som du faktiskt säljer. Justera sedan mappningsreglerna som flödet hämtar i ”Retrieve Mapping Rules” så att logiken i ”Normalize Form Inputs” känner igen dina fältnamn och tjänstebenämningar. De flesta team finjusterar också noden ”Build Email HTML” för att matcha varumärkesfärger, lägga till villkor och ändra call-to-action-knappar. Om du gör specialistjobb (ornament, listmeter, regler för våtrum), lägg in dem som katalogartiklar i stället för att hårdkoda dem.
Oftast beror det på en utgången Google OAuth-anslutning i n8n. Återanslut Gmail-credentialen, bekräfta att avsändarkontot har rätt att skicka som den adressen och dubbelkolla att du inte flyttat flödet mellan miljöer utan att uppdatera inloggningsuppgifterna. Om det fungerar manuellt men fallerar vid livekörningar, kontrollera Googles säkerhetsvarningar och eventuella kontobaserade sändningsbegränsningar.
För de flesta små team hanterar den er volym utan problem.
Ofta, ja, eftersom prissättningslogiken här är hela poängen. Zapier och Make kan skicka runt formulärfält, men detaljerade offertberäkningar (påslag, gruppering av artiklar, momsuppdelning, idempotenta upserts) blir ofta en skör kedja av steg som snabbt blir dyr. n8n trivs bättre med villkorslogik och datatransformering, och du kan självhosta för obegränsade körningar. Om du bara behöver ”skicka mig ett mejl när ett formulär skickas in”, håll det enkelt och använd det verktyg du redan betalar för. Om du vill ha en riktig offertmotor och CRM-poster är den här metoden ett stabilare val. Prata med en automationsexpert om du vill ha en second opinion på din setup.
När detta väl rullar slutar offertarbete vara en daglig flaskhals. Flödet tar hand om de repetitiva delarna så att du kan lägga tiden på arbete på plats, planering och att stänga affären.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.