Send admin email alerts for paid Sharetribe transactions with Gmail
Pull contacts, verify each address with BillionVerify, and continue to Sharetribe — only deliverable addresses get through.
Why verify before the send
Sending to invalid, risky, catch-all, or disposable addresses spikes your bounce rate and erodes sender reputation. A verification gate before the Sharetribe step removes that risk automatically — only deliverable addresses continue, the rest are flagged.
The workflow
BillionVerify — verification sits right before the send.
Node by node
- 1When New Sharetribe EventTrigger· n8n
Starts the workflow — on a schedule, a webhook, or manually while you test.
- 2Check Pre-payment TransitionLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 3Fetch Last TransitionSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 4Check Payment ConfirmationLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 5Retrieve Transaction DetailsSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 6Fetch Marketplace NameSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 7Prepare Email FieldsSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 8Verify Email (BillionVerify)Verify· billionverify
The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.
- 9IF deliverableLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 10Send Admin Payment EmailSend· n8n
Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.
Workflow JSON
Copy or download this workflow, then import it in n8n (Workflows → Import from File / Paste). Install the BillionVerify community node first, then add your API key credential.
{
"name": "Send admin email alerts for paid Sharetribe transactions with Gmail + BillionVerify",
"nodes": [
{
"id": "6d8c8436-38be-4c63-ad02-545a3a33c0b1",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
2256,
176
],
"parameters": {
"width": 480,
"height": 864,
"content": "## [template] Admin Email on New Paid Transaction\n\n### How it works\n\nThis workflow monitors Sharetribe transaction events and filters for transactions that have just moved from pre-payment into a confirmed paid state. When a qualifying transaction is found, it gathers the transaction details and marketplace name, formats the relevant fields, and sends an admin email notification through Gmail.\n\n### Setup steps\n\n- Configure the Sharetribe Trigger with the correct Sharetribe credentials and event subscription for transaction transitions.\n- Configure the Sharetribe action nodes to use the same marketplace credentials and ensure they can read transactions, transitions, and marketplace metadata.\n- Set up the Gmail credential for the admin email sender account.\n- Review the IF node conditions so they match the exact Sharetribe transition names used by the marketplace.\n- Update the Gmail node recipient, subject, and message body for the admin notification.\n\n### Customization\n\nYou can adjust the fields collected in the Set node, change the paid-transition conditions, or modify the email template and recipients to match the marketplace’s operational process."
},
"typeVersion": 1
},
{
"id": "f9c778d2-fd99-4ab1-85d0-9dd440092f84",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
2816,
176
],
"parameters": {
"color": 7,
"width": 512,
"height": 320,
"content": "## Trigger initial filter\n\nStarts when Sharetribe emits a transaction event and checks whether the previous transition was the expected pre-payment state before continuing."
},
"typeVersion": 1
},
{
"id": "846b08f8-f709-4a4d-86aa-bcf6116b7916",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
3456,
208
],
"parameters": {
"color": 7,
"width": 832,
"height": 304,
"content": "## Verify paid transaction\n\nRetrieves the latest transition details, confirms that payment has been completed, and then fetches the full transaction record for the paid transaction."
},
"typeVersion": 1
},
{
"id": "cef5d95e-3b6f-4f29-9e4f-49bc44ce5d4c",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
4416,
208
],
"parameters": {
"color": 7,
"width": 832,
"height": 304,
"content": "## Prepare and email admin\n\nGets the marketplace name, organizes the transaction and participant fields needed for the message, and sends the admin notification email through Gmail."
},
"typeVersion": 1
},
{
"id": "375bfdef-ec59-43b1-bf77-30d277f435ff",
"name": "When New Sharetribe Event",
"type": "n8n-nodes-sharetribe.sharetribeTrigger",
"maxTries": 3,
"position": [
2864,
336
],
"parameters": {
"simplify": false,
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"eventTypes": [
"transaction/transitioned"
],
"eventAttributes": [
"resourceId",
"previousValues"
]
},
"credentials": {
"sharetribeOAuth2Api": {
"id": "credential-id",
"name": "Sharetribe Credential"
}
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"id": "b8aeb9e3-f6c5-4b7b-a60a-706da1d63815",
"name": "Check Pre-payment Transition",
"type": "n8n-nodes-base.if",
"position": [
3184,
336
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "006c0a63-71b0-44a6-8868-65ac81f9f2ba",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.attributes.previousValues.attributes.lastTransition }}",
"rightValue": "transition/request-payment"
}
]
}
},
"typeVersion": 2
},
{
"id": "d91cf0d7-ae15-41d0-ba49-c0453758ebfe",
"name": "Fetch Last Transition",
"type": "n8n-nodes-sharetribe.sharetribe",
"maxTries": 3,
"position": [
3504,
336
],
"parameters": {
"resource": "transaction",
"simplify": false,
"transactionId": "={{ $json.attributes.resourceId }}",
"transactionFields": [
"lastTransition"
]
},
"credentials": {
"sharetribeOAuth2Api": {
"id": "credential-id",
"name": "Sharetribe Credential"
}
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"id": "a4ec5f51-e83e-44e1-8b4e-7592a3f15690",
"name": "Check Payment Confirmation",
"type": "n8n-nodes-base.if",
"position": [
3824,
336
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "006c0a63-71b0-44a6-8868-65ac81f9f2ba",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.lastTransition }}",
"rightValue": "transition/confirm-payment"
}
]
}
},
"typeVersion": 2
},
{
"id": "9bb5f1ce-9f74-4730-b24c-894a79112bce",
"name": "Fetch Marketplace Name",
"type": "n8n-nodes-sharetribe.sharetribe",
"maxTries": 3,
"position": [
4464,
336
],
"parameters": {
"resource": "marketplace"
},
"credentials": {
"sharetribeOAuth2Api": {
"id": "credential-id",
"name": "Sharetribe Credential"
}
},
"executeOnce": true,
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"id": "bddc5d5b-27ef-4502-999c-8dea9dd06714",
"name": "Prepare Email Fields",
"type": "n8n-nodes-base.set",
"position": [
4784,
336
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "524fbf5c-9670-408c-a887-cce821ca1f65",
"name": "transaction.id",
"type": "string",
"value": "={{ $('Retrieve Transaction Details').item.json.id }}"
},
{
"id": "f9cc083d-d6d1-494c-96b6-a6747c73f12e",
"name": "customer.id",
"type": "string",
"value": "={{ $('Retrieve Transaction Details').item.json.customer.id }}"
},
{
"id": "9994275b-91b0-42a9-9c02-4c5db3fba497",
"name": "provider.id",
"type": "string",
"value": "={{ $('Retrieve Transaction Details').item.json.provider.id }}"
},
{
"id": "a5af0ae3-ecc3-452d-b1f9-6a50a50a1641",
"name": "provider.profile.firstName",
"type": "string",
"value": "={{ $('Retrieve Transaction Details').item.json.provider.profile.firstName }}"
},
{
"id": "e29e078e-ffbb-4f26-b4cc-075941aefb7a",
"name": "customer.profile.firstName",
"type": "string",
"value": "={{ $('Retrieve Transaction Details').item.json.customer.profile.firstName }}"
},
{
"id": "7290b7b7-1e53-4c5f-88f6-cda0fd02779d",
"name": "listing.title",
"type": "string",
"value": "={{ $('Retrieve Transaction Details').item.json.listing.title }}"
},
{
"id": "1c007860-e852-4e99-a706-d77d5d1675db",
"name": "operatorRevenue",
"type": "object",
"value": "={{ {\"amount\": $('Retrieve Transaction Details').item.json.payinTotal.amount - $('Retrieve Transaction Details').item.json.payoutTotal.amount, \n\"currency\": $('Retrieve Transaction Details').item.json.payoutTotal.currency} }}"
},
{
"id": "287b88f9-5c52-4247-bfec-e34b03ae4715",
"name": "marketplaceName",
"type": "string",
"value": "={{ $json.name }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "7a30bf0d-8b95-4bd9-8939-b250ba6a87af",
"name": "Send Admin Payment Email",
"type": "n8n-nodes-base.gmail",
"position": [
5104,
336
],
"webhookId": "797d9401-ac4d-400e-9bc1-9f351fcd8c46",
"parameters": {
"sendTo": "user@example.com",
"message": "=New Paid Transaction\n\nHey There,\n\nA transaction payment has been confirmed on {{ $json.marketplaceName }} for \"{{ $json.listing.title }}\".\n\nMarketplace revenue: {{ new Intl.NumberFormat('en-US', { style: 'currency', currency: $json.operatorRevenue.currency }).format($json.operatorRevenue.amount / 100) }}\n\nView transaction details: https://console.sharetribe.com/transactions/{{ $json.transaction.id }}",
"options": {},
"subject": "=New paid transaction for {{ $json.marketplaceName }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"id": "credential-id",
"name": "Gmail Credential"
}
},
"typeVersion": 2.1
},
{
"id": "ce83dd17-5e5b-4436-a2af-ba172979a5a3",
"name": "Retrieve Transaction Details",
"type": "n8n-nodes-sharetribe.sharetribe",
"maxTries": 3,
"position": [
4144,
336
],
"parameters": {
"resource": "transaction",
"simplify": false,
"userFields": [
"firstName",
"email",
"lastName"
],
"listingFields": [
"title"
],
"transactionId": "={{ $json.id }}",
"transactionFields": [
"booking",
"createdAt",
"customer",
"lastTransition",
"lastTransitionedAt",
"payinTotal",
"payoutTotal",
"state",
"provider",
"listing"
]
},
"credentials": {
"sharetribeOAuth2Api": {
"id": "credential-id",
"name": "Sharetribe Credential"
}
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 2000
},
{
"parameters": {
"operation": "verify",
"email": "={{ $json.email || $json.Email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
4744,
336
],
"name": "Verify Email (BillionVerify)",
"credentials": {
"billionVerifyApi": {
"id": "",
"name": "BillionVerify account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "is-deliverable",
"leftValue": "={{ $json.is_deliverable }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
]
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
4924,
336
],
"name": "IF deliverable"
}
],
"connections": {
"Prepare Email Fields": {
"main": [
[
{
"node": "Verify Email (BillionVerify)",
"type": "main",
"index": 0
}
]
]
},
"Fetch Last Transition": {
"main": [
[
{
"node": "Check Payment Confirmation",
"type": "main",
"index": 0
}
]
]
},
"Fetch Marketplace Name": {
"main": [
[
{
"node": "Prepare Email Fields",
"type": "main",
"index": 0
}
]
]
},
"When New Sharetribe Event": {
"main": [
[
{
"node": "Check Pre-payment Transition",
"type": "main",
"index": 0
}
]
]
},
"Check Payment Confirmation": {
"main": [
[
{
"node": "Retrieve Transaction Details",
"type": "main",
"index": 0
}
]
]
},
"Check Pre-payment Transition": {
"main": [
[
{
"node": "Fetch Last Transition",
"type": "main",
"index": 0
}
]
]
},
"Retrieve Transaction Details": {
"main": [
[
{
"node": "Fetch Marketplace Name",
"type": "main",
"index": 0
}
]
]
},
"Verify Email (BillionVerify)": {
"main": [
[
{
"node": "IF deliverable",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable": {
"main": [
[
{
"node": "Send Admin Payment Email",
"type": "main",
"index": 0
}
],
[]
]
}
},
"settings": {}
}When to use this
- Cleaning a list before a Sharetribe send or sync.
- Protecting Sharetribe deliverability and sender reputation.
- Keeping bounce rates low so your sending is never throttled.
FAQ
Why verify before sending in Sharetribe?
Verifying first keeps your bounce rate low, which protects your sender reputation and your results.
How do I import this workflow?
Download the JSON, then in n8n go to Workflows → Import from File (or paste it). Install the BillionVerify community node and add your API key credential.
What happens to risky or catch-all addresses?
They are routed to the false branch and excluded from the send. You decide whether to retry, review, or drop them.
Add verification to your workflow
Create a free account, grab your API key, and stop bounces before they happen.
Get started free