Skip to request form
MATERIAL DELIVERY + HAUL-OFF

Big loads.Simple moves.

Gravel for the driveway. Topsoil for the yard. A truck for what needs to go. Start your next project here.

Illustration of a yellow dump truck on a gravel road beside aggregate piles and green hills
FOR THE WORK AHEADBrand illustration
LET’S GET STARTED

What do you need?

Loading the request form…

Taking too long? Reload the page
THE MATERIALS THAT BUILD

Gravel / Topsoil / Fill dirt / Stone / Sand

CUSTOMER SERVICES

Explore what you can do with Imperial Logistics

Choose the service that fits your project.

Material Delivery

Get topsoil, gravel, fill dirt, or sand delivered directly to your job site.

Material Delivery: graphite dump truck with yellow bed and three rear axles

Haul-Off & Disposal

Need dirt, concrete, or debris removed? Provide the loader or skid steer on-site, and we’ll haul it away.

Haul-Off & Disposal: graphite dump truck with yellow bed and three rear axles

Hourly Truck Rental

Hire a dump truck and driver by the hour for custom site work or multiple loads.

Hourly Truck Rental: graphite dump truck with yellow bed and three rear axles

Scheduled Projects

Plan big projects in advance. Schedule recurring deliveries or site cleanups.

Schedule Project
Scheduled Projects: graphite dump truck with yellow bed and three rear axles

Pilot preview · Requests are saved for review. No real bookings or payments yet.

CUSTOMER SERVICES

Bring it in. Haul it out.

One place to plan both sides of the job.

DELIVERY

The right material. Right where you need it.

Choose your material and load count, add the delivery address, and send a request for review.

  • Gravel & stone
  • Topsoil & fill dirt
  • Sand & more
HAUL-OFF

Make room for what comes next.

Tell us what needs to leave, where it is, and how a truck can access the site.

  • Dirt & soil
  • Concrete & asphalt
  • Job-site debris
TRUCK BY THE HOUR

Your job. A truck and driver.

Choose the date, start and end times. Total hours are calculated automatically. You provide the loading site, loading equipment, and dump site. Working time starts when the truck arrives at your jobsite.

SELLER SERVICES

Sell materials. Receive loads.

One place to offer what you have and share what you need.

SELL MATERIALS

Your materials. More customers.

List the materials you have available. Add photos, price, quantity, and the loading location.

  • Gravel & stone
  • Topsoil & fill dirt
  • Sand & more
RECEIVE MATERIALS

Need fill? Let loads come to you.

Post a site where you can receive dirt or other materials. Tell us what you accept, how much you need, your hours, and the access conditions.

  • Clean fill
  • Topsoil
  • Accepted materials
Post a receiving site
BUILT AROUND REAL HAULING WORK

From the first load to the last signature, Imperial Logistics brings the job into one place.

Imperial Logistics

Material delivery. Haul-off. One place.

Early preview · No real bookings or payments.
Imperial Logistics
IMPERIAL LOGISTICS CUSTOMER ACCESS

Welcome to Imperial Logistics

Order material, request haul-off, or access your hauling dashboard.

or
Sign in or create your customer account securely in Imperial Logistics
Verified Hauler application

Hauler verification

1. Business / identity
2. Documents
Local prototype: selected documents are not uploaded anywhere.
3. Truck information
4. Review application
Submitting creates a Pending Verification profile. In production, the account cannot accept marketplace jobs until the required checks are completed.
Imperial Logistics
Imperial Logistics customer services

Built around real trucking roles

This version separates material delivery from haul-off and demonstrates private managed pricing for customers, haulers, and Platform Admin.

Customer · Phase 5

Order Material

Choose what you need, where it is going, and when you need it. We return one clear delivered price.

1
Choose materialFull loads only in this first version.
2
Delivery locationThis is where the load will be delivered.
3
When do you need it?Choose ASAP or schedule a delivery window.
4
Jobsite detailsOptional, but useful for the driver.
5
Get your delivered priceOne price for the customer. Internal supplier, hauling, and platform economics stay private.
Demo: routing and live truck availability are simulated locally for now.
Customer

Post a haul-off job

Haul-off uses a separate quote because disposal, loading, material size, and access can change the cost. You receive one platform price; haulers see only their payout.
Job details
Pickup GPS
📷 Add several photos showing the material and access
Loading & disposal
Request platform quote
There is no direct bidding with a hauler. The platform calculates the customer price and keeps hauler payout private.
Jobs

Jobs near you

SAMPLE JOB

Concrete haul-off — Brentwood, TN

