You rely on Transfinder to keep your transportation operation moving. With rising costs, driver shortages, and tight budgets, finding new ways to work smarter has never mattered more.
Transfinder Connect brings transportation leaders together in your region to explore software capabilities, share ideas, and find new ways to improve your operation.
Transfinder HQ · Schenectady, NY
1
Step one
Register
Save your seat at a Transfinder Connect event near you.
Uncover features and capabilities you may not use today.
Improve operational efficiency
Streamline processes, reach valuable information, and make more informed decisions.
Address today's challenges
Make the most of your department's time, staff, and resources.
Connect with your peers
Trade ideas with leaders who understand the challenges you face.
From the makers
Explore every tool your district has available
From the makers of the industry's leading routing solution, the driver app, the parent app, and more. Connect sessions explore opportunities across all our technology solutions.
// document.querySelector(s);
const esc = s => String(s).replace(/[&<>"]/g, c => ({'&':'&','<':'<','>':'>','"':'"'}[c]));
const store = {
get(k){try{return JSON.parse(localStorage.getItem(k))}catch(e){return null}},
set(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
};
/* ---------- registration link ---------- */
$('#regBtn').href=REGISTER_URL;
/* ---------- assessment ---------- */
const PILLARS=[
{k:'people', n:'People', s:'Leadership, training, adoption'},
{k:'process',n:'Process', s:'Routing, requests, inspections'},
{k:'tech', n:'Technology', s:'Data, integration, tools'},
{k:'exec', n:'Execution', s:'Insight, decisions, results'},
];
/* x = what to explore at Connect when the rating is low; pr = the product it lives in */
const Q=[
{p:'people', q:'Leaders have access to and visibility into shared goals and metrics.', h:'For example: on-time arrival, cost per mile, and ridership, all in one place.', x:'Goals on a live dashboard', pr:'Routefinder PLUS'},
{p:'people', q:'New staff follow a set training path to learn our Transfinder tools.', h:'Not just shadowing a coworker.', x:'Online course paths', pr:'Training'},
{p:'people', q:'Staff know where to find help and adopt new features quickly.', h:'Help center, webinars, Q&As, release notes.', x:'Webinars and release previews', pr:'Training'},
{p:'people', q:'Principals, office staff, and families get bus information without calling us.', h:'Live bus status, ETAs, rosters.', x:'District access and parent alerts', pr:'Viewfinder + Stopfinder'},
{p:'process',q:'Our routing process is built into our software, so new staff can easily follow and use it.', h:'The steps, rules, and settings live in the system, not in one person\'s head.', x:'Routing workflows in the software', pr:'Routefinder PLUS'},
{p:'process',q:'We use optimization to cut miles, fuel, and driver hours.', h:'Not only routing by hand.', x:'Optimization tools', pr:'Routefinder PLUS'},
{p:'process',q:'Field trip and service requests move through a digital approval workflow.', h:'Requests, approvals, drivers, vehicles.', x:'Field trip approvals', pr:'Tripfinder'},
{p:'process',q:'Vehicle inspections go digitally from the driver to maintenance.', h:'Pre-trip and post-trip, no paper.', x:'Digital inspections', pr:'Wayfinder + Servicefinder'},
{p:'tech', q:'Our student, stop, and vehicle data is clean, current, and complete.', h:'You trust what you see on screen.', x:'Data cleanup and SIS sync', pr:'Routefinder PLUS'},
{p:'tech', q:'Our Transfinder products and student information system share data automatically.', h:'No double entry between systems.', x:'Integrations', pr:'Complete solution'},
{p:'tech', q:'We keep district-specific data in the system, not in side spreadsheets.', h:'For example: staff certifications and vehicle registrations.', x:'User Defined Fields', pr:'Routefinder PLUS'},
{p:'tech', q:'Drivers get spoken turn-by-turn route directions, and we track ridership digitally.', h:'Key for substitute drivers and new hires.', x:'Spoken directions and digital ridership', pr:'Wayfinder'},
{p:'exec', q:'Leaders trust our dashboards and reports to make decisions.', h:'Live numbers, not hand-built exports.', x:'Custom Dashboards and Reports', pr:'Routefinder PLUS'},
{p:'exec', q:'We can answer "what if" questions fast.', h:'For example: fewer drivers or new bell times.', x:'Scenario modeling', pr:'Routefinder PLUS'},
{p:'exec', q:'Our team uses the full feature set of the Transfinder tools we already own.', h:'Not just the basics we set up on day one.', x:'Feature review with an expert', pr:'Connect sessions'},
{p:'exec', q:'Our data leads to action, not just reports.', h:'Someone owns each number and acts on it.', x:'Scheduled reports and alerts', pr:'Routefinder PLUS'},
];
const SCALE=['Never','Sometimes','Often','Always'];
const LEVELS=[
{min:1, n:'Getting started', t:'You have room to grow in many areas. Connect gives you a clear place to start.'},
{min:1.75,n:'Building', t:'You have the basics in place. Now connect your tools and fill the gaps.'},
{min:2.5, n:'Established', t:'Your team uses the platform well. Learn the deeper features top districts use.'},
{min:3.25,n:'Leading', t:'You set the pace. Come share your story and see what comes next.'},
];
const COLOR=v=>v>=3.25?'var(--green)':v>=2.5?'var(--navy)':v>=1.75?'var(--orange)':'var(--red)';
let ans=store.get('tc-ans');
if(!Array.isArray(ans)||ans.length!==Q.length) ans=Q.map(()=>null);
let qi=Math.max(0,ans.findIndex(v=>v==null));
let showResults=ans.every(v=>v!=null);
const answered=()=>ans.filter(v=>v!=null).length;
const complete=()=>answered()===Q.length;
const avg=list=>list.reduce((a,b)=>a+b,0)/list.length;
const pillarAvg=k=>avg(Q.map((q,i)=>q.p===k?ans[i]:null).filter(v=>v!=null));
const levelOf=v=>{let l=LEVELS[0];LEVELS.forEach(x=>{if(v>=x.min)l=x});return l};
const pil=k=>PILLARS.find(p=>p.k===k);
const nextOpen=()=>{const n=ans.findIndex((v,i)=>v==null&&i>qi);return n>=0?n:ans.findIndex(v=>v==null)};
function renderTabs(){
$('#tabs').innerHTML=PILLARS.map(p=>{
const idx=Q.map((q,i)=>q.p===p.k?i:-1).filter(i=>i>=0);
const done=idx.filter(i=>ans[i]!=null).length;
const cur=!showResults&&Q[qi].p===p.k;
return ``;
}).join('');
$('#tabs').querySelectorAll('.tab').forEach(b=>b.addEventListener('click',()=>{showResults=false;qi=+b.dataset.i;render()}));
}
function renderQuestion(){
const q=Q[qi];
$('#qbody').innerHTML=`
${pil(q.p).n}Question ${qi+1} of ${Q.length}
${esc(q.q)}
${esc(q.h)}
${SCALE.map((l,i)=>``).join('')}
${Q.map((_,i)=>``).join('')}
${answered()} of ${Q.length} answered${answered()?' · ':''}