This workflow corresponds to n8n.io template #15993 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "[template] Booking Confirmation with Calendar Invite",
"nodes": [
{
"id": "03ede767-db9f-46bd-b599-da227a3ab663",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
26048,
8592
],
"parameters": {
"width": 480,
"height": 896,
"content": "## Booking confirmation with calendar invite\n\nSends customers a branded booking confirmation email with an attached `.ics` calendar file the moment a booking is accepted on your Sharetribe marketplace.\n\n### How it works\n\n1. A Sharetribe trigger fires whenever a booking is updated on the marketplace.\n2. The workflow checks if the booking status is 'accepted'; if not, the flow branches and stops early.\n3. Marketplace branding assets (URL, primary color, email footer text) are fetched from Sharetribe and merged with the booking event data.\n4. The full booking transaction is retrieved and key email fields (listing, customer, timezone) are extracted.\n5. A branded HTML email body is constructed with custom code and rendered into final HTML.\n6. A calendar invite (.ics) is generated and attached to a booking confirmation email sent via Gmail.\n\n### Setup steps\n\n- - [ ] Connect your Sharetribe credentials to the trigger node and all Sharetribe action nodes.\n- - [ ] Set the correct marketplace URL in the **Marketplace Settings** node.\n- - [ ] Connect your Gmail account credentials to the **Send Booking Confirmation** node.\n- - [ ] Review the **Build Email Body** and **Generate Calendar Invite** code nodes to ensure field names match your Sharetribe data structure.\n- - [ ] Verify the booking status value used in **Check Booking Accepted** matches your Sharetribe transaction process state (e.g., `accepted`).\n\n### Customization\n\nYou can update the branding color logic in **Get Branding Color** and the footer in **Get Email Footer Text** to pull from different Sharetribe asset keys. The HTML template in **Render Email HTML** can be redesigned to match your marketplace's style."
},
"typeVersion": 1
},
{
"id": "e92bc531-c285-4ef1-915e-3ba8542bd667",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
26608,
8688
],
"parameters": {
"color": 7,
"width": 416,
"height": 320,
"content": "## Trigger and booking status check\n\nListens for booking update events on Sharetribe, then checks whether the booking has been accepted before proceeding."
},
"typeVersion": 1
},
{
"id": "b765688e-f6e1-45ee-ae15-cb4714e08c82",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
27056,
8800
],
"parameters": {
"color": 7,
"width": 864,
"height": 304,
"content": "## Fetch marketplace branding assets\n\nSets the marketplace URL, then retrieves the marketplace info, primary branding color, and email footer text from Sharetribe \u2014 all used to style the confirmation email."
},
"typeVersion": 1
},
{
"id": "60074850-50ea-45fd-a8d7-ea637ba88fe1",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
27952,
8592
],
"parameters": {
"color": 7,
"height": 416,
"content": "## Merge assets with booking data\n\nCombines the fetched marketplace branding assets with the original booking event data into a single stream for downstream processing."
},
"typeVersion": 1
},
{
"id": "d4a78278-c4f5-4f1c-8aeb-cbead55de501",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
28224,
8672
],
"parameters": {
"color": 7,
"width": 416,
"height": 336,
"content": "## Fetch transaction and prepare fields\n\nRetrieves the full booking transaction from Sharetribe and extracts key fields such as transaction ID, listing title, timezone, and customer first name for use in the email."
},
"typeVersion": 1
},
{
"id": "ae64da17-6361-4448-9a68-bc58c42c0c12",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
28672,
8672
],
"parameters": {
"color": 7,
"width": 416,
"height": 336,
"content": "## Build and render email HTML\n\nUses custom code to assemble the email body structure with booking details and branding, then renders it into final HTML ready for sending."
},
"typeVersion": 1
},
{
"id": "d313826d-457a-4ff4-b9ad-78259bd9286f",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
29120,
8688
],
"parameters": {
"color": 7,
"width": 416,
"height": 320,
"content": "## Generate invite and send confirmation\n\nGenerates a calendar invite (.ics file) for the booking and sends the branded HTML confirmation email with the invite attached via Gmail."
},
"typeVersion": 1
},
{
"id": "abfbb3b3-37cf-4044-90bb-1fe46375f287",
"name": "When Booking Created or Updated",
"type": "n8n-nodes-sharetribe.sharetribeTrigger",
"maxTries": 3,
"position": [
26656,
8848
],
"parameters": {
"simplify": false,
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"resources": [
"booking"
],
"eventTypes": [
"booking/updated"
],
"eventAttributes": [
"createdAt",
"resourceId",
"resource"
]
},
"credentials": {
"sharetribeOAuth2Api": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"id": "0656f64f-77ca-4a36-b1ae-3deb2d51a248",
"name": "If Booking Accepted",
"type": "n8n-nodes-base.if",
"position": [
26880,
8848
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "booking-accepted",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.attributes.resource.attributes.state }}",
"rightValue": "accepted"
}
]
}
},
"typeVersion": 2
},
{
"id": "661e10c0-d1ce-41b2-a7ae-2eb2d10afa0d",
"name": "Set Marketplace URL",
"type": "n8n-nodes-base.set",
"position": [
27104,
8928
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "marketplace-url",
"name": "marketplaceUrl",
"type": "string",
"value": "https://www.yourmarketplace.com"
}
]
}
},
"executeOnce": true,
"typeVersion": 3.4
},
{
"id": "425ef440-52fa-49ea-b9a9-79a89ca1c7b1",
"name": "Fetch Marketplace Data",
"type": "n8n-nodes-sharetribe.sharetribe",
"maxTries": 3,
"position": [
27328,
8928
],
"parameters": {
"resource": "marketplace"
},
"credentials": {
"sharetribeOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": true,
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"id": "e0a3480a-545d-4875-b96a-2c74df6b7424",
"name": "Fetch Branding Color",
"type": "n8n-nodes-sharetribe.sharetribe",
"maxTries": 3,
"position": [
27552,
8928
],
"parameters": {
"resource": "asset",
"assetCategory": "/design/branding.json"
},
"credentials": {
"sharetribeOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": true,
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"id": "48ccc5d0-fea9-4d73-b4f8-c7e8d6dec075",
"name": "Fetch Email Footer Text",
"type": "n8n-nodes-sharetribe.sharetribe",
"maxTries": 3,
"position": [
27776,
8928
],
"parameters": {
"resource": "asset",
"emailTextsFilterKeys": [
"TransactionEmails.MembershipParagraph"
],
"enableEmailTextsFilter": true
},
"credentials": {
"sharetribeOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": true,
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"id": "795567e8-d43c-4d45-a5b7-cd23b20fad37",
"name": "Fetch Booking Transaction",
"type": "n8n-nodes-sharetribe.sharetribe",
"maxTries": 3,
"position": [
28272,
8848
],
"parameters": {
"resource": "transaction",
"simplify": false,
"userFields": [
"firstName",
"displayName",
"email"
],
"listingFields": [
"title",
"timezone"
],
"transactionId": "={{ $json.attributes.resource.relationships.transaction.data.id }}",
"transactionFields": [
"booking",
"customer",
"provider",
"listing"
]
},
"credentials": {
"sharetribeOAuth2Api": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"id": "43aecfef-d9cd-46df-a247-4e80d4041e34",
"name": "Prepare Customer Email Fields",
"type": "n8n-nodes-base.set",
"position": [
28496,
8848
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "transaction-id",
"name": "transaction.id",
"type": "string",
"value": "={{ $json.id }}"
},
{
"id": "listing-title",
"name": "listing.title",
"type": "string",
"value": "={{ $json.listing.title }}"
},
{
"id": "listing-timezone",
"name": "listing.timezone",
"type": "string",
"value": "={{ $json.listing.availabilityPlan.timezone }}"
},
{
"id": "customer-first-name",
"name": "customer.firstName",
"type": "string",
"value": "={{ $json.customer.profile.firstName }}"
},
{
"id": "customer-email",
"name": "customer.email",
"type": "string",
"value": "={{ $json.customer.email }}"
},
{
"id": "provider-display-name",
"name": "provider.displayName",
"type": "string",
"value": "={{ $json.provider.profile.displayName }}"
},
{
"id": "booking-start",
"name": "booking.start",
"type": "string",
"value": "={{ $json.booking.start }}"
},
{
"id": "booking-end",
"name": "booking.end",
"type": "string",
"value": "={{ $json.booking.end }}"
},
{
"id": "marketplace-name",
"name": "marketplace.name",
"type": "string",
"value": "={{ $('Fetch Marketplace Data').first().json.name }}"
},
{
"id": "marketplace-url",
"name": "marketplace.url",
"type": "string",
"value": "={{ $('Set Marketplace URL').first().json.marketplaceUrl }}"
},
{
"id": "notification-primary-button",
"name": "notificationPrimaryButton",
"type": "string",
"value": "={{ $('Fetch Branding Color').first().json.data?.marketplaceColors?.notificationPrimaryButton || $('Fetch Branding Color').first().json.data?.marketplaceColors?.primaryButton || \"#0062ff\" }}"
},
{
"id": "booking-url",
"name": "bookingUrl",
"type": "string",
"value": "={{ $('Set Marketplace URL').first().json.marketplaceUrl + \"/order/\" + $json.id }}"
},
{
"id": "email-footer",
"name": "emailFooter",
"type": "string",
"value": "={{ ($('Fetch Email Footer Text').item.json.data['TransactionEmails.MembershipParagraph'] || \"\").replaceAll(\"{marketplaceName}\", $('Merge Assets With Booking Events').first().json.name) }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "49422343-22a4-40df-96b4-10fda9223aa7",
"name": "Build Email Body Content",
"type": "n8n-nodes-base.code",
"position": [
28720,
8848
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const item = $input.item.json;\n\nfunction formatInTz(isoDate, timezone) {\n if (!timezone) return new Date(isoDate).toISOString();\n return new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n }).format(new Date(isoDate));\n}\n\nfunction tzShortLabel(timezone, refIsoDate) {\n if (!timezone) return '';\n const ref = refIsoDate ? new Date(refIsoDate) : new Date();\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n timeZoneName: 'short',\n }).formatToParts(ref);\n const tzPart = parts.find((p) => p.type === 'timeZoneName');\n return tzPart ? tzPart.value : '';\n}\n\nfunction htmlEscape(text) {\n return String(text || '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nconst startInTz = formatInTz(item.booking.start, item.listing.timezone);\nconst endInTz = formatInTz(item.booking.end, item.listing.timezone);\nconst tzShort = tzShortLabel(item.listing.timezone, item.booking.start);\nconst timezoneDisplay = item.listing.timezone\n ? (tzShort ? `${tzShort} ${item.listing.timezone}` : item.listing.timezone)\n : '';\n\nconst heading = `Calendar invite for your booking: ${item.listing.title}`;\nconst intro = 'Here is a calendar invite for your booking. Open the attached .ics file to add it to Google Calendar, Apple Calendar, Outlook, or any other calendar app.';\n\n// --- Plain text body ---\n\nconst bodyTextLines = [\n heading,\n '',\n `Hi ${item.customer.firstName},`,\n '',\n intro,\n '',\n `Listing: ${item.listing.title}`,\n `Provider: ${item.provider.displayName}`,\n `Start: ${startInTz}`,\n `End: ${endInTz}`,\n];\nif (timezoneDisplay) bodyTextLines.push(`Timezone: ${timezoneDisplay}`);\nbodyTextLines.push(\n '',\n `View the booking on ${item.marketplace.name}:`,\n item.bookingUrl,\n);\nif (item.emailFooter) {\n bodyTextLines.push('', '---', item.emailFooter);\n}\nconst bodyText = bodyTextLines.join('\\n');\n\n// --- Pre-rendered HTML fragments for the email template ---\n\nfunction infoRow(label, value) {\n return `<tr><td><p style=\"font-size:16px;line-height:1.4;margin:8px 0;color:#484848;font-weight:700\">${htmlEscape(label)}</p></td><td style=\"text-align:right\"><p style=\"font-size:16px;line-height:1.4;margin:8px 0;color:#484848\">${htmlEscape(value)}</p></td></tr>`;\n}\n\nconst infoRowsHtml = [\n infoRow('Listing', item.listing.title),\n infoRow('Provider', item.provider.displayName),\n infoRow('Start', startInTz),\n infoRow('End', endInTz),\n timezoneDisplay ? infoRow('Timezone', timezoneDisplay) : '',\n].join('');\n\nconst footerHtml = item.emailFooter\n ? `<div><hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;border-color:#E1E1E1;margin:20px 0\"><p style=\"font-size:12px;line-height:15px;margin:0 auto;color:#b7b7b7;text-align:left;margin-bottom:50px\">${htmlEscape(item.emailFooter)}</p></div>`\n : '';\n\nreturn {\n json: {\n ...item,\n startInTz,\n endInTz,\n timezoneDisplay,\n heading,\n intro,\n bodyText,\n infoRowsHtml,\n footerHtml,\n },\n};"
},
"typeVersion": 2
},
{
"id": "368a0752-7e15-48c8-a108-061912866848",
"name": "Render Confirmation Email HTML",
"type": "n8n-nodes-base.html",
"position": [
28944,
8848
],
"parameters": {
"html": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html lang=\"en\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\">\n</head>\n<body>\n <table style=\"background-color:#FFF;margin:0 auto;padding:24px 12px 0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif\" align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" width=\"100%\">\n <tbody>\n <tr>\n <td>\n <table align=\"center\" role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"max-width:600px;margin:0 auto\">\n <tr style=\"width:100%\">\n <td>\n <h1 style=\"color:#484848;font-size:26px;line-height:1.3;font-weight:700\">{{ $json.heading }}</h1>\n <p style=\"font-size:16px;line-height:1.4;margin:16px 0;color:#484848\">Hi {{ $json.customer.firstName }},</p>\n <p style=\"font-size:16px;line-height:1.4;margin:16px 0;color:#484848\">{{ $json.intro }}</p>\n\n <table style=\"color:#484848;font-size:16px;line-height:1.4;background-color:#FFF;padding:8px 24px;border-radius:8px;border:1px solid;border-color:#E1E1E1;margin:24px 0\" align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" width=\"100%\">\n <tbody>\n <tr>\n <td>\n <table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" width=\"100%\">\n <tbody>\n {{ $json.infoRowsHtml }}\n </tbody>\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n\n <table style=\"padding:16px 0 0\" align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" width=\"100%\">\n <tbody>\n <tr>\n <td>\n <a href=\"{{ $json.bookingUrl }}\" target=\"_blank\" style=\"color:#FFF;background-color:{{ $json.notificationPrimaryButton }};border-radius:4px;font-size:15px;text-decoration:none;text-align:center;display:inline-block;min-width:210px;padding:0;line-height:100%;max-width:100%\">\n <span style=\"color:#FFF;background-color:{{ $json.notificationPrimaryButton }};border-radius:4px;font-size:15px;text-decoration:none;text-align:center;display:inline-block;min-width:210px;padding:16px 32px;max-width:100%;line-height:120%;text-transform:none\">View booking</span>\n </a>\n <div>\n <p style=\"font-size:14px;line-height:1.5;margin:16px 0;color:#484848\">Can't click the button? Here's a link for your convenience: <a target=\"_blank\" style=\"color:{{ $json.notificationPrimaryButton }};text-decoration:none\" href=\"{{ $json.bookingUrl }}\">{{ $json.bookingUrl }}</a></p>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n\n {{ $json.footerHtml }}\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n</body>\n</html>"
},
"typeVersion": 1
},
{
"id": "d067b2bc-e835-4af3-8007-82425071af26",
"name": "Generate Calendar Invite ICS",
"type": "n8n-nodes-base.code",
"position": [
29168,
8848
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const item = $('Build Email Body Content').item.json;\n\nfunction formatIcsDate(isoDate) {\n return new Date(isoDate).toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n}\n\nfunction icsEscape(text) {\n return String(text || '').replace(/\\\\/g, '\\\\\\\\').replace(/;/g, '\\\\;').replace(/,/g, '\\\\,').replace(/\\n/g, '\\\\n');\n}\n\nconst start = formatIcsDate(item.booking.start);\nconst end = formatIcsDate(item.booking.end);\nconst now = formatIcsDate(new Date().toISOString());\nconst marketplaceName = icsEscape(item.marketplace.name);\nconst listingTitleIcs = icsEscape(item.listing.title);\n\nconst descriptionLines = [\n `Listing: ${item.listing.title}`,\n `Provider: ${item.provider.displayName}`,\n `Start: ${item.startInTz}`,\n `End: ${item.endInTz}`,\n];\nif (item.timezoneDisplay) descriptionLines.push(`Timezone: ${item.timezoneDisplay}`);\ndescriptionLines.push('', `View on ${item.marketplace.name}: ${item.bookingUrl}`);\nconst description = icsEscape(descriptionLines.join('\\n'));\nconst host = (item.marketplace.url || 'marketplace').replace(/^https?:\\/\\//, '');\n\nconst icsLines = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n `PRODID:-//${marketplaceName}//Booking Confirmation//EN`,\n 'CALSCALE:GREGORIAN',\n 'METHOD:PUBLISH',\n 'BEGIN:VEVENT',\n `UID:${item.transaction.id}@${host}`,\n `DTSTAMP:${now}`,\n `DTSTART:${start}`,\n `DTEND:${end}`,\n `SUMMARY:${listingTitleIcs}`,\n `DESCRIPTION:${description}`,\n `URL:${item.bookingUrl}`,\n `ORGANIZER;CN=${marketplaceName}:${item.bookingUrl}`,\n 'STATUS:CONFIRMED',\n 'PRIORITY:1',\n 'END:VEVENT',\n 'END:VCALENDAR',\n];\nconst icsContent = icsLines.join('\\r\\n');\n\nreturn {\n json: item,\n binary: {\n data: {\n data: Buffer.from(icsContent, 'utf8').toString('base64'),\n mimeType: 'text/calendar',\n fileName: `booking-${String(item.transaction.id).substring(0, 8)}.ics`,\n },\n },\n};"
},
"typeVersion": 2
},
{
"id": "31a1dbc7-dd1c-4e38-b50c-e2a8b4e47ccf",
"name": "Send Booking Confirmation Email",
"type": "n8n-nodes-base.gmail",
"position": [
29392,
8848
],
"parameters": {
"sendTo": "={{ $('Prepare Customer Email Fields').item.json.customer.email }}",
"message": "={{ $('Render Confirmation Email HTML').item.json.html }}",
"options": {
"attachmentsUi": {
"attachmentsBinary": [
{}
]
},
"appendAttribution": false
},
"subject": "={{ $json.heading }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "e592c259-7b46-4835-b15e-774310562753",
"name": "Merge Assets With Booking Events",
"type": "n8n-nodes-base.merge",
"position": [
28000,
8848
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineAll"
},
"typeVersion": 3.2
}
],
"connections": {
"If Booking Accepted": {
"main": [
[
{
"node": "Set Marketplace URL",
"type": "main",
"index": 0
},
{
"node": "Merge Assets With Booking Events",
"type": "main",
"index": 1
}
]
]
},
"Set Marketplace URL": {
"main": [
[
{
"node": "Fetch Marketplace Data",
"type": "main",
"index": 0
}
]
]
},
"Fetch Branding Color": {
"main": [
[
{
"node": "Fetch Email Footer Text",
"type": "main",
"index": 0
}
]
]
},
"Fetch Marketplace Data": {
"main": [
[
{
"node": "Fetch Branding Color",
"type": "main",
"index": 0
}
]
]
},
"Fetch Email Footer Text": {
"main": [
[
{
"node": "Merge Assets With Booking Events",
"type": "main",
"index": 0
}
]
]
},
"Build Email Body Content": {
"main": [
[
{
"node": "Render Confirmation Email HTML",
"type": "main",
"index": 0
}
]
]
},
"Fetch Booking Transaction": {
"main": [
[
{
"node": "Prepare Customer Email Fields",
"type": "main",
"index": 0
}
]
]
},
"Generate Calendar Invite ICS": {
"main": [
[
{
"node": "Send Booking Confirmation Email",
"type": "main",
"index": 0
}
]
]
},
"Prepare Customer Email Fields": {
"main": [
[
{
"node": "Build Email Body Content",
"type": "main",
"index": 0
}
]
]
},
"Render Confirmation Email HTML": {
"main": [
[
{
"node": "Generate Calendar Invite ICS",
"type": "main",
"index": 0
}
]
]
},
"When Booking Created or Updated": {
"main": [
[
{
"node": "If Booking Accepted",
"type": "main",
"index": 0
}
]
]
},
"Merge Assets With Booking Events": {
"main": [
[
{
"node": "Fetch Booking Transaction",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2sharetribeOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow listens for accepted booking updates in Sharetribe, fetches marketplace branding and transaction details, then sends a branded Gmail confirmation email to the customer with an attached .ics calendar invite. Triggers every minute by polling Sharetribe for booking…
Source: https://n8n.io/workflows/15993/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Tags: Supply Chain Management, Logistics, Transportation
This workflow implements a lightweight authentication system for n8n web portals using Google Sheets as a simple user and session store. It supports email-based registration, username and password log
This workflow automates the process of retrieving Stripe invoices, validating API responses, generating payment receipts, sending them via email, storing PDFs in Google Drive, and appending details to
Receive orders via webhook with automatic payment verification, stock checking, inventory reservation, shipping label generation, confirmation emails, and Slack notifications.
OTP Verification System. Uses googleSheets, gmail. Webhook trigger; 23 nodes.