Fill an Internal Referral in BNI Connect Global

Site bniconnectglobal.comTask submit-internal-referralVersion v6Updated Aug 13, 2026Category browser-automation

Open BNI Connect Global's authenticated internal-referral form, select a recipient by exact name, safely fill referral fields, and submit only with explicit confirmation and verified success. This skill was captured from a live agent session on bniconnectglobal.com and publishes here verbatim, exactly as an agent receives it.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

Purpose

Fill an authenticated BNI Connect Global internal referral for {recipient-name}, optionally including {referral-name}, {referral-type}, {card-given}, {phone}, and {comment}. Verify all populated values. If submission is explicitly requested and confirmed, activate only the qualified form action and verify visible post-submit evidence.

When to Use

Use when a caller wants to populate or submit an internal referral to a BNI member. This is distinct from TYFCB, One-to-One, and read-only cross-chapter lookup workflows. Credentials and transient session identifiers are runtime-only.

Workflow

  1. If authentication is required, navigate directly to https://www.bniconnectglobal.com/login, fill input[name="username"] and input[name="password"] with runtime credentials, activate button[type="submit"], and wait for the authenticated /web/ portal. Never retain or expose credentials or a ;jsessionid.
  2. No stable direct internal-referral URL is known. On the authenticated dashboard, activate only the visible exact 提交 control whose nearby container contains 提供引薦, excluding containers containing 交易金額, Submit TYFCB, 一對一, 一对一, One-to-One, 1-2-1, or 分會教育. Wait for the rendered form or dialog.
  3. Open the visible recipient .MuiSelect-select or [role="combobox"] by dispatching bubbling mousedown, calling click(), and waiting for ul[role="listbox"] > li[role="option"].
  4. Run the exact-option evaluator below with {recipient-name} and select=true. Select only a non-disabled option whose normalized visible text exactly equals the requested name; never use a fixed ordinal.
  5. Run the fill-and-verify evaluator below with the requested placeholders. It uses React-safe native value setters, selects input[name="referralType"][value="INSIDE"] when requested, and checks input[type="checkbox"][name="cardGiven"] when requested.
  6. Confirm matches and allMatch. For a fill-only request, do not activate any 提交, Save, or other action control.
  7. For an explicitly confirmed submission, re-identify the verified dialog/form, confirm every requested value and an enabled action control within that same form, and activate only that context-qualified action. Never use a positional selector such as :nth-of-type(...) or click an arbitrary dashboard 提交 control.
  8. After activation, wait for a visible success message, confirmation banner, refreshed form, or other result state. Run the submission-result evaluator below and reread relevant fields when possible. Modal closure or navigation alone is not proof of submission.

Exact recipient selector and verifier:

((recipientName = "", select = false) => {
  const v = (e) =>
      !!e && (e.offsetWidth || e.offsetHeight || e.getClientRects().length),
    c = (s) => (s || "").replace(/\s+/g, " ").trim(),
    q = c(recipientName).toLocaleLowerCase(),
    els = [
      ...document.querySelectorAll('ul[role="listbox"] > li[role="option"]'),
    ].filter(v),
    opts = els.map((e, i) => ({
      index: i,
      position: i + 1,
      text: c(e.innerText || e.textContent),
      value: e.getAttribute("data-value") || e.getAttribute("value") || null,
      disabled:
        e.getAttribute("aria-disabled") === "true" ||
        e.classList.contains("Mui-disabled"),
      selected: e.getAttribute("aria-selected") === "true",
    })),
    matches = opts.filter((x) => x.text.toLocaleLowerCase() === q),
    chosen = matches.find((x) => !x.disabled);
  if (select && chosen) els[chosen.index].click();
  return {
    query: recipientName,
    optionCount: opts.length,
    matches,
    selected: !!(select && chosen),
    reason: select && !chosen ? "exact enabled recipient option not found" : null,
  };
})("{recipient-name}", true);

Fill-and-verify evaluator:

