{"id":4840,"date":"2026-07-30T15:31:03","date_gmt":"2026-07-30T15:31:03","guid":{"rendered":"https:\/\/sugimotovisa.com\/en\/?page_id=4840"},"modified":"2026-07-30T15:45:27","modified_gmt":"2026-07-30T15:45:27","slug":"bc-pnp-entrepreneur-calculator","status":"publish","type":"page","link":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/","title":{"rendered":"BC PNP Entrepreneur Calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4840\" class=\"elementor elementor-4840\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ee21add e-flex e-con-boxed e-con e-parent\" data-id=\"ee21add\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ae4e1b9 elementor-widget elementor-widget-heading\" data-id=\"ae4e1b9\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">BC PNP Entrepreneur Calculator<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f082b6e elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"f082b6e\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Use this calculator to estimate your registration score for the BC Provincial Nominee Program\u2019s Entrepreneur Immigration stream. Your score is based on the information you enter, including your business experience, personal net worth, investment plans, job creation, and proposed business location.<\/p><p>The result is an estimate only. If you submit a registration, the BC PNP will review your information and supporting documents. Your final score may be adjusted if the program determines that any details were entered incorrectly or cannot be verified.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7dfd56c elementor-widget elementor-widget-html\" data-id=\"7dfd56c\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"bc-pnp-tool\" lang=\"en\" dir=\"ltr\">\n  <div class=\"logobar\">\n     <\/div>\n\n  <div class=\"wrap\">\n    <div class=\"langbar\">\n     \n    <\/div>\n\n    <header class=\"hero\">\n      <h2 id=\"c-title\"><\/h2>\n      <p id=\"c-sub\"><\/p>\n    <\/header>\n\n    <div class=\"note-top\" id=\"c-note\"><\/div>\n\n    <div class=\"grid\">\n      <div>\n        <div class=\"card\">\n          <h2 id=\"h-personal\"><\/h2>\n          <div id=\"f-personal\"><\/div>\n        <\/div>\n\n        <div class=\"card\">\n          <h2 id=\"h-exp\"><\/h2>\n          <div id=\"f-exp\"><\/div>\n        <\/div>\n\n        <div class=\"card\">\n          <h2 id=\"h-fin\"><\/h2>\n          <div id=\"f-fin\"><\/div>\n        <\/div>\n\n        <div class=\"card\">\n          <h2 id=\"h-biz\"><\/h2>\n          <div id=\"f-biz\"><\/div>\n        <\/div>\n\n        <div class=\"card\">\n          <h2 id=\"h-loc\"><\/h2>\n          <div id=\"f-loc\"><\/div>\n        <\/div>\n      <\/div>\n\n      <div id=\"results\"><\/div>\n    <\/div>\n\n    <footer class=\"disc\" id=\"c-footer\"><\/footer>\n  <\/div>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7179df8 elementor-widget elementor-widget-html\" data-id=\"7179df8\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\/* BC PNP Entrepreneur Immigration \u2014 self-declared score + eligibility + gaps. *\/\n(function () {\n  \"use strict\";\n\n  var lang = \"en\";\n  var app = document.getElementById(\"bc-pnp-tool\");\n\n  if (!app) return;\n\n  var $ = function (id) {\n    return app.querySelector(\"#\" + id);\n  };\n\n  var CAD = function (n) {\n    return \"$\" + Number(n).toLocaleString(\"en-CA\");\n  };\n\n  function bracket(v, t) {\n    var p = 0;\n\n    for (var i = 0; i < t.length; i++) {\n      if (v >= t[i][0]) {\n        p = t[i][1];\n      } else {\n        break;\n      }\n    }\n\n    return p;\n  }\n\n  function nextT(v, t) {\n    for (var i = 0; i < t.length; i++) {\n      if (t[i][0] > v) return t[i];\n    }\n\n    return null;\n  }\n\n  var BASE = {\n    ownerExp: [\n      [0, 0],\n      [12, 4],\n      [25, 6],\n      [37, 12],\n      [49, 15],\n      [60, 20]\n    ],\n    seniorExp: [\n      [0, 0],\n      [24, 4],\n      [49, 8],\n      [60, 12]\n    ],\n    liquid: [\n      [0, 0],\n      [50000, 2],\n      [200000, 3],\n      [400000, 4]\n    ],\n    netWorth: [\n      [0, 0],\n      [600000, 5],\n      [800000, 6],\n      [2000000, 7],\n      [5000000, 8]\n    ],\n    investment: [\n      [0, 0],\n      [200000, 8],\n      [400000, 10],\n      [600000, 11],\n      [1000000, 12],\n      [2000000, 14],\n      [4000000, 16],\n      [8000000, 20]\n    ],\n    jobs: [\n      [0, 0],\n      [1, 4],\n      [2, 5],\n      [3, 6],\n      [4, 7],\n      [5, 8],\n      [6, 9],\n      [7, 10],\n      [10, 11],\n      [20, 12]\n    ],\n    age: [\n      [0, 0],\n      [25, 4],\n      [35, 8],\n      [45, 6],\n      [55, 4],\n      [65, 0]\n    ],\n    region: {\n      mainland_southwest: 0,\n      vancouver_island_coast: 6,\n      thompson_okanagan: 6,\n      cariboo: 10,\n      kootenay: 12,\n      nechako: 12,\n      north_coast: 12,\n      northeast: 12\n    },\n    education: {\n      secondary_or_less: 0,\n      associate_or_diploma: 4,\n      bachelor_or_postgrad: 7,\n      masters_or_doctorate: 10\n    },\n    exploratory: {\n      none_or_over_3y: 0,\n      \"1_to_3y_ago\": 3,\n      under_1y_not_region: 5,\n      under_1y_in_region: 8\n    }\n  };\n\n  var REGIONAL = {\n    ownerExp: [\n      [0, 0],\n      [12, 7],\n      [25, 12],\n      [37, 16],\n      [49, 19],\n      [60, 22]\n    ],\n    seniorExp: [\n      [0, 0],\n      [24, 4],\n      [49, 8],\n      [60, 12]\n    ],\n    liquid: [\n      [0, 0],\n      [10000, 1],\n      [50000, 2],\n      [200000, 3]\n    ],\n    netWorth: [\n      [0, 0],\n      [300000, 2],\n      [1000000, 3]\n    ],\n    investment: [\n      [0, 0],\n      [100000, 6],\n      [350000, 8],\n      [600000, 10]\n    ],\n    jobs: [\n      [0, 0],\n      [1, 10],\n      [2, 11],\n      [5, 13],\n      [8, 15]\n    ],\n    age: [\n      [0, 2],\n      [25, 8],\n      [30, 16],\n      [45, 10],\n      [55, 4],\n      [65, 0]\n    ],\n    canadianExp: [\n      [0, 0],\n      [12, 4],\n      [25, 8]\n    ],\n    langClb: [\n      [0, 0],\n      [4, 5],\n      [5, 10],\n      [6, 15],\n      [7, 23]\n    ],\n    region: {\n      mainland_southwest: 1,\n      vancouver_island_coast: 2,\n      thompson_okanagan: 6,\n      cariboo: 10,\n      kootenay: 10,\n      nechako: 12,\n      north_coast: 12,\n      northeast: 12\n    },\n    education: {\n      secondary_or_less: 0,\n      associate_or_diploma: 6,\n      bachelor_or_postgrad: 14,\n      masters_or_doctorate: 16\n    },\n    population: {\n      over_75000: 0,\n      \"40000_75000\": 1,\n      \"20000_39999\": 2,\n      \"15000_19999\": 3,\n      \"10000_14999\": 4,\n      \"5000_9999\": 5,\n      under_5000: 6\n    }\n  };\n\n  function meetsExp(owner, senior) {\n    return (\n      owner >= 37 ||\n      senior >= 49 ||\n      (owner >= 12 && senior >= 24)\n    );\n  }\n\n  function meetsEdu(profile) {\n    return (\n      profile.educationLevel !== \"secondary_or_less\" ||\n      profile.owned100PctFor36of60\n    );\n  }\n\n  function sec(key, points, max, min) {\n    return {\n      key: key,\n      points: points,\n      max: max,\n      min: min,\n      meetsMin: min === undefined ? true : points >= min\n    };\n  }\n\n  function scoreBase(profile) {\n    var sections = [];\n\n    var experience = Math.min(\n      20,\n      bracket(profile.ownerManagerMonths10y, BASE.ownerExp) +\n        bracket(profile.seniorManagerMonths10y, BASE.seniorExp)\n    );\n\n    sections.push(\n      sec(\n        \"experience\",\n        experience + (profile.owned100PctFor36of60 ? 4 : 0),\n        24,\n        8\n      )\n    );\n\n    sections.push(\n      sec(\n        \"networth\",\n        bracket(profile.liquidAssets, BASE.liquid) +\n          bracket(profile.totalNetWorth, BASE.netWorth),\n        12,\n        5\n      )\n    );\n\n    sections.push(\n      sec(\n        \"investment\",\n        bracket(profile.totalInvestment, BASE.investment),\n        20,\n        8\n      )\n    );\n\n    sections.push(\n      sec(\"jobs\", bracket(profile.fteJobs, BASE.jobs), 12, 4)\n    );\n\n    sections.push(\n      sec(\"region\", BASE.region[profile.developmentRegion], 12)\n    );\n\n    var languagePoints =\n      profile.clbLevel >= 5\n        ? 6\n        : profile.clbLevel === 4\n          ? 4\n          : 0;\n\n    var adaptability =\n      languagePoints +\n      BASE.education[profile.educationLevel] +\n      bracket(profile.age, BASE.age) +\n      BASE.exploratory[profile.exploratoryVisit] +\n      (profile.canadianExperienceMonths >= 12 ? 8 : 0);\n\n    sections.push(sec(\"adaptability\", adaptability, 40));\n\n    var selfDeclared = sections.reduce(function (total, item) {\n      return total + item.points;\n    }, 0);\n\n    var eligibility = baseElig(profile);\n\n    var ok =\n      eligibility.every(function (item) {\n        return !item.hardGate || item.passed;\n      }) &&\n      sections.every(function (item) {\n        return item.meetsMin;\n      });\n\n    var needed = Math.max(40, 115 - selfDeclared);\n\n    return {\n      stream: \"base\",\n      sections: sections,\n      sd: selfDeclared,\n      max: 120,\n      threshold: 115,\n      conceptMax: 80,\n      conceptMin: 40,\n      need: needed,\n      elig: eligibility,\n      ok: ok,\n      gaps: baseGaps(profile, sections)\n    };\n  }\n\n  function baseElig(profile) {\n    return [\n      {\n        key: \"status\",\n        passed: profile.immigrationStatusOk,\n        hardGate: true\n      },\n      {\n        key: \"experience\",\n        passed: meetsExp(\n          profile.ownerManagerMonths10y,\n          profile.seniorManagerMonths10y\n        ),\n        hardGate: true\n      },\n      {\n        key: \"education\",\n        passed: meetsEdu(profile),\n        hardGate: true\n      },\n      {\n        key: \"networth\",\n        passed: profile.totalNetWorth >= 600000,\n        hardGate: true\n      },\n      {\n        key: \"investment\",\n        passed: profile.totalInvestment >= 200000,\n        hardGate: true\n      },\n      {\n        key: \"ownership\",\n        passed:\n          profile.ownershipPct >= 33.333 ||\n          profile.totalInvestment >= 1000000,\n        hardGate: true\n      },\n      {\n        key: \"jobs\",\n        passed: profile.fteJobs >= 1,\n        hardGate: true\n      },\n      {\n        key: \"language\",\n        passed: profile.clbLevel >= 4,\n        hardGate: true\n      }\n    ];\n  }\n\n  function scoreRegional(profile) {\n    var sections = [];\n\n    var experience = Math.min(\n      22,\n      bracket(profile.ownerManagerMonths5y, REGIONAL.ownerExp) +\n        bracket(profile.seniorManagerMonths5y, REGIONAL.seniorExp)\n    );\n\n    sections.push(\n      sec(\n        \"experience\",\n        experience + (profile.owned100PctFor36of60 ? 2 : 0),\n        24,\n        8\n      )\n    );\n\n    sections.push(\n      sec(\n        \"networth\",\n        bracket(profile.liquidAssets, REGIONAL.liquid) +\n          bracket(profile.totalNetWorth, REGIONAL.netWorth),\n        6,\n        2\n      )\n    );\n\n    sections.push(\n      sec(\n        \"investment\",\n        bracket(profile.totalInvestment, REGIONAL.investment),\n        10,\n        6\n      )\n    );\n\n    sections.push(\n      sec(\n        \"jobs\",\n        bracket(profile.fteJobs, REGIONAL.jobs),\n        15,\n        10\n      )\n    );\n\n    sections.push(\n      sec(\n        \"population\",\n        REGIONAL.population[profile.communityPopulation],\n        6\n      )\n    );\n\n    sections.push(\n      sec(\n        \"region\",\n        REGIONAL.region[profile.developmentRegion],\n        12\n      )\n    );\n\n    var languagePoints = bracket(\n      profile.clbLevel,\n      REGIONAL.langClb\n    );\n\n    var adaptability =\n      languagePoints +\n      REGIONAL.education[profile.educationLevel] +\n      bracket(profile.age, REGIONAL.age) +\n      bracket(\n        profile.canadianExperienceMonths,\n        REGIONAL.canadianExp\n      ) +\n      (profile.familyInCommunity ? 4 : 0);\n\n    sections.push(sec(\"adaptability\", adaptability, 67));\n\n    var languageMinimum = languagePoints >= 5;\n\n    var selfDeclared = sections.reduce(function (total, item) {\n      return total + item.points;\n    }, 0);\n\n    var eligibility = regionalElig(\n      profile,\n      languageMinimum\n    );\n\n    var ok =\n      eligibility.every(function (item) {\n        return !item.hardGate || item.passed;\n      }) &&\n      sections.every(function (item) {\n        return item.meetsMin;\n      }) &&\n      languageMinimum;\n\n    var needed = Math.max(0, 105 - selfDeclared);\n\n    return {\n      stream: \"regional\",\n      sections: sections,\n      sd: selfDeclared,\n      max: 140,\n      threshold: 105,\n      conceptMax: 60,\n      conceptMin: null,\n      need: needed,\n      elig: eligibility,\n      ok: ok,\n      gaps: regionalGaps(\n        profile,\n        sections,\n        languageMinimum\n      )\n    };\n  }\n\n  function regionalElig(profile, languageMinimum) {\n    return [\n      {\n        key: \"status\",\n        passed: profile.immigrationStatusOk,\n        hardGate: true\n      },\n      {\n        key: \"newbusiness\",\n        passed: profile.businessType === \"new\",\n        hardGate: true\n      },\n      {\n        key: \"community\",\n        passed:\n          profile.communityPopulation !== \"over_75000\",\n        hardGate: true\n      },\n      {\n        key: \"referral\",\n        passed: profile.hasCommunityReferral,\n        hardGate: true\n      },\n      {\n        key: \"experience\",\n        passed: meetsExp(\n          profile.ownerManagerMonths5y,\n          profile.seniorManagerMonths5y\n        ),\n        hardGate: true\n      },\n      {\n        key: \"education\",\n        passed: meetsEdu(profile),\n        hardGate: true\n      },\n      {\n        key: \"networth\",\n        passed: profile.totalNetWorth >= 300000,\n        hardGate: true\n      },\n      {\n        key: \"investment\",\n        passed: profile.totalInvestment >= 100000,\n        hardGate: true\n      },\n      {\n        key: \"ownership\",\n        passed: profile.ownershipPct >= 51,\n        hardGate: true\n      },\n      {\n        key: \"jobs\",\n        passed: profile.fteJobs >= 1,\n        hardGate: true\n      },\n      {\n        key: \"language\",\n        passed:\n          profile.clbLevel >= 4 &&\n          profile.hasValidLanguageTest &&\n          languageMinimum,\n        hardGate: true\n      }\n    ];\n  }\n\n  function numericGap(current, tiers, currentPoints, code) {\n    var next = nextT(current, tiers);\n\n    if (!next) return null;\n\n    var difference = next[1] - currentPoints;\n\n    if (difference <= 0) return null;\n\n    return {\n      code: code,\n      points: difference,\n      vars: {\n        target: next[0]\n      }\n    };\n  }\n\n  function push(array, gap) {\n    if (gap) array.push(gap);\n  }\n\n  function baseGaps(profile, sections) {\n    var gaps = [];\n\n    var findSection = function (key) {\n      return sections.filter(function (item) {\n        return item.key === key;\n      })[0];\n    };\n\n    push(\n      gaps,\n      numericGap(\n        profile.totalInvestment,\n        BASE.investment,\n        findSection(\"investment\").points,\n        \"money\"\n      )\n    );\n\n    push(\n      gaps,\n      numericGap(\n        profile.fteJobs,\n        BASE.jobs,\n        findSection(\"jobs\").points,\n        \"jobs\"\n      )\n    );\n\n    push(\n      gaps,\n      numericGap(\n        profile.totalNetWorth,\n        BASE.netWorth,\n        bracket(profile.totalNetWorth, BASE.netWorth),\n        \"money\"\n      )\n    );\n\n    push(\n      gaps,\n      numericGap(\n        profile.liquidAssets,\n        BASE.liquid,\n        bracket(profile.liquidAssets, BASE.liquid),\n        \"money\"\n      )\n    );\n\n    if (profile.clbLevel < 5) {\n      gaps.push({\n        code: \"language\",\n        points: profile.clbLevel === 4 ? 2 : 4,\n        vars: {\n          target: profile.clbLevel >= 4 ? 5 : 4\n        }\n      });\n    }\n\n    if (BASE.region[profile.developmentRegion] < 12) {\n      gaps.push({\n        code: \"location\",\n        points:\n          12 - BASE.region[profile.developmentRegion]\n      });\n    }\n\n    if (\n      profile.exploratoryVisit !==\n      \"under_1y_in_region\"\n    ) {\n      gaps.push({\n        code: \"visit\",\n        points:\n          8 -\n          BASE.exploratory[\n            profile.exploratoryVisit\n          ]\n      });\n    }\n\n    return gaps;\n  }\n\n  function regionalGaps(\n    profile,\n    sections,\n    languageMinimum\n  ) {\n    var gaps = [];\n\n    var findSection = function (key) {\n      return sections.filter(function (item) {\n        return item.key === key;\n      })[0];\n    };\n\n    push(\n      gaps,\n      numericGap(\n        profile.totalInvestment,\n        REGIONAL.investment,\n        findSection(\"investment\").points,\n        \"money\"\n      )\n    );\n\n    push(\n      gaps,\n      numericGap(\n        profile.fteJobs,\n        REGIONAL.jobs,\n        findSection(\"jobs\").points,\n        \"jobs\"\n      )\n    );\n\n    push(\n      gaps,\n      numericGap(\n        profile.totalNetWorth,\n        REGIONAL.netWorth,\n        bracket(\n          profile.totalNetWorth,\n          REGIONAL.netWorth\n        ),\n        \"money\"\n      )\n    );\n\n    if (!languageMinimum) {\n      gaps.push({\n        code: \"languageTestRequired\",\n        points: 5\n      });\n    } else if (profile.clbLevel < 7) {\n      gaps.push({\n        code: \"languageUp\",\n        points:\n          bracket(\n            Math.min(profile.clbLevel + 1, 7),\n            REGIONAL.langClb\n          ) -\n          bracket(\n            profile.clbLevel,\n            REGIONAL.langClb\n          )\n      });\n    }\n\n    if (\n      REGIONAL.population[\n        profile.communityPopulation\n      ] < 6\n    ) {\n      gaps.push({\n        code: \"communitySize\",\n        points:\n          6 -\n          REGIONAL.population[\n            profile.communityPopulation\n          ]\n      });\n    }\n\n    if (!profile.familyInCommunity) {\n      gaps.push({\n        code: \"family\",\n        points: 4\n      });\n    }\n\n    return gaps;\n  }\n\n  function analyze(profile) {\n    var base = scoreBase(profile);\n    var regional = scoreRegional(profile);\n\n    var burden = function (result) {\n      return result.need \/ result.conceptMax;\n    };\n\n    var output = {\n      base: base,\n      regional: regional,\n      rec: {}\n    };\n\n    var baseBlocks = base.elig\n      .filter(function (item) {\n        return item.hardGate && !item.passed;\n      })\n      .map(function (item) {\n        return item.key;\n      });\n\n    var regionalBlocks = regional.elig\n      .filter(function (item) {\n        return item.hardGate && !item.passed;\n      })\n      .map(function (item) {\n        return item.key;\n      });\n\n    if (base.ok && regional.ok) {\n      if (burden(base) <= burden(regional)) {\n        output.rec = {\n          stream: \"base\",\n          code: \"bothBase\"\n        };\n      } else {\n        output.rec = {\n          stream: \"regional\",\n          code: \"bothRegional\"\n        };\n      }\n    } else if (base.ok) {\n      output.rec = {\n        stream: \"base\",\n        code: \"baseOnly\"\n      };\n    } else if (regional.ok) {\n      output.rec = {\n        stream: \"regional\",\n        code: \"regionalOnly\"\n      };\n    } else {\n      output.rec = {\n        stream: \"neither\",\n        code: \"neither\"\n      };\n    }\n\n    output.rec.baseNeeded = base.need;\n    output.rec.regNeeded = regional.need;\n    output.rec.baseB = baseBlocks;\n    output.rec.regB = regionalBlocks;\n\n    return output;\n  }\n\n  var T = {\n   \n    en: {\n      title:\n        \"BC PNP Entrepreneur Immigration Calculator\",\n      sub:\n        \"Estimate your objective self-declared score and hard eligibility for the Base and Regional streams.\",\n      note:\n        \"This computes only the objective self-declared score + hard eligibility. The business-concept score (up to 80 Base \/ 60 Regional) is expert-assessed and shown as \u201cpoints still needed\u201d. Not legal advice.\",\n      hPersonal: \"Personal\",\n      hExp:\n        \"Experience (non-overlapping months)\",\n      hFin: \"Finances (CAD)\",\n      hBiz: \"Business\",\n      hLoc: \"Location\",\n      qAge: \"Age\",\n      qEdu: \"Highest education\",\n      qLang: \"Language \u2014 lowest CLB\",\n      qCan:\n        \"Canadian experience (authorized work\/study)\",\n      qTest: \"Valid language test in hand\",\n      qStatus: \"Lawful immigration status\",\n      qOwner10: \"Owner-manager (last 10y)\",\n      qSenior10: \"Senior manager (last 10y)\",\n      qOwner5: \"Owner-manager (last 5y)\",\n      qSenior5: \"Senior manager (last 5y)\",\n      qOwned100:\n        \"Owned 100% for 3 of last 5 years\",\n      qNW: \"Total personal net worth\",\n      qLiq: \"Cash & liquid assets\",\n      qInv: \"Proposed investment\",\n      qBiz: \"Business type\",\n      qOwn: \"Ownership %\",\n      qJobs: \"Full-time jobs created\",\n      qRegion: \"B.C. region\",\n      qPop:\n        \"Community population (Regional)\",\n      qRef: \"Valid community referral\",\n      qFam: \"Family in community (12+ mo)\",\n      qVisit: \"Exploratory visit to B.C.\",\n      yes: \"Yes\",\n      no: \"No\",\n      edu: {\n        secondary_or_less:\n          \"High school or less\",\n        associate_or_diploma:\n          \"Diploma \/ certificate\",\n        bachelor_or_postgrad:\n          \"Bachelor's \/ post-grad\",\n        masters_or_doctorate:\n          \"Master's \/ PhD\"\n      },\n      clb: {\n        \"3\": \"Below CLB 4\",\n        \"4\": \"CLB 4\",\n        \"5\": \"CLB 5\",\n        \"6\": \"CLB 6\",\n        \"7\": \"CLB 7 or higher\"\n      },\n      can: {\n        none: \"No\",\n        some: \"Yes, up to 2 years\",\n        lots: \"Yes, more than 2 years\"\n      },\n      biz: {\n        new: \"New business\",\n        existing: \"Buy existing (Base only)\"\n      },\n      region: {\n        mainland_southwest:\n          \"Metro Vancouver \/ Southwest\",\n        vancouver_island_coast:\n          \"Vancouver Island & Coast\",\n        thompson_okanagan:\n          \"Thompson-Okanagan\",\n        cariboo: \"Cariboo\",\n        kootenay: \"Kootenay\",\n        nechako: \"Nechako\",\n        north_coast: \"North Coast\",\n        northeast: \"Northeast\"\n      },\n      pop: {\n        over_75000:\n          \"Over 75,000 (not eligible for Regional)\",\n        \"40000_75000\": \"40,000 \u2013 75,000\",\n        \"20000_39999\": \"20,000 \u2013 40,000\",\n        \"15000_19999\": \"15,000 \u2013 20,000\",\n        \"10000_14999\": \"10,000 \u2013 15,000\",\n        \"5000_9999\": \"5,000 \u2013 10,000\",\n        under_5000: \"Under 5,000\"\n      },\n      visit: {\n        none_or_over_3y:\n          \"No, or more than 3 years ago\",\n        \"1_to_3y_ago\":\n          \"Yes, 1\u20133 years ago\",\n        under_1y_not_region:\n          \"Yes, within the year (different area)\",\n        under_1y_in_region:\n          \"Yes, within the year (the area I'd build in)\"\n      },\n      kicker: \"Your result\",\n      hlGood: function (v) {\n        return (\n          \"Good news \u2014 the \" +\n          v.s +\n          \" stream looks like your best path\"\n        );\n      },\n      hlNeither:\n        \"Not quite there yet \u2014 but here's what's missing\",\n      hlStand: \"Here's where you stand\",\n      blurb: {\n        base:\n          \"Start or buy a business anywhere in B.C. Higher money requirements, but the most flexible.\",\n        regional:\n          \"Start a new business in a smaller partnering community. Lower money requirements, but you need a community referral.\"\n      },\n      status: {\n        green: \"Strong candidate\",\n        teal: \"Eligible to register\",\n        amber: \"Eligible, but points are low\",\n        red: \"Not eligible yet\"\n      },\n      earned: function (v) {\n        return v.n + \" points from your profile\";\n      },\n      need: function (v) {\n        return (\n          \"~\" +\n          v.n +\n          \" more needed from your business plan\"\n        );\n      },\n      reached:\n        \"Qualifying line already reached \ud83c\udf89\",\n      mustTitle: \"Must-have requirements\",\n      improveTitle: \"Ways to score higher\",\n      pts: function (v) {\n        return \"+\" + v.n + \" pts\";\n      },\n      tabs: {\n        base: \"Base stream\",\n        regional: \"Regional stream\"\n      },\n      bestfit: \"Best fit\",\n      unmet: function (v) {\n        return (\n          v.n +\n          \" requirement\" +\n          (v.n > 1 ? \"s\" : \"\") +\n          \" still to meet before this stream is an option.\"\n        );\n      },\n      explainT:\n        \"About the \u201cpoints from your business plan\u201d\",\n      explainB:\n        \"The numbers above are the points you earn from your background \u2014 money, experience, education, jobs and location. The rest comes from your business plan, judged by a BC PNP reviewer or your advisor, so we show it as \u201cpoints still needed\u201d, not a guess.\",\n      disc:\n        \"This is a friendly screening estimate, not legal advice. Final decisions rest with the BC PNP.\",\n      footer:\n        \"Sugimoto Visa \u00b7 Based on the BC PNP Entrepreneur Immigration program guides (effective May 27, 2024). Not legal advice.\",\n      elig: {\n        base: {\n          status: \"Valid immigration status\",\n          experience:\n            \"Enough business \/ management experience\",\n          education:\n            \"Education requirement met\",\n          networth:\n            \"Net worth at least $600,000\",\n          investment:\n            \"Investment at least $200,000\",\n          ownership:\n            \"Own at least 33\u2153% (or invest $1M+)\",\n          jobs: \"At least 1 full-time job\",\n          language:\n            \"Language at CLB 4+ (by final report)\"\n        },\n        regional: {\n          status: \"Valid immigration status\",\n          newbusiness:\n            \"A new business (not buying an existing one)\",\n          community:\n            \"In a participating (smaller) community\",\n          referral: \"Valid community referral\",\n          experience:\n            \"Enough business \/ management experience\",\n          education:\n            \"Education requirement met\",\n          networth:\n            \"Net worth at least $300,000\",\n          investment:\n            \"Investment at least $100,000\",\n          ownership: \"Own at least 51%\",\n          jobs: \"At least 1 full-time job\",\n          language:\n            \"Valid CLB 4+ language test at registration\"\n        }\n      },\n      gap: {\n        money: function (v) {\n          return (\n            \"Reach \" +\n            CAD(v.target) +\n            \" (next level).\"\n          );\n        },\n        jobs: function (v) {\n          return (\n            \"Create \" +\n            v.target +\n            \" job\" +\n            (v.target > 1 ? \"s\" : \"\") +\n            \" to reach the next level.\"\n          );\n        },\n        language: function (v) {\n          return v.target >= 5\n            ? \"Raise your language to CLB \" +\n                v.target +\n                \".\"\n            : \"Reach CLB 4 (also meets the language requirement).\";\n        },\n        location:\n          \"Build outside Metro Vancouver (e.g. Cariboo, Kootenay, the North) for more location points.\",\n        visit:\n          \"Visit the area you'll build in within the year before registering.\",\n        languageTestRequired:\n          \"Take a valid CLB 4+ language test \u2014 it's required to register.\",\n        languageUp:\n          \"A higher language level (up to CLB 7+) adds points.\",\n        communitySize:\n          \"Choose a smaller community (under 5,000) for more points.\",\n        family:\n          \"Close family who've lived in the community 12+ months adds points.\"\n      },\n      rec: {\n        bothBase: function (v) {\n          return (\n            \"You're eligible for both. Base needs about \" +\n            v.baseNeeded +\n            \" business-plan points versus \" +\n            v.regNeeded +\n            \" for Regional, and it lets you buy an existing business or build anywhere in B.C.\"\n          );\n        },\n        bothRegional: function (v) {\n          return (\n            \"You're eligible for both. Regional needs about \" +\n            v.regNeeded +\n            \" business-plan points versus \" +\n            v.baseNeeded +\n            \" for Base, with lower money bars \u2014 but it needs a community referral and a new business in a partnering community.\"\n          );\n        },\n        baseOnly:\n          \"You qualify for the Base stream. Regional isn't available \u2014 usually buying an existing business, no referral, ownership under 51%, a large community, or no language test yet.\",\n        regionalOnly:\n          \"You qualify for the Regional stream. Base isn't available \u2014 usually net worth under $600,000 or investment under $200,000.\",\n        neither: function (v) {\n          return (\n            \"Not eligible for either stream yet. Base still needs: \" +\n            (v.baseList || \"section minimums\") +\n            \". Regional still needs: \" +\n            (v.regList || \"section minimums\") +\n            \".\"\n          );\n        }\n      }\n    }\n  };\n\n  function t(key, values) {\n    var entry = T[lang][key];\n\n    return typeof entry === \"function\"\n      ? entry(values || {})\n      : entry;\n  }\n\n  function defaults() {\n    return {\n      age: 38,\n      educationLevel: \"bachelor_or_postgrad\",\n      clbLevel: 5,\n      hasValidLanguageTest: true,\n      canadianExperienceMonths: 0,\n      immigrationStatusOk: true,\n      ownerManagerMonths10y: 60,\n      seniorManagerMonths10y: 0,\n      ownerManagerMonths5y: 48,\n      seniorManagerMonths5y: 0,\n      owned100PctFor36of60: true,\n      totalNetWorth: 800000,\n      liquidAssets: 250000,\n      totalInvestment: 350000,\n      businessType: \"new\",\n      ownershipPct: 100,\n      fteJobs: 2,\n      developmentRegion:\n        \"thompson_okanagan\",\n      hasCommunityReferral: false,\n      communityPopulation: \"20000_39999\",\n      familyInCommunity: false,\n      exploratoryVisit: \"1_to_3y_ago\"\n    };\n  }\n\n  var p = defaults();\n\n  function esc(value) {\n    return String(value).replace(\n      \/[&<>\"]\/g,\n      function (character) {\n        return {\n          \"&\": \"&amp;\",\n          \"<\": \"&lt;\",\n          \">\": \"&gt;\",\n          '\"': \"&quot;\"\n        }[character];\n      }\n    );\n  }\n\n  function selectEl(key, current, options) {\n    return (\n      '<select data-k=\"' +\n      key +\n      '\">' +\n      options\n        .map(function (option) {\n          return (\n            '<option value=\"' +\n            esc(option.v) +\n            '\"' +\n            (String(option.v) === String(current)\n              ? \" selected\"\n              : \"\") +\n            \">\" +\n            esc(option.l) +\n            \"<\/option>\"\n          );\n        })\n        .join(\"\") +\n      \"<\/select>\"\n    );\n  }\n\n  function segEl(key, current, options) {\n    return (\n      '<div class=\"seg\" data-seg=\"' +\n      key +\n      '\">' +\n      options\n        .map(function (option) {\n          return (\n            '<button type=\"button\" data-v=\"' +\n            esc(option.v) +\n            '\" class=\"' +\n            (String(option.v) === String(current)\n              ? \"on\"\n              : \"\") +\n            '\">' +\n            esc(option.l) +\n            \"<\/button>\"\n          );\n        })\n        .join(\"\") +\n      \"<\/div>\"\n    );\n  }\n\n  function numEl(key, current, options) {\n    options = options || {};\n\n    return (\n      '<input type=\"number\" data-k=\"' +\n      key +\n      '\" value=\"' +\n      current +\n      '\"' +\n      (options.min != null\n        ? ' min=\"' + options.min + '\"'\n        : \"\") +\n      (options.step\n        ? ' step=\"' + options.step + '\"'\n        : \"\") +\n      (options.max != null\n        ? ' max=\"' + options.max + '\"'\n        : \"\") +\n      \">\"\n    );\n  }\n\n  function q(label, inner) {\n    return (\n      '<div class=\"q\"><label class=\"q-l\">' +\n      label +\n      \"<\/label>\" +\n      inner +\n      \"<\/div>\"\n    );\n  }\n\n  function optsFrom(map) {\n    return Object.keys(map).map(function (key) {\n      return {\n        v: key,\n        l: map[key]\n      };\n    });\n  }\n\n  var YN = function () {\n    return [\n      {\n        v: \"true\",\n        l: t(\"yes\")\n      },\n      {\n        v: \"false\",\n        l: t(\"no\")\n      }\n    ];\n  };\n\n  function renderForm() {\n    $(\"f-personal\").innerHTML =\n      q(\n        t(\"qAge\"),\n        numEl(\"age\", p.age, {\n          min: 16,\n          max: 90\n        })\n      ) +\n      q(\n        t(\"qEdu\"),\n        selectEl(\n          \"educationLevel\",\n          p.educationLevel,\n          optsFrom(T[lang].edu)\n        )\n      ) +\n      q(\n        t(\"qLang\"),\n        selectEl(\"clbLevel\", p.clbLevel, [\n          {\n            v: 3,\n            l: T[lang].clb[\"3\"]\n          },\n          {\n            v: 4,\n            l: T[lang].clb[\"4\"]\n          },\n          {\n            v: 5,\n            l: T[lang].clb[\"5\"]\n          },\n          {\n            v: 6,\n            l: T[lang].clb[\"6\"]\n          },\n          {\n            v: 7,\n            l: T[lang].clb[\"7\"]\n          }\n        ])\n      ) +\n      q(\n        t(\"qCan\"),\n        selectEl(\n          \"canExp\",\n          canKey(p.canadianExperienceMonths),\n          optsFrom(T[lang].can)\n        )\n      ) +\n      q(\n        t(\"qTest\"),\n        segEl(\n          \"hasValidLanguageTest\",\n          p.hasValidLanguageTest,\n          YN()\n        )\n      ) +\n      q(\n        t(\"qStatus\"),\n        segEl(\n          \"immigrationStatusOk\",\n          p.immigrationStatusOk,\n          YN()\n        )\n      );\n\n    $(\"f-exp\").innerHTML =\n      '<div class=\"two\">' +\n      q(\n        t(\"qOwner10\"),\n        numEl(\n          \"ownerManagerMonths10y\",\n          p.ownerManagerMonths10y,\n          {\n            min: 0,\n            max: 120,\n            step: 6\n          }\n        )\n      ) +\n      q(\n        t(\"qSenior10\"),\n        numEl(\n          \"seniorManagerMonths10y\",\n          p.seniorManagerMonths10y,\n          {\n            min: 0,\n            max: 120,\n            step: 6\n          }\n        )\n      ) +\n      \"<\/div>\" +\n      '<div class=\"two\">' +\n      q(\n        t(\"qOwner5\"),\n        numEl(\n          \"ownerManagerMonths5y\",\n          p.ownerManagerMonths5y,\n          {\n            min: 0,\n            max: 60,\n            step: 6\n          }\n        )\n      ) +\n      q(\n        t(\"qSenior5\"),\n        numEl(\n          \"seniorManagerMonths5y\",\n          p.seniorManagerMonths5y,\n          {\n            min: 0,\n            max: 60,\n            step: 6\n          }\n        )\n      ) +\n      \"<\/div>\" +\n      q(\n        t(\"qOwned100\"),\n        segEl(\n          \"owned100PctFor36of60\",\n          p.owned100PctFor36of60,\n          YN()\n        )\n      );\n\n    $(\"f-fin\").innerHTML =\n      q(\n        t(\"qNW\"),\n        numEl(\n          \"totalNetWorth\",\n          p.totalNetWorth,\n          {\n            min: 0,\n            step: 10000\n          }\n        )\n      ) +\n      q(\n        t(\"qLiq\"),\n        numEl(\n          \"liquidAssets\",\n          p.liquidAssets,\n          {\n            min: 0,\n            step: 10000\n          }\n        )\n      ) +\n      q(\n        t(\"qInv\"),\n        numEl(\n          \"totalInvestment\",\n          p.totalInvestment,\n          {\n            min: 0,\n            step: 10000\n          }\n        )\n      );\n\n    $(\"f-biz\").innerHTML =\n      q(\n        t(\"qBiz\"),\n        segEl(\n          \"businessType\",\n          p.businessType,\n          [\n            {\n              v: \"new\",\n              l: T[lang].biz.new\n            },\n            {\n              v: \"existing\",\n              l: T[lang].biz.existing\n            }\n          ]\n        )\n      ) +\n      '<div class=\"two\">' +\n      q(\n        t(\"qOwn\"),\n        numEl(\n          \"ownershipPct\",\n          p.ownershipPct,\n          {\n            min: 0,\n            max: 100,\n            step: 5\n          }\n        )\n      ) +\n      q(\n        t(\"qJobs\"),\n        numEl(\"fteJobs\", p.fteJobs, {\n          min: 0,\n          max: 50\n        })\n      ) +\n      \"<\/div>\";\n\n    $(\"f-loc\").innerHTML =\n      q(\n        t(\"qRegion\"),\n        selectEl(\n          \"developmentRegion\",\n          p.developmentRegion,\n          optsFrom(T[lang].region)\n        )\n      ) +\n      q(\n        t(\"qPop\"),\n        selectEl(\n          \"communityPopulation\",\n          p.communityPopulation,\n          optsFrom(T[lang].pop)\n        )\n      ) +\n      q(\n        t(\"qVisit\"),\n        selectEl(\n          \"exploratoryVisit\",\n          p.exploratoryVisit,\n          optsFrom(T[lang].visit)\n        )\n      ) +\n      '<div class=\"two\">' +\n      q(\n        t(\"qRef\"),\n        segEl(\n          \"hasCommunityReferral\",\n          p.hasCommunityReferral,\n          YN()\n        )\n      ) +\n      q(\n        t(\"qFam\"),\n        segEl(\n          \"familyInCommunity\",\n          p.familyInCommunity,\n          YN()\n        )\n      ) +\n      \"<\/div>\";\n\n    wire();\n  }\n\n  function canKey(months) {\n    return months > 24\n      ? \"lots\"\n      : months >= 12\n        ? \"some\"\n        : \"none\";\n  }\n\n  function canMonths(key) {\n    return {\n      none: 0,\n      some: 18,\n      lots: 30\n    }[key] || 0;\n  }\n\n  var NUMK = {\n    age: 1,\n    ownerManagerMonths10y: 1,\n    seniorManagerMonths10y: 1,\n    ownerManagerMonths5y: 1,\n    seniorManagerMonths5y: 1,\n    totalNetWorth: 1,\n    liquidAssets: 1,\n    totalInvestment: 1,\n    ownershipPct: 1,\n    fteJobs: 1,\n    clbLevel: 1\n  };\n\n  function setVal(key, raw) {\n    if (key === \"canExp\") {\n      p.canadianExperienceMonths =\n        canMonths(raw);\n      return;\n    }\n\n    if (raw === \"true\" || raw === \"false\") {\n      p[key] = raw === \"true\";\n      return;\n    }\n\n    if (NUMK[key]) {\n      p[key] = raw === \"\" ? 0 : Number(raw);\n      return;\n    }\n\n    p[key] = raw;\n  }\n\n  function wire() {\n    var root = app.querySelector(\".grid\");\n\n    if (!root) return;\n\n    root\n      .querySelectorAll(\n        \"select,input[type=number]\"\n      )\n      .forEach(function (element) {\n        var eventName =\n          element.tagName === \"SELECT\"\n            ? \"change\"\n            : \"input\";\n\n        element.addEventListener(\n          eventName,\n          function () {\n            setVal(\n              element.getAttribute(\"data-k\"),\n              element.value\n            );\n\n            calc();\n          }\n        );\n      });\n\n    root\n      .querySelectorAll(\".seg\")\n      .forEach(function (segment) {\n        segment.addEventListener(\n          \"click\",\n          function (event) {\n            var button =\n              event.target.closest(\n                \"button[data-v]\"\n              );\n\n            if (\n              !button ||\n              !segment.contains(button)\n            ) {\n              return;\n            }\n\n            setVal(\n              segment.getAttribute(\"data-seg\"),\n              button.getAttribute(\"data-v\")\n            );\n\n            renderForm();\n            calc();\n          }\n        );\n      });\n  }\n\n  var TONES = {\n    green: [\n      \"#065f46\",\n      \"#d1fae5\",\n      \"#10b981\"\n    ],\n    teal: [\n      \"var(--accent-ink)\",\n      \"var(--accent-soft)\",\n      \"var(--accent)\"\n    ],\n    amber: [\n      \"#92400e\",\n      \"#fef3c7\",\n      \"#f59e0b\"\n    ],\n    red: [\n      \"#9f1d16\",\n      \"#fbeeeb\",\n      \"#e0857b\"\n    ]\n  };\n\n  function tone(result) {\n    if (!result.ok) return \"red\";\n\n    if (result.need > result.conceptMax) {\n      return \"amber\";\n    }\n\n    if (\n      result.need <=\n      result.conceptMax * 0.6\n    ) {\n      return \"green\";\n    }\n\n    return \"teal\";\n  }\n\n  var activeTab = \"base\";\n\n  function renderResults() {\n    var analysis = analyze(p);\n\n    var recommended =\n      analysis.rec.stream === \"base\"\n        ? analysis.base\n        : analysis.rec.stream === \"regional\"\n          ? analysis.regional\n          : null;\n\n    var streamName =\n      analysis.rec.stream === \"regional\"\n        ? \"Regional\"\n        : \"Base\";\n\n    var heading =\n      analysis.rec.stream === \"neither\"\n        ? t(\"hlNeither\")\n        : recommended && recommended.ok\n          ? t(\"hlGood\", {\n              s: streamName\n            })\n          : t(\"hlStand\");\n\n    var rationale;\n\n    if (analysis.rec.code === \"neither\") {\n      var baseList = analysis.rec.baseB\n        .map(function (key) {\n          return T[lang].elig.base[key];\n        })\n        .join(\"\u060c \");\n\n      var regionalList = analysis.rec.regB\n        .map(function (key) {\n          return T[lang].elig.regional[key];\n        })\n        .join(\"\u060c \");\n\n      rationale = T[lang].rec.neither({\n        baseList: baseList,\n        regList: regionalList\n      });\n    } else {\n      var recommendation =\n        T[lang].rec[analysis.rec.code];\n\n      rationale =\n        typeof recommendation === \"function\"\n          ? recommendation(analysis.rec)\n          : recommendation;\n    }\n\n    var result =\n      activeTab === \"base\"\n        ? analysis.base\n        : analysis.regional;\n\n    var html = \"\";\n\n    html +=\n      '<div class=\"verdict' +\n      (analysis.rec.stream === \"neither\"\n        ? \" neither\"\n        : \"\") +\n      '\"><div class=\"k\">' +\n      t(\"kicker\") +\n      \"<\/div><h3>\" +\n      esc(heading) +\n      \"<\/h3><p>\" +\n      esc(rationale) +\n      \"<\/p><\/div>\";\n\n    html += '<div class=\"tabs\">';\n\n    [\"base\", \"regional\"].forEach(\n      function (id) {\n        var item =\n          id === \"base\"\n            ? analysis.base\n            : analysis.regional;\n\n        var itemTone = TONES[tone(item)];\n\n        html +=\n          '<button data-tab=\"' +\n          id +\n          '\" class=\"' +\n          (activeTab === id ? \"on\" : \"\") +\n          '\"><span class=\"dot\" style=\"background:' +\n          itemTone[2] +\n          '\"><\/span>' +\n          t(\"tabs\")[id] +\n          (analysis.rec.stream === id\n            ? ' <span class=\"badge\">' +\n              t(\"bestfit\") +\n              \"<\/span>\"\n            : \"\") +\n          \"<\/button>\";\n      }\n    );\n\n    html += \"<\/div>\";\n\n    var activeTone = TONES[tone(result)];\n\n    var percentage =\n      Math.round(\n        (result.sd \/\n          (result.sd + result.need)) *\n          100\n      ) || 0;\n\n    html += '<div class=\"card\">';\n\n    html +=\n      '<p style=\"margin:0 0 10px;font-size:.85rem;color:var(--muted)\">' +\n      esc(t(\"blurb\")[result.stream]) +\n      \"<\/p>\";\n\n    html +=\n      '<span class=\"chip\" style=\"color:' +\n      activeTone[0] +\n      \";background:\" +\n      activeTone[1] +\n      '\">' +\n      t(\"status\")[tone(result)] +\n      \"<\/span>\";\n\n    html +=\n      '<div class=\"bar\"><i style=\"width:' +\n      percentage +\n      \"%;background:\" +\n      activeTone[2] +\n      '\"><\/i><\/div>';\n\n    html +=\n      '<div class=\"gaugerow\"><span>' +\n      t(\"earned\", {\n        n: result.sd\n      }) +\n      \"<\/span><span>\" +\n      (result.need > 0\n        ? t(\"need\", {\n            n: result.need\n          })\n        : t(\"reached\")) +\n      \"<\/span><\/div>\";\n\n    html +=\n      '<div class=\"reqs\"><h4>' +\n      t(\"mustTitle\") +\n      \"<\/h4>\";\n\n    result.elig\n      .filter(function (item) {\n        return item.hardGate;\n      })\n      .forEach(function (item) {\n        html +=\n          '<div class=\"req\"><span class=\"m\" style=\"background:' +\n          (item.passed\n            ? \"#10b981\"\n            : \"#e0857b\") +\n          '\">' +\n          (item.passed ? \"\u2713\" : \"\u2715\") +\n          '<\/span><span style=\"' +\n          (item.passed\n            ? \"color:var(--muted)\"\n            : \"color:#a23b2c;font-weight:600\") +\n          '\">' +\n          T[lang].elig[result.stream][\n            item.key\n          ] +\n          \"<\/span><\/div>\";\n      });\n\n    var unmet = result.elig.filter(\n      function (item) {\n        return (\n          item.hardGate && !item.passed\n        );\n      }\n    ).length;\n\n    if (unmet) {\n      html +=\n        '<div class=\"unmet\">' +\n        t(\"unmet\", {\n          n: unmet\n        }) +\n        \"<\/div>\";\n    }\n\n    html += \"<\/div>\";\n\n    var gaps = result.gaps\n      .filter(function (gap) {\n        return gap.points > 0;\n      })\n      .slice(0, 4);\n\n    if (gaps.length) {\n      html +=\n        '<div class=\"gaps\"><h4>' +\n        t(\"improveTitle\") +\n        \"<\/h4>\";\n\n      gaps.forEach(function (gap) {\n        var gapText =\n          T[lang].gap[gap.code];\n\n        var message =\n          typeof gapText === \"function\"\n            ? gapText(gap.vars || {})\n            : gapText;\n\n        html +=\n          '<div class=\"gap\"><span class=\"b\"><\/span><span>' +\n          esc(message) +\n          ' <b style=\"color:var(--good)\">' +\n          t(\"pts\", {\n            n: gap.points\n          }) +\n          \"<\/b><\/span><\/div>\";\n      });\n\n      html += \"<\/div>\";\n    }\n\n    html += \"<\/div>\";\n\n    html +=\n      '<div class=\"explain\"><h3><span class=\"i\">i<\/span>' +\n      t(\"explainT\") +\n      \"<\/h3><p>\" +\n      t(\"explainB\") +\n      \"<\/p><\/div>\";\n\n    html +=\n      '<p class=\"disc\">' +\n      t(\"disc\") +\n      \"<\/p>\";\n\n    $(\"results\").innerHTML = html;\n\n    $(\"results\")\n      .querySelectorAll(\".tabs button\")\n      .forEach(function (button) {\n        button.addEventListener(\n          \"click\",\n          function () {\n            activeTab =\n              button.getAttribute(\"data-tab\");\n\n            renderResults();\n          }\n        );\n      });\n  }\n\n  function calc() {\n    renderResults();\n  }\n\n  function applyLang() {\n    app.setAttribute(\"lang\", lang);\n    app.setAttribute(\n      \"dir\",\n      lang === \"fa\" ? \"rtl\" : \"ltr\"\n    );\n\n    $(\"c-title\").textContent = t(\"title\");\n    $(\"c-sub\").textContent = t(\"sub\");\n    $(\"c-note\").textContent = t(\"note\");\n\n    $(\"h-personal\").textContent =\n      t(\"hPersonal\");\n\n    $(\"h-exp\").textContent = t(\"hExp\");\n    $(\"h-fin\").textContent = t(\"hFin\");\n    $(\"h-biz\").textContent = t(\"hBiz\");\n    $(\"h-loc\").textContent = t(\"hLoc\");\n\n    $(\"c-footer\").textContent =\n      t(\"footer\");\n\n    app\n      .querySelectorAll(\n        \".langbar button[data-lang]\"\n      )\n      .forEach(function (button) {\n        button.classList.toggle(\n          \"on\",\n          button.getAttribute(\"data-lang\") ===\n            lang\n        );\n      });\n\n    renderForm();\n    renderResults();\n  }\n\n  var languageBar =\n    app.querySelector(\".langbar\");\n\n  if (languageBar) {\n    languageBar.addEventListener(\n      \"click\",\n      function (event) {\n        var button =\n          event.target.closest(\n            \"button[data-lang]\"\n          );\n\n        if (\n          !button ||\n          !languageBar.contains(button)\n        ) {\n          return;\n        }\n\n        lang =\n          button.getAttribute(\"data-lang\");\n\n        applyLang();\n      }\n    );\n  }\n\n  function postHeight() {\n    if (\n      window.parent &&\n      window.parent !== window\n    ) {\n      window.parent.postMessage(\n        {\n          type: \"sugimoto-tool-height\",\n          height: app.scrollHeight\n        },\n        \"*\"\n      );\n    }\n  }\n\n  try {\n    new ResizeObserver(postHeight).observe(\n      app\n    );\n  } catch (error) {}\n\n  window.addEventListener(\n    \"load\",\n    postHeight\n  );\n\n  applyLang();\n})();\n\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>BC PNP Entrepreneur Calculator Use this calculator to estimate your registration score for the BC Provincial Nominee Program\u2019s Entrepreneur Immigration stream. Your score is based on the information you enter, including your business experience, personal net worth, investment plans, job creation, and proposed business location. The result is an estimate only. If you submit a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":4746,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-4840","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v28.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>BC PNP Entrepreneur Calculator | Sugimoto Visa<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"BC PNP Entrepreneur Calculator\" \/>\n<meta property=\"og:description\" content=\"BC PNP Entrepreneur Calculator Use this calculator to estimate your registration score for the BC Provincial Nominee Program\u2019s Entrepreneur Immigration stream. Your score is based on the information you enter, including your business experience, personal net worth, investment plans, job creation, and proposed business location. The result is an estimate only. If you submit a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/\" \/>\n<meta property=\"og:site_name\" content=\"Sugimoto Visa\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/sugimotovisa\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-30T15:45:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sugimotovisa.com\/en\/wp-content\/uploads\/2025\/01\/sugimotovisa-video-cover-en.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"582\" \/>\n\t<meta property=\"og:image:height\" content=\"873\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@HamedSugimoto\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/bc-pnp-entrepreneur-calculator\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/bc-pnp-entrepreneur-calculator\\\/\"},\"author\":{\"name\":\"sugimotovisa\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#\\\/schema\\\/person\\\/2823f69a63c2a02316b23d4d16c47cd7\"},\"headline\":\"BC PNP Entrepreneur Calculator\",\"datePublished\":\"2026-07-30T15:31:03+00:00\",\"dateModified\":\"2026-07-30T15:45:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/bc-pnp-entrepreneur-calculator\\\/\"},\"wordCount\":91,\"publisher\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/bc-pnp-entrepreneur-calculator\\\/\",\"url\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/bc-pnp-entrepreneur-calculator\\\/\",\"name\":\"BC PNP Entrepreneur Calculator | Sugimoto Visa\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#website\"},\"datePublished\":\"2026-07-30T15:31:03+00:00\",\"dateModified\":\"2026-07-30T15:45:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/bc-pnp-entrepreneur-calculator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/bc-pnp-entrepreneur-calculator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/bc-pnp-entrepreneur-calculator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Free Immigration Tools\",\"item\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"BC PNP Entrepreneur Calculator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/\",\"name\":\"Sugimoto Visa\",\"description\":\"Your Immigration Solution\",\"publisher\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#organization\"},\"alternateName\":\"Sugimoto Visa\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#organization\",\"name\":\"Sugimoto Visa\",\"alternateName\":\"Sugimoto Visa\",\"url\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Sugimoto-logo-en.webp\",\"contentUrl\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Sugimoto-logo-en.webp\",\"width\":400,\"height\":68,\"caption\":\"Sugimoto Visa\"},\"image\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/sugimotovisa\\\/\",\"https:\\\/\\\/x.com\\\/HamedSugimoto\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/sugimoto-immigration\\\/\",\"https:\\\/\\\/www.instagram.com\\\/sugimotovisa\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@Sugimotovisa\"],\"description\":\"Sugimoto Visa: Your Immigration Solution. Providing expert guidance and support for your immigration journey.\",\"email\":\"info@sugimotovisa.com\",\"telephone\":\"00989105555487\",\"legalName\":\"Sugimoto Visa Inc\",\"foundingDate\":\"2021-04-16\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"51\",\"maxValue\":\"200\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#\\\/schema\\\/person\\\/2823f69a63c2a02316b23d4d16c47cd7\",\"name\":\"sugimotovisa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g\",\"caption\":\"sugimotovisa\"},\"sameAs\":[\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"BC PNP Entrepreneur Calculator | Sugimoto Visa","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/","og_locale":"en_US","og_type":"article","og_title":"BC PNP Entrepreneur Calculator","og_description":"BC PNP Entrepreneur Calculator Use this calculator to estimate your registration score for the BC Provincial Nominee Program\u2019s Entrepreneur Immigration stream. Your score is based on the information you enter, including your business experience, personal net worth, investment plans, job creation, and proposed business location. The result is an estimate only. If you submit a [&hellip;]","og_url":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/","og_site_name":"Sugimoto Visa","article_publisher":"https:\/\/www.facebook.com\/sugimotovisa\/","article_modified_time":"2026-07-30T15:45:27+00:00","og_image":[{"width":582,"height":873,"url":"https:\/\/sugimotovisa.com\/en\/wp-content\/uploads\/2025\/01\/sugimotovisa-video-cover-en.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_site":"@HamedSugimoto","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/#article","isPartOf":{"@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/"},"author":{"name":"sugimotovisa","@id":"https:\/\/sugimotovisa.com\/en\/#\/schema\/person\/2823f69a63c2a02316b23d4d16c47cd7"},"headline":"BC PNP Entrepreneur Calculator","datePublished":"2026-07-30T15:31:03+00:00","dateModified":"2026-07-30T15:45:27+00:00","mainEntityOfPage":{"@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/"},"wordCount":91,"publisher":{"@id":"https:\/\/sugimotovisa.com\/en\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/","url":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/","name":"BC PNP Entrepreneur Calculator | Sugimoto Visa","isPartOf":{"@id":"https:\/\/sugimotovisa.com\/en\/#website"},"datePublished":"2026-07-30T15:31:03+00:00","dateModified":"2026-07-30T15:45:27+00:00","breadcrumb":{"@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/bc-pnp-entrepreneur-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sugimotovisa.com\/en\/"},{"@type":"ListItem","position":2,"name":"Free Immigration Tools","item":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/"},{"@type":"ListItem","position":3,"name":"BC PNP Entrepreneur Calculator"}]},{"@type":"WebSite","@id":"https:\/\/sugimotovisa.com\/en\/#website","url":"https:\/\/sugimotovisa.com\/en\/","name":"Sugimoto Visa","description":"Your Immigration Solution","publisher":{"@id":"https:\/\/sugimotovisa.com\/en\/#organization"},"alternateName":"Sugimoto Visa","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sugimotovisa.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/sugimotovisa.com\/en\/#organization","name":"Sugimoto Visa","alternateName":"Sugimoto Visa","url":"https:\/\/sugimotovisa.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sugimotovisa.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/sugimotovisa.com\/en\/wp-content\/uploads\/2025\/01\/Sugimoto-logo-en.webp","contentUrl":"https:\/\/sugimotovisa.com\/en\/wp-content\/uploads\/2025\/01\/Sugimoto-logo-en.webp","width":400,"height":68,"caption":"Sugimoto Visa"},"image":{"@id":"https:\/\/sugimotovisa.com\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/sugimotovisa\/","https:\/\/x.com\/HamedSugimoto","https:\/\/www.linkedin.com\/company\/sugimoto-immigration\/","https:\/\/www.instagram.com\/sugimotovisa\/","https:\/\/www.youtube.com\/@Sugimotovisa"],"description":"Sugimoto Visa: Your Immigration Solution. Providing expert guidance and support for your immigration journey.","email":"info@sugimotovisa.com","telephone":"00989105555487","legalName":"Sugimoto Visa Inc","foundingDate":"2021-04-16","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"51","maxValue":"200"}},{"@type":"Person","@id":"https:\/\/sugimotovisa.com\/en\/#\/schema\/person\/2823f69a63c2a02316b23d4d16c47cd7","name":"sugimotovisa","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g","caption":"sugimotovisa"},"sameAs":["https:\/\/sugimotovisa.com\/en\/"]}]}},"_links":{"self":[{"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages\/4840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/comments?post=4840"}],"version-history":[{"count":25,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages\/4840\/revisions"}],"predecessor-version":[{"id":4866,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages\/4840\/revisions\/4866"}],"up":[{"embeddable":true,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages\/4746"}],"wp:attachment":[{"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/media?parent=4840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}