const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)Software automotor que por fin va a tu ritmo.
MotorHub AI reúne inventario, publicaciones, leads y precios en una sola plataforma rápida y asistida por IA, para que tu equipo pase menos tiempo peleando con el software y más tiempo vendiendo.


const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)//SEQUENCE: 01 → 02 → 03//SETUP_TIME: MINUTES
Cómo funciona
Simple para empezar. Hecho para escalar.
01
Conectá tu inventario
Traé tus publicaciones e inventario actuales a MotorHub en minutos.
02
Dejá que la IA haga el trabajo pesado
Sugerencias de precio, seguimiento de leads y tareas diarias corren en segundo plano.
03
Vendé más rápido
Tu equipo dedica menos tiempo a gestionar software y más a cerrar operaciones.
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)
const inventory = await db.vehicles.findMany({
where: { status: "active", dealerId },
include: { pricing: true, listings: true },
})
export function suggestPrice(vin: string) {
const comps = market.lookup(vin, { radius: 50 })
const median = percentile(comps.map(c => c.price), 50)
return clamp(median * demandFactor(vin), floor, ceiling)
}
sync.channels.forEach((channel) => {
queue.push({ type: "listing.upsert", channel, vin })
})
if (lead.score > 0.72 && !lead.contactedAt) {
await followUp.schedule(lead.id, { in: "2h" })
}
type Vehicle = {
vin: string
make: string
model: string
year: number
mileage: number
price: Money
}
router.get("/api/inventory/:id", async (req, res) => {
const vehicle = await getVehicle(req.params.id)
if (!vehicle) return res.status(404).end()
res.json(serialize(vehicle))
})
const pipeline = [normalize, dedupe, enrich, index]
await pipeline.reduce((acc, fn) => fn(acc), rawFeed)
metrics.record("listing.sync.duration", Date.now() - t0)STATUS: TRUSTED_BY_DEALERSREGION: US
Confianza y respaldo
Hecho para negocios automotores, no software B2B genérico
MotorHub AI está diseñado específicamente en torno a cómo trabajan día a día los equipos del rubro automotor, desde un único local de usados hasta grupos con varias sucursales.
La eligen concesionarias en todo Estados Unidos

¿Listo para dejar atrás el software heredado?
Conocé MotorHub AI en acción y descubrí en cuánto tiempo podría estar operativo tu equipo.