{
  "workflow": {
    "id": 9273,
    "name": "Generate & deliver certificates with VerifiEmail & HTMLcsstoImg to Gmail",
    "views": 184,
    "recentViews": 0,
    "totalViews": 184,
    "createdAt": "2025-10-05T07:31:47.632Z",
    "description": "# Automated Certificate Generator with Email Validation & Delivery\n\nAutomatically generate, validate, and deliver professional course completion certificates with zero manual work — from webhook request to PDF delivery in seconds.\n\n---\n\n## Overview\n\nThis workflow transforms certificate generation from a manual design task into a fully automated system. It receives certificate requests via webhook, validates recipient emails using advanced verification, generates beautifully designed HTML certificates, converts them to high-quality PNG images, delivers via professional email templates, and maintains complete audit trails in Google Sheets.\n\nPowered by email validation APIs and HTML-to-image conversion, it ensures every certificate meets professional standards while preventing delivery to invalid or fraudulent email addresses.\n\n---\n\n## What This Workflow Does\n\n- **Receives certificate requests** via webhook from your LMS, CRM, or custom application\n- **Validates recipient emails** using VerifiEmail API with comprehensive checks:\n  - RFC compliance verification\n  - MX record validation\n  - Disposable email detection\n  - Spoof and fraud prevention\n- **Generates professional certificates** with custom HTML/CSS templates featuring:\n  - Purple gradient backgrounds with modern typography\n  - Google Fonts integration (Playfair Display + Montserrat)\n  - Gold achievement badges\n  - Auto-generated unique certificate IDs\n  - Formatted completion dates\n  - Instructor signatures\n- **Converts HTML to PNG** using HTMLcsstoImg API for permanent, shareable images\n- **Delivers via email** with branded HTML templates including download links and LinkedIn sharing CTAs\n- **Logs everything** to Google Sheets for reporting, analytics, and certificate verification\n- **Handles errors** with automatic validation checks and optional Slack notifications\n\n---\n\n## Key Features\n\n- **Zero Manual Work**: Fully automated from request to delivery\n- **Advanced Email Validation**: Blocks invalid, temporary, and fraudulent email addresses\n- **Professional Design**: Print-ready certificates with customizable branding\n- **Unique Certificate IDs**: Auto-generated format: CERT-{timestamp}-{random}\n- **Instant Delivery**: Certificates sent within seconds of completion\n- **Complete Audit Trail**: All certificates logged with 10+ data points\n- **Error Prevention**: Validation stops invalid requests before processing\n- **Highly Customizable**: Easy to modify colors, fonts, layouts, and email templates\n- **Scalable**: Handles hundreds of certificates per day\n- **API-Ready**: RESTful webhook endpoint for easy integration\n\n---\n\n## Use Cases\n\n**Educational Institutions**\n- Automatically issue certificates for online courses and programs\n- Generate graduation certificates for completed degrees\n- Create participation certificates for workshops and seminars\n\n**Corporate Training**\n- Award compliance training certificates to employees\n- Recognize professional development completions\n- Issue skill certification for internal programs\n\n**Online Course Platforms**\n- Integrate with LMS systems (Teachable, Thinkific, Kajabi)\n- Automate certificate delivery upon course completion\n- Build certificate libraries for student portfolios\n\n**Event Management**\n- Issue attendance certificates for conferences and webinars\n- Generate speaker appreciation certificates\n- Create volunteer recognition certificates\n\n**Certification Programs**\n- Award professional certifications and credentials\n- Generate CPE/CE certificates for continuing education\n- Issue examination completion certificates\n\n---\n\n## Prerequisites\n\n### Required Services & Accounts\n\n- **n8n** (self-hosted or cloud) - Workflow automation platform\n- **VerifiEmail Account** - Email validation API \n- **HTMLcsstoImg Account** - HTML to PNG conversion \n- **Gmail Account** - Email delivery via OAuth2 \n- **Google Workspace** - For Sheets logging and tracking\n\n### Required Credentials\n\n1. VerifiEmail API Key\n2. HTMLcsstoImg User ID + API Key\n3. Gmail OAuth2 credentials\n4. Google Sheets OAuth2 credentials\n\n---\n\n## Setup Instructions\n\n### 1. Import the Workflow\n\n1. Download the `certificate-generator.json` file\n2. In n8n, navigate to **Workflows** → **Import from File**\n3. Select the JSON file and click **Import**\n\n### 2. Configure Credentials\n\n#### VerifiEmail API\n\n1. Sign up at https://verifi.email\n2. Navigate to **Dashboard** → **API Keys**\n3. Copy your API key\n4. In n8n: **Settings** → **Credentials** → **Add Credential**\n5. Search for \"VerifiEmail\"\n6. Name: `VerifiEmail API`\n7. Paste API key and save\n8. Assign to \"Verifi Email\" node in workflow\n\n#### HTMLcsstoImg API\n\n1. Sign up at https://htmlcsstoimg.com\n2. Go to **Dashboard** → **API**\n3. Copy User ID and API Key\n4. In n8n: **Credentials** → **Add Credential** → \"HTMLcsstoImg\"\n5. Name: `HTMLcsstoImg API`\n6. Enter User ID and API Key\n7. Assign to \"HTML/CSS to Image\" node\n\n#### Gmail OAuth2\n\n1. In n8n: **Credentials** → **Add Credential** → \"Gmail OAuth2\"\n2. Click **Connect my account**\n3. Follow Google OAuth flow\n4. Grant permissions: Send email\n5. Name: `Gmail OAuth2`\n6. Assign to \"Send Certificate Email\" node\n\n#### Google Sheets OAuth2\n\n1. Create new Google Sheet: **\"Certificates Log\"**\n2. Add column headers in Row 1:\n   - Certificate ID\n   - Recipient Name\n   - Course\n   - Email\n   - Completion Date\n   - Generated At\n   - Certificate URL\n   - Status\n   - Instructor\n   - Duration\n3. In n8n: **Credentials** → **Gmail OAuth2** (same as above works for Sheets)\n4. Assign to \"Log to Google Sheets\" node\n5. Select your \"Certificates Log\" spreadsheet\n6. Select \"Sheet1\"\n\n### 3. Activate Workflow\n\n1. Click the **toggle switch** in top-right to activate\n2. Copy the **Webhook URL** from \"Certificate Request Webhook\" node\n3. Format: `https://your-n8n-instance.com/webhook/certificate-generator`\n\n### 4. Configure Your Application\n\n**For LMS Integration:**\n```javascript\n// When course is completed\nfetch('https://your-n8n-instance.com/webhook/certificate-generator', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    name: student.fullName,\n    course: course.title,\n    date: new Date().toISOString().split('T')[0],\n    email: student.email,\n    instructor: course.instructor,\n    duration: course.duration\n  })\n});\n```\n\n**For Zapier/Make.com:**\n1. Trigger: Course completed\n2. Action: Webhooks → POST\n3. URL: Your webhook URL\n4. Body: Map fields to JSON format\n\n### 5. Test the Workflow\n\nSend test request:\n```bash\ncurl -X POST https://your-n8n-instance.com/webhook/certificate-generator \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Test User\",\n    \"course\": \"Test Course\",\n    \"date\": \"2025-10-04\",\n    \"email\": \"test@gmail.com\"\n  }'\n```\n\n**Verify:**\n- Email validation passes\n- Certificate generated successfully\n- Image created at HTMLcsstoImage\n- Email delivered to inbox\n- Entry logged in Google Sheets\n\n---\n\n## How It Works\n\n1. **Webhook Trigger** → Receives POST request with certificate data\n2. **Email Validation** → VerifiEmail checks RFC, MX records, disposable status\n3. **Field Validation** → Ensures name, course, date present and email valid\n4. **Data Combination** → Merges webhook data with validation results\n5. **HTML Generation** → Creates styled certificate with dynamic content\n6. **Image Conversion** → HTMLcsstoImg renders 1200x850px PNG\n7. **Email Delivery** → Gmail sends professional template with download link\n8. **Database Logging** → Google Sheets records all certificate details\n9. **Error Handling** → Catches failures and stops invalid requests\n\n**Processing Time:** 5-10 seconds per certificate\n\n---\n\n## API Reference\n\n### Endpoint\n```\nPOST /webhook/certificate-generator\nContent-Type: application/json\n```\n\n### Required Fields\n```json\n{\n  \"name\": \"string\",      // Full name of recipient\n  \"course\": \"string\",    // Course or program name\n  \"date\": \"YYYY-MM-DD\",  // Completion date\n  \"email\": \"string\"      // Recipient email address\n}\n```\n\n### Optional Fields\n```json\n{\n  \"instructor\": \"string\",     // Instructor name (default: \"Program Director\")\n  \"duration\": \"string\",       // Course duration (e.g., \"40 hours\")\n  \"certificateId\": \"string\"   // Custom ID (auto-generated if not provided)\n}\n```\n\n### Success Response\n```json\n{\n  \"success\": true,\n  \"message\": \"Certificate generated and sent successfully\",\n  \"certificateId\": \"CERT-1728000000-ABC123\",\n  \"certificateUrl\": \"https://hcti.io/v1/image/xyz123\"\n}\n```\n\n### Error Response\n```json\n{\n  \"success\": false,\n  \"error\": \"Missing required fields: name, course, date, or valid email\"\n}\n```\n\n---\n\n## Customization\n\n### Certificate Design\n\nEdit the \"Generate HTML Certificate\" Code node:\n\n**Change Brand Colors:**\n```javascript\n// Background gradient\nbackground: linear-gradient(135deg, #YOUR_COLOR_1 0%, #YOUR_COLOR_2 100%);\n\n// Border color\nborder: 3px solid #YOUR_BRAND_COLOR;\n```\n\n**Add Company Logo:**\n```html\n<div>\n    <img src=\"https://your-domain.com/logo.png\">\n</div>\n```\n\n**Modify Fonts:**\n```javascript\n@import url('https://fonts.googleapis.com/css2?family=Your+Font&display=swap');\nfont-family: 'Your Font', sans-serif;\n```\n\n### Email Template\n\nEdit the \"Send Certificate Email\" node message:\n\n**Update Company Info:**\n```html\n<p>© 2025 Your Company Name</p>\n<p>Contact: support@yourcompany.com</p>\n```\n\n**Change Header Color:**\n```css\n.header { \n    background: linear-gradient(135deg, #YOUR_COLOR_1, #YOUR_COLOR_2);\n}\n```\n\n### Certificate ID Format\n\nIn \"Generate HTML Certificate\" node:\n```javascript\n// Custom format: COURSE-YEAR-NUMBER\nconst certId = `${data.course.substring(0,3).toUpperCase()}-${new Date().getFullYear()}-${Math.floor(Math.random() * 10000)}`;\n```\n\n---\n\n## Data Flow\n\n```\nWebhook → Email Validation → Field Validation → Combine Data\n    ↓\nGenerate HTML → Convert to PNG → Send Email\n    ↓\nLog to Sheets → Success Response\n    ↓\nError Handling (if failed)\n```\n\n---\n\n## Expected Output\n\n**PNG Certificate Includes:**\n- Branded header with logo/company name\n- Recipient name in large display font\n- Course name and duration\n- Formatted completion date\n- Instructor signature section\n- Unique certificate ID\n- Gold achievement badge\n- Professional borders and styling\n\n**Google Sheets Entry:**\n- Certificate ID\n- Recipient details\n- Course information\n- Completion date and time\n- Direct link to certificate image\n- Status: \"Sent\"\n\n**Email Notification:**\n- Professional HTML template\n- Personalized congratulations message\n- Direct download button\n- Certificate details table\n- LinkedIn sharing encouragement\n\n---\n\n## Performance\n\n- **Processing Time:** 5-10 seconds per certificate\n- **Daily Capacity:** 250+ certificates (limited by free tier quotas)\n- **Image Resolution:** 1200x850px (print-ready)\n- **File Size:** ~200-400 KB per PNG\n- **Email Delivery:** ~98% success rate\n\n---\n\n## Troubleshooting\n\n**Webhook not receiving data**\n- Verify webhook URL is correct\n- Check n8n workflow is activated\n- Ensure POST method is used\n- Validate JSON format\n\n**Email validation fails**\n- Use real email domains (not example.com)\n- Check VerifiEmail API quota\n- Verify API credentials are correct\n- Test with gmail.com addresses first\n\n**Certificate not generating**\n- Check required fields are present\n- Verify date format is YYYY-MM-DD\n- Review \"Generate HTML Certificate\" node logs\n- Ensure HTMLcsstoImg API key valid\n\n**Image conversion fails**\n- Verify HTMLcsstoImg credits available\n- Check HTML syntax is valid\n- Review API response in execution logs\n- Test HTML locally first\n\n**Email not delivered**\n- Confirm Gmail OAuth2 connected\n- Check recipient email is valid\n- Review spam/junk folders\n- Verify Gmail daily limit not exceeded\n\n**Google Sheets not updating**\n- Re-authenticate Google Sheets OAuth2\n- Verify spreadsheet permissions\n- Check column names match exactly\n- Ensure sheet exists and is accessible\n\n---\n\n## Best Practices\n\n1. **Test with small batches** before production rollout\n2. **Monitor API quotas** to avoid unexpected failures\n3. **Use real email addresses** during testing (avoid disposable)\n4. **Archive old certificates** periodically from Google Sheets\n5. **Set up Slack notifications** for error monitoring\n6. **Validate webhook payload** before sending\n7. **Document customizations** for team reference\n8. **Back up Google Sheets** regularly\n9. **Review email deliverability** weekly\n10. **Keep credentials secure** and rotate periodically\n\n---\n\n## Security Notes\n\n- All API credentials encrypted in n8n\n- Certificate URLs are publicly accessible via direct link\n- Email validation prevents delivery to fraudulent addresses\n- Webhook uses HTTPS for secure data transmission\n- Google Sheets access controlled via OAuth2 permissions\n- No sensitive data stored in workflow logs\n\n---\n\n## Future Enhancements\n\n- PDF output option for formal certifications\n- Multiple certificate templates (modern, classic, minimalist)\n- QR code verification system\n- Batch certificate generation\n- Multi-language support\n- Certificate revocation capability\n- Analytics dashboard\n- WhatsApp/SMS delivery option\n- Integration with Notion/Confluence knowledge bases\n\n---\n\n## Support Resources\n\n- [n8n Documentation](https://docs.n8n.io)\n- [n8n Community Forum](https://community.n8n.io)\n- [VerifiEmail Docs](https://verifi.email/docs)\n- [HTMLcsstoImage API](https://htmlcsstoimage.com/docs)\n- [Gmail API Reference](https://developers.google.com/gmail/api)\n- [Google Sheets API](https://developers.google.com/sheets/api)\n\n---\n\n## License\n\nThis workflow template is provided as-is for free use and modification under the MIT License. Attribution appreciated but not required.\n\n**Version:** 1.0.0  \n**Last Updated:** October 2025  \n**Compatibility:** n8n v1.0.0+",
    "workflow": {
      "id": "",
      "meta": {
        "instanceId": ""
      },
      "name": "certificate generator",
      "tags": [
        {
          "id": "CWzMtsCN0QfPR9PC",
          "name": "certificates",
          "createdAt": "2025-10-04T15:28:20.021Z",
          "updatedAt": "2025-10-04T15:28:20.021Z"
        },
        {
          "id": "qFR253LK8bI8GX4z",
          "name": "automation",
          "createdAt": "2025-10-04T15:28:20.027Z",
          "updatedAt": "2025-10-04T15:28:20.027Z"
        }
      ],
      "nodes": [
        {
          "id": "8aef6c7c-9dfd-483b-9b66-ee9a21ad0e3b",
          "name": "Credentials Setup Guide",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -3024,
            -96
          ],
          "parameters": {
            "color": 7,
            "width": 452,
            "height": 856,
            "content": "## 🔧 CREDENTIALS SETUP REQUIRED\n\nBefore activating this workflow, configure these credentials:\n\n1. VerifiEmail API\n   - Sign up at https://verifi.email\n   - Get your API key from dashboard\n   - In n8n: Add VerifiEmail credential\n   - Paste API key\n\n2. HTMLcsstoImage API\n   - Sign up at https://htmlcsstoimg.com\n   - Get User ID and API Key\n   - In n8n: Add HTMLcsstoImg credential\n   - Enter User ID and API Key\n\n3. Gmail OAuth2 (for sending emails)\n   - Go to Settings > Credentials\n   - Add Gmail OAuth2\n   - Follow Google OAuth setup\n   - Grant necessary permissions\n   - Test connection\n\n4. Google Sheets OAuth2 (for logging)\n   - Add Google Sheets OAuth2 credential\n   - Create spreadsheet: \"Certificates Log\"\n   - Add these column headers:\n     • Certificate ID\n     • Recipient Name\n     • Course\n     • Email\n     • Completion Date\n     • Generated At\n     • Certificate URL\n     • Status\n     • Instructor\n     • Duration\n\n✅ All credentials configured in this workflow"
          },
          "typeVersion": 1
        },
        {
          "id": "713712a6-27e5-482b-8994-eae001ab2785",
          "name": "Webhook Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2512,
            64
          ],
          "parameters": {
            "color": 7,
            "width": 444,
            "height": 628,
            "content": "## 📥 WEBHOOK TRIGGER\n\nAccepts POST requests with certificate data\n\nRequired JSON format:\n```\n{\n  \"name\": \"John Doe\",\n  \"course\": \"Course Name\",\n  \"date\": \"2025-10-04\",\n  \"email\": \"user@example.com\"\n}\n```\nOptional fields:\n```\n{\n  \"instructor\": \"Jane Smith\",\n  \"duration\": \"40 hours\",\n  \"certificateId\": \"CERT-2025-001\"\n}\n```\n🔗 Your Webhook URL:\n```https://n8n.exildraw.com/webhook-test/certificate-generator```\n\n📝 All data is accessed via:\n{{ $json.body.fieldName }}"
          },
          "typeVersion": 1
        },
        {
          "id": "a8b8e036-c01d-4091-b817-43611a1e2643",
          "name": "Certificate Request Webhook",
          "type": "n8n-nodes-base.webhook",
          "position": [
            -2192,
            544
          ],
          "webhookId": "certificate-generator",
          "parameters": {
            "path": "certificate-generator",
            "options": {},
            "httpMethod": "POST",
            "responseMode": "lastNode"
          },
          "typeVersion": 2
        },
        {
          "id": "3129040e-f390-4661-b17a-32b5c029cd8b",
          "name": "Email Validation Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2016,
            144
          ],
          "parameters": {
            "color": 7,
            "width": 380,
            "height": 548,
            "content": "## 📧 EMAIL VALIDATION STEP\n\nUses VerifiEmail API to validate recipient email\n\nChecks performed:\n✓ RFC Compliance (proper email format)\n✓ Valid MX Records (domain accepts email)\n✓ Spoof Detection (checks for fake domains)\n✓ Disposable Email Detection (blocks temp emails)\n\nOutput includes:\n• valid: true/false\n• provider: email service provider\n• MX records: mail server details\n\n⚠️ Credential Required: VerifiEmail API key\n\nNext Step: IF node validates this + other fields"
          },
          "typeVersion": 1
        },
        {
          "id": "5c1071ea-cc45-49b2-9498-083d3a09508b",
          "name": "Validation Logic",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1584,
            80
          ],
          "parameters": {
            "color": 7,
            "width": 360,
            "height": 596,
            "content": "## ✅ VALIDATION CHECKPOINT\n\nChecks ALL required conditions:\n\nFrom Webhook:\n1. Name is not empty\n2. Course is not empty\n3. Date is not empty\n\nFrom VerifiEmail:\n4. Email validation = true\n\nAll conditions must pass (AND logic)\n\n✓ TRUE → Continue to Combine Data\n✗ FALSE → Stop workflow with error\n\nAccessing data:\n• Webhook: $('Certificate Request Webhook').item.json.body.field\n• Email: $json.valid"
          },
          "typeVersion": 1
        },
        {
          "id": "745c8af8-c38e-4257-968d-c8abeb30e5d3",
          "name": "Data Combination Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1184,
            -32
          ],
          "parameters": {
            "color": 7,
            "width": 380,
            "height": 716,
            "content": "## 🔄 COMBINE WEBHOOK + EMAIL DATA\n\nMerges certificate data with email validation results\n\nInput sources:\n• Webhook data: name, course, date, email, instructor, duration\n• Email validation: valid, provider, MX records\n\nOutput structure:\n```\n{\n  name, course, date, email,\n  instructor, duration, certificateId,\n  emailValidation: {\n    valid, provider, rfcCompliant,\n    validMxRecord, disposable\n  }\n}\n```\nPurpose: Creates clean data structure for HTML generation\n\n⚡ Auto-generates certificateId if not provided\n📅 Keeps original date format for later formatting"
          },
          "typeVersion": 1
        },
        {
          "id": "99566da7-4b33-4df0-a280-5a5db861bf13",
          "name": "HTML Generation Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -768,
            -48
          ],
          "parameters": {
            "color": 7,
            "width": 380,
            "height": 724,
            "content": "## 🎨 HTML CERTIFICATE GENERATOR\n\nCreates beautiful HTML certificate with:\n\nDesign Features:\n• Purple gradient background (#667eea → #764ba2)\n• Professional typography (Playfair Display + Montserrat)\n• Gold achievement badge with star\n• Clean white certificate with borders\n• Signature section with instructor name\n• Formatted completion date\n\nDynamic Content:\n• Recipient name (large, centered)\n• Course name\n• Completion date (formatted as \"Month Day, Year\")\n• Certificate ID (bottom right)\n• Instructor name (or \"Program Director\" if not provided)\n• Duration (optional, shown if provided)\n\nAuto-generates:\n• Unique Certificate ID if not provided\n• Format: CERT-{timestamp}-{random}\n\nOutput: Complete HTML ready for image conversion"
          },
          "typeVersion": 1
        },
        {
          "id": "d2f582b7-9d23-43b9-bc05-e50f96ad122f",
          "name": "Generate HTML Certificate",
          "type": "n8n-nodes-base.code",
          "position": [
            -640,
            528
          ],
          "parameters": {
            "jsCode": "// Certificate HTML Generator\nconst items = $input.all();\n\nreturn items.map(item => {\n  const data = item.json;\n  \n  // Generate unique certificate ID if not provided\n  const certId = data.certificateId || `CERT-${Date.now()}-${Math.random().toString(36).substr(2, 9).toUpperCase()}`;\n  \n  // Format date nicely\n  const certDate = new Date(data.date).toLocaleDateString('en-US', {\n    year: 'numeric',\n    month: 'long',\n    day: 'numeric'\n  });\n  \n  // HTML Template with inline CSS\n  const htmlContent = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Certificate of Completion</title>\n    <style>\n        @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700&family=Montserrat:wght@300;400;600&display=swap');\n        \n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n        \n        body {\n            width: 1200px;\n            height: 850px;\n            font-family: 'Montserrat', sans-serif;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            padding: 40px;\n        }\n        \n        .certificate {\n            background: white;\n            width: 100%;\n            height: 100%;\n            border: 20px solid #f8f9fa;\n            box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n            position: relative;\n            padding: 60px 80px;\n            display: flex;\n            flex-direction: column;\n            justify-content: space-between;\n        }\n        \n        .certificate::before {\n            content: '';\n            position: absolute;\n            top: 35px;\n            left: 35px;\n            right: 35px;\n            bottom: 35px;\n            border: 3px solid #667eea;\n            pointer-events: none;\n        }\n        \n        .header {\n            text-align: center;\n            margin-bottom: 20px;\n        }\n        \n        .logo {\n            width: 80px;\n            height: 80px;\n            margin: 0 auto 15px;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            border-radius: 50%;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            color: white;\n            font-size: 36px;\n            font-weight: bold;\n        }\n        \n        .title {\n            font-family: 'Playfair Display', serif;\n            font-size: 48px;\n            font-weight: 700;\n            color: #2d3748;\n            letter-spacing: 2px;\n            margin-bottom: 10px;\n        }\n        \n        .subtitle {\n            font-size: 18px;\n            color: #718096;\n            text-transform: uppercase;\n            letter-spacing: 3px;\n            font-weight: 300;\n        }\n        \n        .content {\n            text-align: center;\n            flex-grow: 1;\n            display: flex;\n            flex-direction: column;\n            justify-content: center;\n        }\n        \n        .presented-to {\n            font-size: 16px;\n            color: #718096;\n            text-transform: uppercase;\n            letter-spacing: 2px;\n            margin-bottom: 20px;\n        }\n        \n        .recipient-name {\n            font-family: 'Playfair Display', serif;\n            font-size: 56px;\n            font-weight: 700;\n            color: #667eea;\n            margin-bottom: 30px;\n            padding-bottom: 15px;\n            border-bottom: 3px solid #e2e8f0;\n            display: inline-block;\n            min-width: 500px;\n        }\n        \n        .description {\n            font-size: 18px;\n            color: #4a5568;\n            line-height: 1.8;\n            margin-bottom: 25px;\n            max-width: 700px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n        \n        .course-name {\n            font-weight: 600;\n            color: #2d3748;\n            font-size: 24px;\n            margin: 20px 0;\n        }\n        \n        .footer {\n            display: flex;\n            justify-content: space-between;\n            align-items: flex-end;\n            margin-top: 40px;\n        }\n        \n        .signature-block {\n            text-align: center;\n            flex: 1;\n        }\n        \n        .signature-line {\n            border-top: 2px solid #2d3748;\n            width: 250px;\n            margin: 0 auto 10px;\n            padding-top: 5px;\n        }\n        \n        .signature-name {\n            font-weight: 600;\n            color: #2d3748;\n            font-size: 16px;\n            margin-bottom: 5px;\n        }\n        \n        .signature-title {\n            font-size: 14px;\n            color: #718096;\n        }\n        \n        .date-block {\n            text-align: center;\n        }\n        \n        .date-label {\n            font-size: 12px;\n            color: #718096;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n            margin-bottom: 5px;\n        }\n        \n        .date-value {\n            font-weight: 600;\n            color: #2d3748;\n            font-size: 16px;\n        }\n        \n        .cert-id {\n            position: absolute;\n            bottom: 15px;\n            right: 25px;\n            font-size: 10px;\n            color: #a0aec0;\n            letter-spacing: 1px;\n        }\n        \n        .badge {\n            position: absolute;\n            top: 50px;\n            right: 60px;\n            width: 100px;\n            height: 100px;\n            background: linear-gradient(135deg, #ffd700 0%, #ffed4e 100%);\n            border-radius: 50%;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            box-shadow: 0 4px 15px rgba(255, 215, 0, 0.4);\n        }\n        \n        .badge::before {\n            content: '★';\n            font-size: 50px;\n            color: white;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"certificate\">\n        <div class=\"badge\"></div>\n        \n        <div class=\"header\">\n            <div class=\"logo\">C</div>\n            <h1 class=\"title\">Certificate of Completion</h1>\n            <p class=\"subtitle\">This certifies that</p>\n        </div>\n        \n        <div class=\"content\">\n            <div class=\"recipient-name\">${data.name}</div>\n            \n            <p class=\"description\">\n                has successfully completed the course\n            </p>\n            \n            <div class=\"course-name\">${data.course}</div>\n            \n            ${data.duration ? `<p class=\"description\" style=\"margin-top: 10px; font-size: 16px;\">Duration: ${data.duration}</p>` : ''}\n        </div>\n        \n        <div class=\"footer\">\n            <div class=\"signature-block\">\n                <div class=\"signature-line\"></div>\n                <div class=\"signature-name\">${data.instructor || 'Program Director'}</div>\n                <div class=\"signature-title\">Instructor</div>\n            </div>\n            \n            <div class=\"date-block\">\n                <div class=\"date-label\">Date of Completion</div>\n                <div class=\"date-value\">${certDate}</div>\n            </div>\n        </div>\n        \n        <div class=\"cert-id\">Certificate ID: ${certId}</div>\n    </div>\n</body>\n</html>\n  `;\n  \n  return {\n    json: {\n      ...data,\n      certificateId: certId,\n      html: htmlContent,\n      formattedDate: certDate\n    }\n  };\n});"
          },
          "typeVersion": 2
        },
        {
          "id": "9e764afe-be0f-4a6a-b5fc-4e2213353ae4",
          "name": "Image Conversion Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -320,
            -16
          ],
          "parameters": {
            "color": 7,
            "width": 380,
            "height": 704,
            "content": "## IMAGE CONVERSION\n\nConverts HTML certificate to high-quality PNG image\n\nService: HTMLcsstoImg API\nAPI Endpoint: hcti.io\n\nConfiguration:\n• Input: {{ $json.html }}\n• Google Fonts: Playfair Display|Montserrat\n• Output: PNG image\n• Resolution: 1200x850px\n\nAPI Response:\n```\n{\n  \"image_url\": \"https://hcti.io/v1/image/[id]\",\n  \"image_id\": \"[unique-id]\"\n}\n```\n⚠️ Credential Required: HTMLcsstoImg API\n   User ID + API Key configured\n\n✅ Direct shareable URL returned\n📥 Image hosted on HTMLcsstoImg servers\n🔗 Permanent URL (doesn't expire)"
          },
          "typeVersion": 1
        },
        {
          "id": "edac6e11-432b-42f2-9128-b39d4585bd5b",
          "name": "Email Delivery Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            128,
            -128
          ],
          "parameters": {
            "color": 7,
            "width": 380,
            "height": 808,
            "content": "## CERTIFICATE EMAIL DELIVERY\n\nSends professional congratulatory email via Gmail\n\nEmail Contents:\n• Subject: \"🎓 Congratulations! Your Certificate of Completion\"\n• HTML-formatted message with:\n  - Gradient header with recipient name\n  - Course details in styled box\n  - Download button with certificate URL\n  - Certificate details table\n  - Call-to-action to share on LinkedIn\n  - Professional footer\n\nData Sources:\n• Recipient: From \"Code in JavaScript\" node\n• Certificate details: From \"Generate HTML Certificate\" node\n• Certificate URL: From \"HTML/CSS to Image\" node\n\nVariables used:\n• {{ $('Generate HTML Certificate').item.json.name }}\n• {{ $('Generate HTML Certificate').item.json.course }}\n• {{ $('Generate HTML Certificate').item.json.certificateId }}\n• {{ $json.image_url }}\n\n⚠️ Credential: Gmail OAuth2"
          },
          "typeVersion": 1
        },
        {
          "id": "7acdd47b-7014-4e0f-8b44-5acf326412be",
          "name": "Send Certificate Email",
          "type": "n8n-nodes-base.gmail",
          "position": [
            288,
            528
          ],
          "webhookId": "",
          "parameters": {
            "sendTo": "={{ $('Code in JavaScript').item.json.email }}",
            "message": "=<!DOCTYPE html>\n<html>\n<head>\n    <style>\n        body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 0; }\n        .container { max-width: 600px; margin: 0 auto; }\n        .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); \n                  color: white; padding: 40px 20px; text-align: center; }\n        .header h1 { margin: 0; font-size: 28px; }\n        .content { background: #f8f9fa; padding: 40px 30px; }\n        .content p { margin: 15px 0; }\n        .course-box { background: white; border-left: 4px solid #667eea; \n                      padding: 20px; margin: 25px 0; border-radius: 5px; }\n        .course-box h2 { color: #667eea; margin: 0 0 10px 0; font-size: 22px; }\n        .button { background: #667eea; color: white; padding: 15px 30px; \n                  text-decoration: none; border-radius: 5px; display: inline-block; \n                  margin: 20px 0; font-weight: bold; }\n        .button:hover { background: #5568d3; }\n        .details { background: white; padding: 20px; border-radius: 5px; margin: 20px 0; }\n        .details ul { list-style: none; padding: 0; }\n        .details li { padding: 8px 0; border-bottom: 1px solid #e2e8f0; }\n        .details li:last-child { border-bottom: none; }\n        .details strong { color: #667eea; }\n        .footer { text-align: center; padding: 30px 20px; color: #718096; font-size: 14px; }\n        .footer p { margin: 5px 0; }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"header\">\n            <h1>🎉 Congratulations, {{ $('Generate HTML Certificate').item.json.name }} !</h1>\n            <p style=\"margin: 10px 0 0 0; font-size: 16px;\">You've successfully completed your course</p>\n        </div>\n        \n        <div class=\"content\">\n            <p>We're thrilled to celebrate your achievement! You have successfully completed:</p>\n            \n            <div class=\"course-box\">\n                <h2>{{ $('Generate HTML Certificate').item.json.course }}</h2>\n                <p style=\"margin: 0; color: #718096;\">Completion Date: {{ $('Generate HTML Certificate').item.json.formattedDate }}</p>\n            </div>\n            \n            <p>Your certificate is ready and available for download. Share your accomplishment with your professional network!</p>\n            \n            <div style=\"text-align: center;\">\n                <a href=\"{{ $json.image_url }}\" class=\"button\">📥 Download Certificate</a>\n            </div>\n            \n            <div class=\"details\">\n                <p><strong>📋 Certificate Details:</strong></p>\n                <ul>\n                    <li><strong>Certificate ID:</strong>{{ $('Generate HTML Certificate').item.json.certificateId }} </li>\n                    <li><strong>Recipient:</strong>{{ $('Generate HTML Certificate').item.json.name }} </li>\n                    <li><strong>Course:</strong> {{ $('Generate HTML Certificate').item.json.course }}</li>\n                    <li><strong>Completion Date:</strong> {{ $('Generate HTML Certificate').item.json.formattedDate }}</li>\n                    {{ $json.duration ? '<li><strong>Duration:</strong> ' + $json.duration + '</li>' : '' }}\n                    {{ $json.instructor ? '<li><strong>Instructor:</strong> ' + $json.instructor + '</li>' : '' }}\n                </ul>\n            </div>\n            \n            <p><strong>💼 Share Your Success:</strong></p>\n            <p>Don't forget to add this certificate to your LinkedIn profile and share it with your network to showcase your new skills!</p>\n            \n            <p style=\"margin-top: 30px; color: #718096; font-size: 14px;\">If you have any questions about your certificate, please don't hesitate to reach out to our support team.</p>\n        </div>\n        \n        <div class=\"footer\">\n            <p><strong>Thank you for learning with us!</strong></p>\n            <p>© 2025 Your Organization. All rights reserved.</p>\n            <p style=\"font-size: 12px; margin-top: 15px;\">Certificate verification available at: yoursite.com/verify</p>\n        </div>\n    </div>\n</body>\n</html>",
            "options": {},
            "subject": "🎓 Congratulations! Your Certificate of Completion"
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 2.1
        },
        {
          "id": "5820e8bb-2f26-4d04-8445-61ea99902d35",
          "name": "Database Logging Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            592,
            -176
          ],
          "parameters": {
            "color": 7,
            "width": 380,
            "height": 864,
            "content": "## GOOGLE SHEETS LOGGING\n\nRecords every certificate to spreadsheet for tracking\n\nSpreadsheet: \"Certificates Log\"\nSheet: Sheet1\n\nLogged Data (10 columns):\n1. Certificate ID - Unique identifier\n2. Recipient Name - Full name\n3. Course - Course/program name\n4. Email - Recipient email\n5. Completion Date - Original date from webhook\n6. Generated At - Current timestamp (ISO format)\n7. Certificate URL - Direct image link\n8. Status - Always \"Sent\"\n9. Instructor - Instructor name\n10. Duration - Course duration\n\nData Sources:\n• Most fields: From \"Generate HTML Certificate\" node\n• Certificate URL: From \"HTML/CSS to Image\" node\n• Generated At: {{ $now.toISO() }}\n\nOperation: Append or Update Row\nMatch Column: Certificate ID (prevents duplicates)\n\n⚠️ Credential: Google Sheets OAuth2 \n\nPurpose: Audit trail, analytics, certificate verification"
          },
          "typeVersion": 1
        },
        {
          "id": "37b407ee-9362-402a-b708-5c821e1e1116",
          "name": "Log to Google Sheets",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            752,
            528
          ],
          "parameters": {
            "columns": {
              "value": {
                "Email": "={{ $('Generate HTML Certificate').item.json.email }}",
                "Course": "={{ $('Generate HTML Certificate').item.json.course }}",
                "Status": "Sent",
                "Duration": "={{ $('Generate HTML Certificate').item.json.duration }}",
                "Instructor": "={{ $('Generate HTML Certificate').item.json.instructor }}",
                "Generated At": "={{ $now.toISO() }}",
                "Certificate ID": "={{ $('Generate HTML Certificate').item.json.certificateId }}",
                "Recipient Name": "={{ $('Generate HTML Certificate').item.json.name }}",
                "Certificate URL": "={{ $('HTML/CSS to Image').item.json.image_url }}",
                "Completion Date ": "={{ $('Generate HTML Certificate').item.json.date }}"
              },
              "schema": [
                {
                  "id": "Certificate ID",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Certificate ID",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Recipient Name",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Recipient Name",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Course",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Course",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Email",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Email",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Completion Date ",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Completion Date ",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Generated At",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Generated At",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Certificate URL",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Certificate URL",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Status",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Status",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Instructor",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Instructor",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Duration",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Duration",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                }
              ],
              "mappingMode": "defineBelow",
              "matchingColumns": [
                "Certificate ID"
              ],
              "attemptToConvertTypes": false,
              "convertFieldsToString": false
            },
            "options": {},
            "operation": "appendOrUpdate",
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": "",
              "cachedResultUrl": "",
              "cachedResultName": "Sheet1"
            },
            "documentId": {
              "__rl": true,
              "mode": "list",
              "value": "",
              "cachedResultUrl": "",
              "cachedResultName": "Certificates Log"
            }
          },
          "credentials": {
            "googleSheetsOAuth2Api": {
              "id": "credential-id",
              "name": "googleSheetsOAuth2Api Credential"
            }
          },
          "typeVersion": 4.4
        },
        {
          "id": "559bc397-1e64-4f9e-91e0-69f01a2de564",
          "name": "Success Response Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1024,
            352
          ],
          "parameters": {
            "color": 7,
            "width": 716,
            "height": 624,
            "content": "## ⚠️ RECOMMENDED ADDITION\n\nMISSING: Success Response to Webhook\n\nCurrently, workflow completes but doesn't send response back to webhook caller.\n\nTo add:\n1. Add \"Respond to Webhook\" node\n   After \"Log to Google Sheets\"\n\n2. Configure response:\n   Response Code: 200\n   Response Body:\n   ```\n    {\n     \"success\": true,\n     \"message\": \"Certificate generated successfully!\",\n     \"certificateId\": \"{{ $('Generate HTML Certificate').item.json.certificateId }}\",\n     \"recipientEmail\": \"{{ $('Generate HTML Certificate').item.json.email }}\",\n     \"certificateUrl\": \"{{ $('HTML/CSS to Image').item.json.image_url }}\",\n     \"generatedAt\": \"{{ $now.toISO() }}\"\n   }\n    ```\nWhy it's important:\n• API integrations need confirmation\n• Useful for tracking in external systems\n• Provides certificate URL to caller\n• Better for automation workflows\n\nWithout it: Workflow succeeds but caller gets no response"
          },
          "typeVersion": 1
        },
        {
          "id": "bd541a23-e982-4b64-82e2-30aea3e7601d",
          "name": "Error Handling Info",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2032,
            1088
          ],
          "parameters": {
            "color": 7,
            "width": 472,
            "height": 564,
            "content": "## ⚠️ ERROR HANDLING\n\nWorkflow includes error catching and notification\n\nError Trigger:\n• Catches any workflow errors\n• Activates separate error flow\n\nError Processing:\n1. Format Error Details (Code node)\n   - Extracts error message\n   - Identifies failed node\n   - Captures user data (name, email, course)\n   - Logs execution ID and timestamp\n\n2. Send Slack Alert (DISABLED)\n   - Would notify admin team\n   - Enable if you have Slack integration\n   - Shows error details and user info\n\nNote: Slack alert currently disabled\nTo enable: Configure Slack credential and enable node\n\nMissing: Error response to webhook caller\nRecommendation: Add \"Respond to Webhook\" node after error trigger to return 500 status code"
          },
          "typeVersion": 1
        },
        {
          "id": "429a6ac5-d269-4176-ac81-d65117df54dd",
          "name": "On Workflow Error",
          "type": "n8n-nodes-base.errorTrigger",
          "position": [
            -1680,
            1216
          ],
          "parameters": {},
          "typeVersion": 1
        },
        {
          "id": "e3cc736c-3a91-42d5-9037-5ffcad3e8cab",
          "name": "Format Error Details",
          "type": "n8n-nodes-base.code",
          "position": [
            -1472,
            1216
          ],
          "parameters": {
            "jsCode": "// Extract error information\nconst errorData = $input.first().json;\n\nreturn [{\n  json: {\n    errorMessage: errorData.error?.message || 'Unknown error occurred',\n    errorNode: errorData.node?.name || 'Unknown node',\n    timestamp: new Date().toISOString(),\n    workflowId: $workflow.id,\n    workflowName: $workflow.name,\n    executionId: $execution.id,\n    userData: {\n      name: errorData.json?.name || 'N/A',\n      email: errorData.json?.email || 'N/A',\n      course: errorData.json?.course || 'N/A'\n    },\n    fullError: JSON.stringify(errorData, null, 2)\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "c1ec5078-2bc7-4f7d-b413-fa0ca7691a15",
          "name": "Send Slack Alert",
          "type": "n8n-nodes-base.slack",
          "notes": "Optional: Enable if you want Slack notifications",
          "disabled": true,
          "position": [
            -1280,
            1216
          ],
          "webhookId": "",
          "parameters": {
            "text": "=🚨 **Certificate Generation Failed**\n\n**Error:** {{ $json.errorMessage }}\n**Node:** {{ $json.errorNode }}\n**Time:** {{ $json.timestamp }}\n\n**User Details:**\n• Name: {{ $json.userData.name }}\n• Email: {{ $json.userData.email }}\n• Course: {{ $json.userData.course }}\n\n**Execution ID:** {{ $json.executionId }}\n**Workflow:** {{ $json.workflowName }}",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "C12345",
              "cachedResultName": "alerts"
            },
            "otherOptions": {}
          },
          "typeVersion": 2.2
        },
        {
          "id": "7d756f81-a0ac-4b11-bf07-dded65a5070d",
          "name": "Workflow Overview",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -3376,
            800
          ],
          "parameters": {
            "color": 7,
            "width": 444,
            "height": 760,
            "content": "## COMPLETE WORKFLOW STRUCTURE\n\nMain Certificate Generation Flow:\n\n1. 📥 Webhook Trigger\n   Receives JSON with certificate data\n\n2. 📧 Verifi Email\n   Validates email address with VerifiEmail API\n\n3. ✅ IF Validation\n   Checks: email valid + name/course/date not empty\n\n4. 🔄 Combine Data (Code node)\n   Merges webhook data + email validation\n\n5. 🎨 Generate HTML Certificate (Code node)\n   Creates beautiful HTML certificate\n\n6. 🖼️ HTML/CSS to Image\n   Converts HTML → PNG image\n\n7. 📧 Send Email (Gmail)\n   Delivers certificate to recipient\n\n8. 📊 Log to Google Sheets\n   Records certificate details\n\nError Flow (Separate):\n• On Workflow Error → Format Error → Slack Alert\n\nStatus: ✅ Fully functional workflow\nMissing: Success response to webhook (recommended)\n\nAll credentials configured and tested"
          },
          "typeVersion": 1
        },
        {
          "id": "7c4dc0c1-ae2b-4985-91de-a40356e28158",
          "name": "Testing Instructions",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2896,
            832
          ],
          "parameters": {
            "color": 7,
            "width": 568,
            "height": 856,
            "content": "## 🧪 TESTING YOUR WORKFLOW\n\nWebhook URL:\nhttps://n8n.exildraw.com/webhook-test/certificate-generator\n\nTest with cURL:\n```\ncurl -X POST https://n8n.exildraw.com/webhook-test/certificate-generator \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Test User\",\n    \"course\": \"Advanced JavaScript Programming\",\n    \"date\": \"2025-10-04\",\n    \"email\": \"test@gmail.com\",\n    \"instructor\": \"Jane Smith\",\n    \"duration\": \"40 hours\"\n  }'\n```\nTest with Postman:\n1. Method: POST\n2. URL: [webhook URL above]\n3. Headers: Content-Type = application/json\n4. Body: Use JSON from curl example\n\nExpected Results:\n✅ Email validation passes\n✅ HTML certificate generated\n✅ Image created at HTMLcsstoImg\n✅ Email sent to recipient\n✅ Entry logged in Google Sheets\n✅ All nodes execute successfully\n\nValidation Test (should fail):\n• Missing required field\n• Invalid email format\n• Disposable email address\n\n⚠️ Note: Use real email addresses for testing\nexample.com won't pass MX record validation\n\nCurrent Status: All nodes configured and ready\nNext: Add \"Respond to Webhook\" for success response"
          },
          "typeVersion": 1
        },
        {
          "id": "b9b4ba6f-35ca-4733-9d0a-0e2a7da5b56e",
          "name": "HTML/CSS to Image",
          "type": "n8n-nodes-htmlcsstoimage.htmlCssToImage",
          "position": [
            -160,
            528
          ],
          "parameters": {
            "html_content": "={{ $json.html }}"
          },
          "credentials": {
            "htmlcsstoimgApi": {
              "id": "credential-id",
              "name": "htmlcsstoimgApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "de9c267d-d005-43d4-bbb3-c33370f9493a",
          "name": "Verifi Email",
          "type": "n8n-nodes-verifiemail.verifiEmail",
          "position": [
            -1872,
            544
          ],
          "parameters": {
            "email": "={{ $json.body.email }}"
          },
          "credentials": {
            "verifiEmailApi": {
              "id": "credential-id",
              "name": "verifiEmailApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "646e0a7b-2cdc-48c0-8f15-5b7755e9e484",
          "name": "If",
          "type": "n8n-nodes-base.if",
          "position": [
            -1392,
            544
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "version": 2,
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "a39497f8-8b8a-4b3a-bc5f-3e8738fa4cbb",
                  "operator": {
                    "type": "string",
                    "operation": "notEmpty",
                    "singleValue": true
                  },
                  "leftValue": "={{ $('Certificate Request Webhook').item.json.body.name }}",
                  "rightValue": ""
                },
                {
                  "id": "37e0295c-18b2-4d3f-998b-e9d669dd90f7",
                  "operator": {
                    "type": "string",
                    "operation": "notEmpty",
                    "singleValue": true
                  },
                  "leftValue": "={{ $('Certificate Request Webhook').item.json.body.course }}",
                  "rightValue": ""
                },
                {
                  "id": "6ecb1197-b460-402e-99a1-00edb0d5150c",
                  "operator": {
                    "type": "string",
                    "operation": "notEmpty",
                    "singleValue": true
                  },
                  "leftValue": "={{ $('Certificate Request Webhook').item.json.body.date }}",
                  "rightValue": ""
                },
                {
                  "id": "3828fe0a-7c6a-449a-b380-c754717e0731",
                  "operator": {
                    "type": "boolean",
                    "operation": "true",
                    "singleValue": true
                  },
                  "leftValue": "={{ $json.valid }}",
                  "rightValue": ""
                }
              ]
            }
          },
          "typeVersion": 2.2
        },
        {
          "id": "9b7e5242-b3da-4552-b088-d585ffe7bcb0",
          "name": "Stop and Error",
          "type": "n8n-nodes-base.stopAndError",
          "position": [
            -1040,
            784
          ],
          "parameters": {
            "errorMessage": "=\"Missing required fields: name, course, date, or valid email\""
          },
          "typeVersion": 1
        },
        {
          "id": "b57d3884-9846-4b1f-9b00-ec378ea386ac",
          "name": "Code in JavaScript",
          "type": "n8n-nodes-base.code",
          "position": [
            -1056,
            528
          ],
          "parameters": {
            "jsCode": "// Combine Webhook Data with Email Validation\n// Get the current item (from IF node - email validation data)\nconst emailData = $input.item.json;\n\n// Get the original webhook data from the first node\nconst webhookData = $('Certificate Request Webhook').first().json.body;\n\n// Combine everything\nreturn {\n  json: {\n    // Certificate data from webhook\n    name: webhookData.name,\n    course: webhookData.course,\n    date: webhookData.date,\n    email: webhookData.email,\n    instructor: webhookData.instructor || 'Program Director',\n    duration: webhookData.duration || '',\n    certificateId: webhookData.certificateId || '',\n    \n    // Email validation results (optional - for logging/debugging)\n    emailValidation: {\n      valid: emailData.valid,\n      provider: emailData.details.mx.provider,\n      rfcCompliant: emailData.details.rfcCompliant,\n      validMxRecord: emailData.details.validMxRecord,\n      disposable: emailData.details.disposable\n    }\n  }\n};"
          },
          "typeVersion": 2
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "",
      "connections": {
        "If": {
          "main": [
            [
              {
                "node": "Code in JavaScript",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Stop and Error",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Verifi Email": {
          "main": [
            [
              {
                "node": "If",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "HTML/CSS to Image": {
          "main": [
            [
              {
                "node": "Send Certificate Email",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "On Workflow Error": {
          "main": [
            [
              {
                "node": "Format Error Details",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Code in JavaScript": {
          "main": [
            [
              {
                "node": "Generate HTML Certificate",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Error Details": {
          "main": [
            [
              {
                "node": "Send Slack Alert",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Send Certificate Email": {
          "main": [
            [
              {
                "node": "Log to Google Sheets",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Generate HTML Certificate": {
          "main": [
            [
              {
                "node": "HTML/CSS to Image",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Certificate Request Webhook": {
          "main": [
            [
              {
                "node": "Verifi Email",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 25,
      "nodeTypes": {
        "n8n-nodes-base.if": {
          "count": 1
        },
        "n8n-nodes-base.code": {
          "count": 3
        },
        "n8n-nodes-base.gmail": {
          "count": 1
        },
        "n8n-nodes-base.slack": {
          "count": 1
        },
        "n8n-nodes-base.webhook": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 13
        },
        "n8n-nodes-base.errorTrigger": {
          "count": 1
        },
        "n8n-nodes-base.googleSheets": {
          "count": 1
        },
        "n8n-nodes-base.stopAndError": {
          "count": 1
        },
        "n8n-nodes-verifiemail.verifiEmail": {
          "count": 1
        },
        "n8n-nodes-htmlcsstoimage.htmlCssToImage": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Jitesh Dugar",
      "username": "jiteshdugar",
      "bio": "AI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.",
      "verified": true,
      "links": [
        "https://www.linkedin.com/in/jiteshdugar"
      ],
      "avatar": "https://gravatar.com/avatar/edaa3abb99806b0586dced559d0a5417f24a507e7c4464a63960f0638a4b1b90?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 12,
        "icon": "fa:bug",
        "name": "n8n-nodes-base.errorTrigger",
        "codex": {
          "data": {
            "details": "In n8n, when a workflow execution fails, it can start another workflow. This second workflow can be any arbitrary workflow on your n8n instance. Use the Error Trigger node as your Trigger in the Error workflow.",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/creating-error-workflows-in-n8n/",
                  "icon": "🌪",
                  "label": "Creating Error Workflows in n8n"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.errortrigger/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Other Trigger Nodes"
              ]
            }
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "Error Trigger",
          "color": "#0000FF"
        },
        "iconData": {
          "icon": "bug",
          "type": "icon"
        },
        "displayName": "Error Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 18,
        "icon": "file:googleSheets.svg",
        "name": "n8n-nodes-base.googleSheets",
        "codex": {
          "data": {
            "alias": [
              "CSV",
              "Sheet",
              "Spreadsheet",
              "GS"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/",
                  "icon": "❤️",
                  "label": "Love at first sight: Ricardo’s n8n journey"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/",
                  "icon": "⏲",
                  "label": "Creating triggers for n8n workflows using polling"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/",
                  "icon": "🍔",
                  "label": "How Honest Burgers Use Automation to Save $100k per year"
                },
                {
                  "url": "https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/",
                  "icon": "💻",
                  "label": "How a digital strategist uses n8n for online marketing"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Data & Storage",
              "Productivity"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\",\"output\"]",
        "defaults": {
          "name": "Google Sheets"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="
        },
        "displayName": "Google Sheets",
        "typeVersion": 5,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          },
          {
            "id": 4,
            "name": "Productivity"
          }
        ]
      },
      {
        "id": 20,
        "icon": "fa:map-signs",
        "name": "n8n-nodes-base.if",
        "codex": {
          "data": {
            "alias": [
              "Router",
              "Filter",
              "Condition",
              "Logic",
              "Boolean",
              "Branch"
            ],
            "details": "The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/",
                  "icon": "🏭",
                  "label": "Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/",
                  "icon": "🤬",
                  "label": "Create a toxic language detector for Telegram in 4 step"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/",
                  "icon": "🏷️",
                  "label": "How to automatically manage contributions to open-source projects"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "If",
          "color": "#408000"
        },
        "iconData": {
          "icon": "map-signs",
          "type": "icon"
        },
        "displayName": "If",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 40,
        "icon": "file:slack.svg",
        "name": "n8n-nodes-base.slack",
        "codex": {
          "data": {
            "alias": [
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/",
                  "icon": "👏",
                  "label": "How to automatically give kudos to contributors with GitHub, Slack, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/slack/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "Slack"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"
        },
        "displayName": "Slack",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 47,
        "icon": "file:webhook.svg",
        "name": "n8n-nodes-base.webhook",
        "codex": {
          "data": {
            "alias": [
              "HTTP",
              "API",
              "Build",
              "WH"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/",
                  "icon": "✍️",
                  "label": "Learn how to automatically cross-post your content with n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/",
                  "icon": " 🪢",
                  "label": "What are APIs and how to use them with no code"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/",
                  "icon": "💻",
                  "label": "How a digital strategist uses n8n for online marketing"
                },
                {
                  "url": "https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/",
                  "icon": "📹",
                  "label": "The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/",
                  "icon": "👏",
                  "label": "How to automatically give kudos to contributors with GitHub, Slack, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/",
                  "label": "How to automate every step of an incident response workflow"
                },
                {
                  "url": "https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/",
                  "icon": "🧰",
                  "label": "Learn to Build Powerful API Endpoints Using Webhooks"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/",
                  "icon": "🦄",
                  "label": "Learn how to use webhooks with Mattermost slash commands"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "Webhook"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"
        },
        "displayName": "Webhook",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 356,
        "icon": "file:gmail.svg",
        "name": "n8n-nodes-base.gmail",
        "codex": {
          "data": {
            "alias": [
              "email",
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/",
                  "icon": "💪",
                  "label": "Using Automation to Boost Productivity in the Workplace"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Gmail"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"
        },
        "displayName": "Gmail",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 528,
        "icon": "fa:exclamation-triangle",
        "name": "n8n-nodes-base.stopAndError",
        "codex": {
          "data": {
            "alias": [
              "Throw error",
              "Error",
              "Exception"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.stopanderror/"
                }
              ]
            },
            "categories": [
              "Core Nodes",
              "Utility"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Stop and Error",
          "color": "#ff0000"
        },
        "iconData": {
          "icon": "exclamation-triangle",
          "type": "icon"
        },
        "displayName": "Stop and Error",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 7,
            "name": "Utility"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 834,
        "icon": "file:code.svg",
        "name": "n8n-nodes-base.code",
        "codex": {
          "data": {
            "alias": [
              "cpde",
              "Javascript",
              "JS",
              "Python",
              "Script",
              "Custom Code",
              "Function"
            ],
            "details": "The Code node allows you to execute JavaScript in your workflow.",
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Code",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 35,
        "name": "Document Extraction"
      }
    ],
    "image": []
  }
}