((expected={})=>{const c=s=>(s||'').replace(/\s+/g,' ').trim(),v=e=>!!e&&(e.offsetWidth||e.offsetHeight||e.getClientRects().length),r=document.querySelector('div[role="dialog"]')||document,set=(e,val)=>{if(!e)return;const p=e.tagName==='TEXTAREA'?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,s=Object.getOwnPropertyDescriptor(p,'value')?.set;if(s)s.call(e,val);else e.value=val;e.dispatchEvent(new Event('input',{bubbles:true}));e.dispatchEvent(new Event('change',{bubbles:true}))},ctx=e=>c(e.closest('.MuiFormControl-root,.MuiFormControl,fieldset,form,div')?.innerText||''),all=[...r.querySelectorAll('input,textarea,select,[role="combobox"],.MuiSelect-select')].filter(v),find=re=>all.find(e=>re.test([e.getAttribute('aria-label'),e.getAttribute('name'),e.getAttribute('placeholder'),ctx(e)].filter(Boolean).join(' '))),val=e=>c(e?.value??e?.innerText??e?.textContent),recipient=all.find(e=>e.matches('.MuiSelect-select,[role="combobox"]'))||find(/recipient|member|會員|成員|對象|對方/i),name=find(/referral.?name|姓名|會員姓名|contact/i)||all.filter(e=>e.tagName==='INPUT'&&e.type!=='radio'&&e.type!=='checkbox')[0],phone=find(/phone|電話|mobile|手機/i)||all.filter(e=>e.tagName==='INPUT'&&e.type!=='radio'&&e.type!=='checkbox')[1],type=find(/referralType|referral type|引薦類型|類型/i),card=find(/cardGiven|card given|名片|卡片/i),comment=find(/comment|remark|備註|留言|內容/i)||[...r.querySelectorAll('textarea')].find(v),inside=r.querySelector('input[type="radio"][name="referralType"][value="INSIDE"]');if(expected.referralName!=null)set(name,expected.referralName);if(expected.phone!=null)set(phone,expected.phone);if(expected.comment!=null)set(comment,expected.comment);if(inside&&String(expected.referralType||'').toUpperCase()==='INSIDE'&&!inside.checked)inside.click();if(card&&typeof expected.cardGiven==='boolean'&&card.checked!==expected.cardGiven)card.click();const actual={recipient:val(recipient)||null,referralName:val(name)||null,phone:val(phone)||null,referralType:inside?.checked?'INSIDE':(type?val(type):null),cardGiven:card?!!card.checked:null,comment:val(comment)||null},matches=Object.fromEntries(Object.entries(expected).filter(([,x])=>x!=null).map(([k,x])=>[k,k==='cardGiven'?actual[k]===x:actual[k]===c(x)]));return{actual,matches,allMatch:Object.values(matches).every(Boolean),formText:c(r.innerText||r.textContent).slice(0,3000)}})({recipient:'{recipient-name}',referralName:'{referral-name}',referralType:'{referral-type}',cardGiven:{card-given},phone:'{phone}',comment:'{comment}'})

Submission-result evaluator:

(() => {
  const c = (s) => (s || "").replace(/\s+/g, " ").trim(),
    v = (e) => !!e && (e.offsetWidth || e.offsetHeight || e.getClientRects().length),
    root = document.querySelector('div[role="dialog"]') || document,
    t = c(document.body?.innerText || document.body?.textContent),
    success =
      /success|submitted|saved|completed|成功|已提交|提交成功|儲存成功|保存成功/i.test(
        t,
      ),
    e = [...root.querySelectorAll('button,[role="button"],input[type="submit"]')]
      .filter(v)
      .map((x) => ({
        label: c(
          x.innerText || x.textContent || x.value || x.getAttribute("aria-label"),
        ),
        disabled: !!x.disabled,
      }));
  return {
    url: location.href,
    dialogPresent: !!document.querySelector('div[role="dialog"]'),
    success,
    visibleText: t.slice(0, 4000),
    controls: e,
  };
})();

Site-Specific Gotchas

  • The internal-referral form has no stable direct URL in the observed installation; use the context-qualified dashboard 提交 control associated with 提供引薦.
  • The dashboard has other 提交 controls for TYFCB, One-to-One, and chapter education. Never select one by DOM index or generic label.
  • The recipient picker is Material UI and options are rendered only after the bubbling mousedown/click sequence and a wait for the listbox.
  • Recipient ordinals vary between sessions. Require exact normalized visible text and reject disabled options.
  • Observed referral fields included input.MuiOutlinedInput-input, input[name="referralType"][value="INSIDE"], input[type="checkbox"][name="cardGiven"], and a non-read-only textarea. Prefer names and nearby labels/context over global indexes.
  • React-controlled inputs require the native prototype value setter plus bubbling input and change events.
  • For submission, qualify the action within the verified referral form. A positional button selector, modal disappearance, or navigation alone is insufficient evidence.
  • Authentication may append a transient ;jsessionid=... to /web/; preserve the session but never hard-code or expose it. Keep usernames, passwords, cookies, and session URLs runtime-only.

Expected Output

Return whether authentication and the context-qualified form opened, the recipient option count, exact recipient match and selection state, the actual populated referral fields, matches, and allMatch. For fill-only requests, state that no submission was attempted. For confirmed submissions, additionally return the qualified action, visible success evidence, post-submit state, and verification result. Never claim submission without verified success or result evidence.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=bniconnectglobal.com&task=submit-internal-referral