Example marketplace job
$300 your payout
Loading
Customer provides equipment
Disposal
Hauler must arrange
Request Higher Payout
$
Platform Admin only

Pricing & Margin Control

Prototype privacy: these numbers are hidden from customer, owner, dispatcher, and driver screens. In this local ZIP that privacy is interface-only; production requires backend RLS.
Rule-based pricing configuration
Current job economics
Higher-payout requests
Future AI-assisted pricing — inactive
Later, AI may summarize photos or recommend a range from completed-job data. It will not set final prices or override minimum-margin rules in this prototype.
Company management

Owner, drivers & trucks

IL

Imperial Logistics

Owner / Admin

★ 5.0Owner / Admin
Pending driver requests

Drivers with Approval Required send job requests here before anything is assigned.

Drivers

The owner chooses how much authority each driver has. Permissions follow the driver, not the truck.

Add driver
Material Seller

Material & pricing

List what you have, set your material price, and keep availability current. Delivery pricing stays separate and is calculated by the platform.

SELLER PROFILE
Demo Material Supply
Verified material source
4.9 ★124 completed orders

Material listings

Prices shown here are your material-only prices.

Incoming material requests

Requests that match your listed materials and service area.
2
2 loads · TopsoilBrentwood, TN · Tomorrow · 12 PM–5 PM
Matching
1 load · Fill dirtNolensville, TN · ASAP
New
Company Owner

Earnings & Payments

PHASE 3
COMPANY EARNINGS
$0
Available company balance in this demo

Job earnings

Payouts to your company by completed or active job.

Payments & statements

See which jobs are included in each company payout.
Phase 7

Ratings & Trust

Simple ratings from completed platform jobs, plus verification and objective service history.

Phase 4

Order documents & settlement

One Order ID connects the customer receipt, load record, proof of delivery, supplier settlement, and hauler payout.

\n\n `);w.document.close()} function injectP4Links(){const o=currentOrder();if(!o||!authSession?.isDemo)return;const home=document.getElementById('roleHome');if(!home||home.querySelector('.p4-home-link'))return;if(['customer','owner','seller','platform_admin'].includes(role))home.insertAdjacentHTML('beforeend',``)} function updateOrderMaterialRuleUI(){const sel=document.getElementById('orderMaterial'),loads=document.getElementById('orderLoads');if(!sel||!loads)return;let note=document.getElementById('p4OrderRuleNote');if(!note){note=document.createElement('div');note.id='p4OrderRuleNote';note.className='phase4-load-rule';loads.closest('.field')?.appendChild(note)}const fake={kind:'material',materialKey:sel.value};if(p4LoadOnly(fake)){note.textContent=txt('Full-load pricing only for this material. No tonnage is requested or promised.','Precio por carga completa para este material. No se solicita ni promete tonelaje.')}else note.textContent=txt('Quarry material: final tonnage will come from the scale ticket after loading.','Material de cantera: el tonelaje final vendrá del ticket de báscula después de cargar.')} function updateSellerRuleUI(){const mat=document.getElementById('sellerMaterial'),unit=document.getElementById('sellerUnit'),tons=document.getElementById('sellerTonsPerLoad');if(!mat||!unit)return;const key=p4MaterialKeyFromLabel(mat.value),loadOnly=!quarryKey(key);if(loadOnly){unit.value='load';[...unit.options].forEach(o=>o.disabled=o.value!=='load');if(tons){tons.value='';tons.disabled=true;tons.placeholder=txt('Not used for load-priced material','No se usa para material por carga')}}else{[...unit.options].forEach(o=>o.disabled=false);if(tons)tons.disabled=false}} const p4BaseAccept=window.acceptCustomerQuote||acceptCustomerQuote;window.acceptCustomerQuote=acceptCustomerQuote=function(id){p4BaseAccept(id);const j=state.postedJob;if(j?.id===id&&j.quoteStatus==='accepted'){const o=createP4OrderForJob(j);pushAudit(o,'quote_accepted',txt('Customer accepted delivered price.','Cliente aceptó el precio entregado.'),authSession?.name||txt('Customer','Cliente'));saveState();renderAll()}} const p4BaseRev=window.acceptRevisedQuote||acceptRevisedQuote;window.acceptRevisedQuote=acceptRevisedQuote=function(id){p4BaseRev(id);const o=syncP4Order();if(o){o.customerPayment.amount=o.customerPrice;o.customerPayment.paidAt=now4();pushAudit(o,'price_revision_accepted',txt('Customer accepted revised delivered price.','Cliente aceptó el precio entregado revisado.'),authSession?.name||txt('Customer','Cliente'));saveState()}renderAll()} const p4BaseAcceptJob=window.acceptJob||acceptJob;window.acceptJob=acceptJob=function(id){p4BaseAcceptJob(id);const o=syncP4Order();if(o&&state.postedJob?.assignedDriverId){o.haulerAssignment.driverId=state.postedJob.assignedDriverId;pushAudit(o,'hauler_assigned',txt('Hauling job accepted by driver/company.','Trabajo de acarreo aceptado por conductor/empresa.'),currentDriver()?.name);saveState()}renderAll()} const p4BaseAssign=window.assignPostedJob||assignPostedJob;window.assignPostedJob=assignPostedJob=function(id){p4BaseAssign(id);const o=syncP4Order();if(o){o.haulerAssignment.driverId=id;pushAudit(o,'hauler_assigned',txt('Dispatcher assigned a driver to the order.','Despacho asignó un conductor al pedido.'),authSession?.name||txt('Dispatcher','Despachador'));saveState()}renderAll()} function p4StageIndex(s){return {assigned:0,at_pickup:1,loaded:2,en_route:2,delivered:3,completed:4}[s]??0} function p4DriverJobHtml(d,j){ensure13Compat();ensureV16();let p=state.v13.driverProgress[j.id]||{stage:'assigned',ticketNumber:'',tonnage:''};state.v13.driverProgress[j.id]=p;const loadState=loadFlow(j),si=p4StageIndex(p.stage),weighted=p4UsesWeight(j),o={...loadState.o,pod:loadState.l.pod};let action='';if(p.stage==='assigned')action=``;else if(p.stage==='at_pickup')action=``;else if(p.stage==='loaded')action=``;else if(p.stage==='en_route')action=``;else if(p.stage==='delivered')action=``:'';const pod=p.stage==='delivered'?`
${txt('Proof of delivery — recipient signature required','Prueba de entrega — se requiere firma del receptor')}
${o?.pod?`
✓ ${txt('Signature saved','Firma guardada')} · ${esc(o.pod.recipientName)}
`:''}
`:'';const stageText={assigned:txt('Assigned','Asignado'),at_pickup:txt('At pickup','En recogida'),loaded:txt('Loaded','Cargado'),en_route:txt('En route','En camino'),delivered:txt('At delivery','En la entrega'),completed:txt('Completed','Completado')}[p.stage]||p.stage;return `
${txt('ACTIVE ASSIGNMENT','ASIGNACIÓN ACTIVA')} · ${esc(o?.id||'')}

