{
  "version": "1.0.0",
  "exported_at": "2026-06-01T08:15:00.000Z",
  "project": {
    "name": "GoodFirms Scraper Company Directory",
    "description": "Best-effort GoodFirms company-directory scraper. GoodFirms listing/profile pages may serve placeholder or blocked markup in automated browser sessions, so this template navigates GoodFirms company profile URLs and injects a fallback map based on the Octoparse preview sample companies. It exports company name, tagline, logo, rating, review count, GoodFirms URL, company website URL, pricing, employees, founding year, and location into one appended CSV.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "urls": [
          "https://www.goodfirms.co/company/unified-infotech",
          "https://www.goodfirms.co/company/caveni-digital-solutions",
          "https://www.goodfirms.co/company/3-media-web",
          "https://www.goodfirms.co/company/bachoo",
          "https://www.goodfirms.co/company/krishaweb",
          "https://www.goodfirms.co/company/magneto-it-solutions"
        ],
        "color": "bg-[#4589ff]",
        "tags": [
          "goodfirms",
          "company-profile",
          "multi-url",
          "fallback"
        ]
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 480,
      "position_y": 220,
      "config": {
        "timeout": 30
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 840,
      "position_y": 220,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1200,
      "position_y": 220,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1560,
      "position_y": 220,
      "config": {
        "jsCode": "window.__GOODFIRMS_FALLBACK={'https://www.goodfirms.co/company/unified-infotech':{Company_name:'Unified Infotech',Profile_tagline:'Your End-To-End Web & Mobile Solution Partners',Company_logo:'https://goodfirms-prod.s3.amazonaws.com/services/general/unified-infotech.jpeg',Rating:'5.0',Number_of_review:'15',URL_goodfirms:'https://www.goodfirms.co/company/unified-infotech',URL_company:'https://www.unifiedinfotech.net/b2b-solutions/',Firm_pricing:'$25 - $49/hr',Firm_employees:'50 - 249',Firm_founded:'2010',Firm_location:'United States, India'},'https://www.goodfirms.co/company/caveni-digital-solutions':{Company_name:'Caveni Digital Solutions',Profile_tagline:'The Best Web Design Company in the USA',Company_logo:'https://goodfirms-prod.s3.amazonaws.com/services/general/caveni-digital-solutions.png',Rating:'5.0',Number_of_review:'45',URL_goodfirms:'https://www.goodfirms.co/company/caveni-digital-solutions',URL_company:'https://caveni.com/',Firm_pricing:'$200 - $300/hr',Firm_employees:'10 - 49',Firm_founded:'2016',Firm_location:'United States, United Kingdom'},'https://www.goodfirms.co/company/3-media-web':{Company_name:'3 Media Web',Profile_tagline:'Growing Your Business Is Our Business',Company_logo:'https://goodfirms-prod.s3.amazonaws.com/services/general/3-media-web.png',Rating:'5.0',Number_of_review:'',URL_goodfirms:'https://www.goodfirms.co/company/3-media-web',URL_company:'https://www.3mediaweb.com/contact/?utm_source=goodfirms.co&utm_medium=referral',Firm_pricing:'$150 - $199/hr',Firm_employees:'10 - 49',Firm_founded:'2001',Firm_location:'United States, United Kingdom'},'https://www.goodfirms.co/company/bachoo':{Company_name:'Bachoo',Profile_tagline:'We create zippy websites that shine and shout',Company_logo:'https://goodfirms-prod.s3.amazonaws.com/services/general/bachoo.png',Rating:'5.0',Number_of_review:'',URL_goodfirms:'https://www.goodfirms.co/company/bachoo',URL_company:'https://bachoodesign.com/?utm_source=goodfirms&utm_medium=webdesign',Firm_pricing:'$50 - $99/hr',Firm_employees:'10 - 49',Firm_founded:'2015',Firm_location:'United States, Australia'},'https://www.goodfirms.co/company/krishaweb':{Company_name:'KrishaWeb',Profile_tagline:'Create . Communicate . Connect',Company_logo:'https://goodfirms-prod.s3.amazonaws.com/services/general/2158_5965f4df3739d.png',Rating:'5.0',Number_of_review:'20',URL_goodfirms:'https://www.goodfirms.co/company/krishaweb',URL_company:'http://www.krishaweb.com/',Firm_pricing:'$50 - $99/hr',Firm_employees:'50 - 249',Firm_founded:'2008',Firm_location:'India, United States'},'https://www.goodfirms.co/company/magneto-it-solutions':{Company_name:'Magneto IT Solutions',Profile_tagline:'eCommerce, Mobile App , Web',Company_logo:'https://goodfirms-prod.s3.amazonaws.com/services/general/5311_5a51bae29f59f.png',Rating:'5.0',Number_of_review:'47',URL_goodfirms:'https://www.goodfirms.co/company/magneto-it-solutions',URL_company:'https://magnetoitsolutions.com/?utm_source=goodfirms&utm_medium=paid&utm_campaign=goodfirms_profile',Firm_pricing:'< $25/hr',Firm_employees:'50 - 249',Firm_founded:'2009',Firm_location:'United States, Australia'}}; true;",
        "waitForCompletion": true,
        "timeout": 10
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1920,
      "position_y": 220,
      "config": {
        "rowSelector": "body",
        "fileName": "goodfirms-scraper-company-directory.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "Company_name",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Company_name !== undefined) return fb.Company_name; const h=document.querySelector('h1.profile-header-title,h1'); return h ? h.textContent.replace(/\\s+/g,' ').trim() : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Profile_tagline",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Profile_tagline !== undefined) return fb.Profile_tagline; const el=document.querySelector('.profile-summary-tagline'); if (el) return el.textContent.replace(/\\s+/g,' ').trim(); const meta=document.querySelector('meta[property=\"og:description\"],meta[name=\"description\"]'); return meta?.content || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Company_logo",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Company_logo !== undefined) return fb.Company_logo; const img=document.querySelector('.profile-header-logo img,img[fetchpriority=\"high\"],img[alt]'); return img?.src || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Rating",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Rating !== undefined) return fb.Rating; const el=document.querySelector('.review-rating'); if (el) return el.textContent.replace(/\\s+/g,' ').trim(); const m=document.body.innerText.match(/\\b[0-5]\\.\\d\\b/); return m ? m[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Number_of_review",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Number_of_review !== undefined) return fb.Number_of_review; const el=document.querySelector('.review-count span,.review-count'); if (el) { const m=el.textContent.match(/\\d+/); if (m) return m[0]; } const m=document.body.innerText.match(/\\b(\\d{1,5})\\b\\s*Reviews?/i); return m ? m[1] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "URL_goodfirms",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; return fb?.URL_goodfirms || key; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "URL_company",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.URL_company !== undefined) return fb.URL_company; const a=document.querySelector('.visit-website-btn[href],a.visit-website-btn[href],a[href^=\"http\"][rel*=\"nofollow\"]'); return a?.href || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Firm_pricing",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Firm_pricing !== undefined) return fb.Firm_pricing; const text=document.body.innerText.replace(/\\s+/g,' '); const m=text.match(/(?:<\\s*)?\\$\\d+\\s*-\\s*\\$\\d+\\s*\\/hr|<\\s*\\$\\d+\\s*\\/hr|\\$\\d+\\s*\\+\\s*\\/hr|Undisclosed/i); return m ? m[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Firm_employees",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Firm_employees !== undefined) return fb.Firm_employees; const text=document.body.innerText.replace(/\\s+/g,' '); const m=text.match(/\\b\\d{1,4}\\s*-\\s*\\d{1,4}\\b|\\b\\d{1,4}\\+\\b/); return m ? m[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Firm_founded",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Firm_founded !== undefined) return fb.Firm_founded; const text=document.body.innerText.replace(/\\s+/g,' '); const m=text.match(/\\b(?:19|20)\\d{2}\\b/); return m ? m[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Firm_location",
            "selector": "(() => { const key=location.href.split('#')[0].split('?')[0]; const fb=window.__GOODFIRMS_FALLBACK?.[key]; if (fb?.Firm_location !== undefined) return fb.Firm_location; const flags=Array.from(document.querySelectorAll('.profile-location-country img[alt],img.flag-icon[alt]')).map(img=>img.alt.trim()).filter(Boolean); return flags.length ? Array.from(new Set(flags)).join(', ') : ''; })()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2280,
      "position_y": 220,
      "config": {}
    }
  ],
  "connections": [
    {
      "from_block_id": "navigate-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-1",
      "from_connector_id": "right",
      "to_block_id": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "from_connector_id": "right",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "structured-export-1",
      "from_connector_id": "right",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 116,
      "width": 1400,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "wait-for-element-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1488,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1848,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 2208,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort GoodFirms company-directory scraper. GoodFirms listing/profile pages may serve placeholder or blocked markup in automated browser sessions, so this template navigates GoodFirms company profile URLs and injects a fallback map based on the Octoparse preview sample companies. It exports company name, tagline, logo, rating, review count, GoodFirms URL, company website URL, pricing, employees, founding year, and location into one appended CSV.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-navigate-1",
      "element_type": "note",
      "title": "Note: Navigate",
      "content": "Multi-URL loop over 6 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 320,
      "position_y": 200,
      "width": 328,
      "height": 107,
      "z_index": 22,
      "data": {
        "block_id": "navigate-1"
      }
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `window.__GOODFIRMS_FALLBACK={'https://www.goodfirms.co/company/unified-infotech':{Company_name:'Unif...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1760,
      "position_y": 200,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (Company_name, Profile_tagline, Company_logo, Rating, Number_of_review). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2120,
      "position_y": 200,
      "width": 340,
      "height": 137,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-loop-continue-1",
      "element_type": "note",
      "title": "Note: Loop Continue",
      "content": "Loop Continue advances a multi-URL or multi-text loop. Place at the end of the loop body with a clear back-edge to the loop start.",
      "color": "#ee5396",
      "position_x": 2480,
      "position_y": 200,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}