${esc(j.material)} · ${esc(j.amount||'')}

${esc(j.pickupAddress||'Pickup')} → ${esc(j.deliveryAddress||j.address||'Delivery')}
${stageText}${esc(d.truck)}
${[0,1,2,3].map(i=>`
`).join('')}
${ticket}${pod}
${action}
`} // Each accepted job keeps one immutable completed record per load. function loadFlow(j){ ensure13Compat();ensureV16(); const p=state.v13.driverProgress[j.id]||(state.v13.driverProgress[j.id]={stage:'assigned'}); const o=orderForJob(j.id)||createP4OrderForJob(j); if(!o.fulfillment){ const count=Number(j.loads)||Number(String(j.amount||'').match(/^\d+/)?.[0])||1; const total=Number.isInteger(count)&&count>0?count:1; o.fulfillment={version:1,total,current:0,loads:[{number:1,stage:p.stage||'assigned',ticket:o.loadRecord?structuredClone(o.loadRecord):null,pod:o.pod?structuredClone(o.pod):null,completedAt:null}]}; o.loads=total; } const f=o.fulfillment,l=f.loads[f.current]; if(!l.proofId&&!l.completedAt){l.proofId=crypto.randomUUID();l.autoTicketNumber='HM-'+l.proofId.replaceAll('-','').slice(0,12).toUpperCase();if(l.pod){l.signatureDraft=l.pod.signatureData;l.recipientDraft=l.pod.recipientName;l.pod=null;}saveState()} return {p,o,f,l}; } window.driverLoadFlow=function(){const j=currentDriver()?.assignedJob;return j?loadFlow(j):null}; function activeLoad(){if(role!=='driver')return null;const d=currentDriver(),j=d?.assignedJob;if(!j)return null;return {d,j,...loadFlow(j)}} function refreshLoad(){saveState();renderAll();showScreen('jobs')} function validTicket(x){return !!x.l.ticket?.ticketNumber&&(!p4UsesWeight(x.j)||(Number.isFinite(Number(x.l.ticket.tonnage))&&Number(x.l.ticket.tonnage)>0))} window.advanceDriverJob=function(stage){ const x=activeLoad();if(!x)return; const allowed={assigned:['at_pickup'],at_pickup:['loaded','en_route'],loaded:['en_route','delivered'],en_route:['delivered']}; if(!allowed[x.l.stage]?.includes(stage))return; const block=p4Blocking(stage);if(block){alert(block);return} if(['loaded','en_route'].includes(stage)&&!x.l.loadedAt)x.l.loadedAt=now4(); x.l.stage=stage;x.p.stage=stage;pushAudit(x.o,'load_stage',`Load ${x.l.number}: ${stage}`,x.d.name);refreshLoad(); }; window.saveDriverTicket=function(){ const x=activeLoad();if(!x||!['loaded','en_route','delivered'].includes(x.l.stage)||x.l.completedAt)return; const number=x.l.autoTicketNumber||(document.getElementById('driverTicketNumber')?.value||'').trim(); const supplierTicketNumber=(document.getElementById('p15SupplierTicket')?.value||x.l.ticket?.supplierTicketNumber||'').trim(); const weighted=p4UsesWeight(x.j),tons=Number(document.getElementById('driverTonnage')?.value); if(!number){alert(txt('Enter the ticket number.','Ingresa el número de ticket.'));return} if(weighted&&(!Number.isFinite(tons)||tons<=0)){alert(txt('Enter a scale weight greater than zero.','Ingresa un peso de báscula mayor que cero.'));return} if(x.f.loads.some(l=>l!==x.l&&l.ticket?.ticketNumber===number)){alert(txt('Each load needs its own ticket number.','Cada carga necesita su propio número de ticket.'));return} const file=document.getElementById('p4TicketPhoto')?.files?.[0]; x.l.ticket={ticketNumber:number,supplierTicketNumber,tonnage:weighted?tons:null,ticketPhotoName:file?.name||x.l.ticket?.ticketPhotoName||'',driver:x.d.name,driverId:x.d.id,truck:x.d.truck,pickup:x.j.pickupAddress||x.j.address||'',delivery:x.j.disposalAddress||x.j.deliveryAddress||x.j.address,loadedAt:x.l.ticket?.loadedAt||x.l.loadedAt||now4(),quantityMode:weighted?'weighed_quarry':'full_load',material:x.j.material}; Object.assign(x.p,{ticketNumber:number,tonnage:weighted?tons:'',ticketPhotoName:x.l.ticket.ticketPhotoName}); x.o.loadRecord=structuredClone(x.l.ticket); x.o.supplierOrder.status=x.f.loads.filter(l=>l.ticket).length===x.f.total?'ready_for_payout':'pending_pickup'; pushAudit(x.o,'ticket_saved',`Load ${x.l.number}: ${number}`,x.d.name);showStatus(txt('Load ticket saved.','Ticket de carga guardado.'));refreshLoad(); }; window.initP4Signature=function(){ const c=document.getElementById('p4SignatureCanvas'),x=activeLoad();if(!c||!x||c.dataset.bound)return; c.dataset.bound='1';const ctx=c.getContext('2d');if(!ctx)return;ctx.lineWidth=3;ctx.lineCap='round';ctx.strokeStyle='#171a18'; let draw=false,last=null,changed=false; const data=x.l.signatureDraft||x.l.pod?.signatureData; if(data){const im=new Image();im.onload=()=>{if(!changed&&c.isConnected)ctx.drawImage(im,0,0,c.width,c.height)};im.src=data} function pos(e){const r=c.getBoundingClientRect();return{x:(e.clientX-r.left)*c.width/r.width,y:(e.clientY-r.top)*c.height/r.height}} c.addEventListener('pointerdown',e=>{draw=true;last=pos(e);c.setPointerCapture?.(e.pointerId);e.preventDefault()}); c.addEventListener('pointermove',e=>{if(!draw)return;const q=pos(e);ctx.beginPath();ctx.moveTo(last.x,last.y);ctx.lineTo(q.x,q.y);ctx.stroke();last=q;changed=true;x.l.signatureDraft=c.toDataURL('image/png');e.preventDefault()}); const end=()=>{draw=false;last=null;if(changed)saveState()};c.addEventListener('pointerup',end);c.addEventListener('pointercancel',end); }; window.clearP4Signature=function(){const x=activeLoad(),c=document.getElementById('p4SignatureCanvas');if(!x||!c)return;c.getContext('2d').clearRect(0,0,c.width,c.height);x.l.signatureDraft='';x.l.pod=null;x.o.pod=null;saveState()}; window.saveP4Pod=function(){ const x=activeLoad();if(!x||x.l.stage!=='delivered')return; const name=(document.getElementById('p4RecipientName')?.value||'').trim(),data=x.l.signatureDraft||x.l.pod?.signatureData; if(!name){alert(txt('Enter the foreman or buyer name.','Ingresa el nombre del capataz o comprador.'));return} if(!data){alert(txt('Ask the recipient to sign for this load.','Pide al receptor que firme esta carga.'));return} x.l.pod={recipientName:name,signatureData:data,signedAt:now4(),driver:x.d.name,truck:x.d.truck}; // The aggregate proof is released only after the final load is completed. pushAudit(x.o,'pod_signed',`Load ${x.l.number}: ${name}`,x.d.name);refreshLoad(); }; window.completeDriverJob=function(){ const x=activeLoad();if(!x||x.l.stage!=='delivered'||x.l.completedAt)return; const block=p4Blocking('completed');if(block){alert(block);return} if(!validTicket(x)){alert(txt('Save the ticket for this load first.','Guarda primero el ticket de esta carga.'));return} if(!x.l.pod?.signatureData){alert(txt('Capture and save the recipient’s signature for this load.','Captura y guarda la firma del receptor para esta carga.'));return} if(window.deliveryProofReady&&!window.deliveryProofReady(x))return; const at=x.l.cloudCompletedAt||now4(),total=Number(x.j.haulerPayout||x.j.offer||0),cents=Math.round(total*100),base=Math.floor(cents/x.f.total); x.l.completedAt=at;x.l.stage='completed';delete x.l.signatureDraft; if(!state.v13.completedLoads.some(l=>l.jobId===x.j.id&&l.loadNumber===x.l.number))state.v13.completedLoads.push({jobId:x.j.id,orderId:x.o.id,loadNumber:x.l.number,driverId:x.d.id,driver:x.d.name,truck:x.d.truck,...x.l.ticket,proofId:x.l.proofId,deliveryPhoto:x.l.deliveryPhoto,pod:structuredClone(x.l.pod),payout:(x.l.number===x.f.total?cents-base*(x.f.total-1):base)/100,completedAt:at}); pushAudit(x.o,'load_completed',`Load ${x.l.number} of ${x.f.total}`,x.d.name); if(x.f.current+1v.jobId===x.o.id))state.v15.ledger.unshift({id:'p4-'+x.o.id,jobId:x.o.id,date:at.slice(0,10),material:x.o.material,loads:x.f.total,driver:x.d.name,truck:x.d.truck,payout:x.o.haulerAssignment.amount,status:'available',ticket:x.f.loads.map(l=>l.ticket.ticketNumber).join(', ')}); if(state.postedJob?.id===x.j.id)state.postedJob.status='completed'; if(state.v22?.jobSnapshots?.[x.j.id])state.v22.jobSnapshots[x.j.id].status='completed'; x.d.assignedJob=null;window.handoffReleaseTruck?.(x.j.id,at);saveState();showStatus(txt('All loads completed. Delivery records are ready.','Todas las cargas completadas. Los comprobantes de entrega están listos.'));renderAll();showScreen('home'); }; const p4PrevPosted=renderPostedJob;renderPostedJob=function(){ensureV16();if(role==='driver'){const d=currentDriver();if(d.assignedJob){sampleJob.style.display='none';liveJob.innerHTML=p4DriverJobHtml(d,d.assignedJob);setTimeout(initP4Signature,0);return}}p4PrevPosted()} const p4PrevJobs=renderJobs;renderJobs=function(){ensureV16();p4PrevJobs();if(role==='driver'){const d=currentDriver();if(d.assignedJob){sampleJob.style.display='none';liveJob.innerHTML=p4DriverJobHtml(d,d.assignedJob);setTimeout(initP4Signature,0)}}} const p4PrevRoleHome=renderRoleHome;renderRoleHome=function(){ensureV16();p4PrevRoleHome();injectP4Links()} const p4PrevAll=renderAll;renderAll=function(){ensureV16();p4PrevAll();updateOrderMaterialRuleUI();updateSellerRuleUI();renderP4Settlement();injectP4Links()} const p4PrevShow=showScreen;showScreen=function(id){p4PrevShow(id);if(id==='settlement')renderP4Settlement();if(id==='order')updateOrderMaterialRuleUI();if(id==='seller')updateSellerRuleUI()} document.getElementById('orderMaterial')?.addEventListener('change',updateOrderMaterialRuleUI);document.getElementById('sellerMaterial')?.addEventListener('change',updateSellerRuleUI); ensureV16();if(state.postedJob?.kind==='material'&&state.postedJob.quoteStatus==='accepted'&&!state.v16.orders.some(o=>o.jobId===state.postedJob.id))createP4OrderForJob(state.postedJob,true);renderAll(); })();