same-day-delivery

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Same-Day Delivery

当日配送

Overview

概述

Same-day local delivery requires three things working together: a way for customers to select a delivery time slot at checkout, a way for you to dispatch orders to drivers, and a way to communicate delivery status back to customers. For most merchants, third-party last-mile services (DoorDash Drive, Uber Direct, Onfleet) are the fastest path to same-day delivery — they handle driver logistics so you focus on operations.
当日本地配送需要三个环节协同运作:让客户在结账时选择配送时段的方式、向司机分配订单的方式,以及向客户反馈配送状态的方式。对于大多数商家而言,第三方最后一公里服务(DoorDash Drive、Uber Direct、Onfleet)是实现当日配送的最快途径——它们负责司机物流管理,让您可以专注于运营。

When to Use This Skill

何时使用该技能

  • When launching a same-day or next-hour delivery service in a defined geographic area
  • When allowing customers to select a preferred delivery window at checkout
  • When building a driver dispatch dashboard that shows outstanding orders and optimizes routes
  • When integrating with a third-party last-mile courier (DoorDash Drive, Uber Direct, Onfleet)
  • When managing capacity limits per time slot to prevent over-committing delivery resources
  • 在特定地理区域推出当日或1小时内送达的配送服务时
  • 允许客户在结账时选择偏好的配送时段时
  • 构建显示待处理订单并优化路线的司机调度仪表盘时
  • 与第三方最后一公里快递公司(DoorDash Drive、Uber Direct、Onfleet)集成时
  • 管理每个时段的运力限制,避免过度承诺配送资源时

Core Instructions

核心操作步骤

Step 1: Determine your platform and delivery model

步骤1:确定您的平台和配送模式

PlatformRecommended ToolWhy
ShopifyLocal Delivery by Zapiet + DoorDash Drive or Uber DirectZapiet handles time-slot booking at checkout; DoorDash Drive / Uber Direct dispatch drivers automatically
WooCommerceWooCommerce Local Pickup Plus + Onfleet or your own driversLocal Pickup Plus handles zones and time slots; Onfleet provides driver dispatch and tracking
BigCommerceZapiet Delivery + Onfleet or Dispatch ScienceZapiet and similar apps add delivery scheduling; Dispatch Science optimizes routes
Custom / HeadlessBuild time-slot booking + integrate Onfleet/DoorDash Drive API for dispatchFull control over zone management, slot capacity, and driver routing
Choose your delivery model first:
  • Your own drivers: You control quality and cost but must manage driver availability, vehicles, and routing. Best for: florists, grocery, restaurants with a regular local customer base.
  • On-demand couriers (DoorDash Drive, Uber Direct): Drivers appear on demand with no fixed cost. Best for: merchants who need occasional same-day delivery without committing to a driver fleet.
  • Hybrid: Your drivers for scheduled slots; on-demand couriers for rush orders.
平台推荐工具原因
ShopifyLocal Delivery by Zapiet + DoorDash Drive 或 Uber DirectZapiet负责结账时的时段预订;DoorDash Drive / Uber Direct自动调度司机
WooCommerceWooCommerce Local Pickup Plus + Onfleet 或自有司机团队Local Pickup Plus负责区域和时段管理;Onfleet提供司机调度和追踪功能
BigCommerceZapiet Delivery + Onfleet 或 Dispatch ScienceZapiet及同类应用添加配送排期功能;Dispatch Science优化路线
自定义/无头电商搭建时段预订功能 + 集成Onfleet/DoorDash Drive API实现调度完全掌控区域管理、时段运力和司机路线规划
先选择您的配送模式:
  • 自有司机团队:您掌控服务质量和成本,但必须管理司机可用性、车辆和路线规划。最适合:花店、杂货店、拥有稳定本地客户群的餐厅。
  • 按需快递(DoorDash Drive、Uber Direct):司机按需接单,无固定成本。最适合:需要偶尔提供当日配送但不想组建司机团队的商家。
  • 混合模式:自有司机负责预订时段的订单;按需快递处理高峰订单。

Step 2: Set up delivery zones and time slot booking

步骤2:设置配送区域和时段预订

Shopify

Shopify

Using Zapiet — Pickup + Delivery (the most feature-complete app):
  1. Install Zapiet — Pickup + Delivery from the Shopify App Store
  2. In Zapiet, go to Delivery → Zones and define your delivery coverage area by:
    • Postal/ZIP codes (simplest): list all ZIP codes you deliver to
    • Radius from your store address
    • Custom drawn polygon (requires higher Zapiet plan)
  3. Set up time slots in Delivery → Time Slots:
    • Define daily windows (e.g., 10am–12pm, 12pm–2pm, 2pm–4pm, 4pm–6pm)
    • Set capacity per slot (e.g., max 20 orders per 2-hour window)
    • Set the order cutoff time for each slot (e.g., orders for the 2pm–4pm slot must be placed by 12pm)
  4. Set delivery fees per zone in Delivery → Rates (can be distance-based or flat)
  5. Customers see available time slots during Shopify checkout after entering their address
Order management in Zapiet:
  • Go to Zapiet → Orders to see all delivery orders sorted by time slot
  • Export the pick list and manifest for your drivers from this view
  • Mark orders as "out for delivery" and "delivered" to update customers
使用Zapiet — Pickup + Delivery(功能最完善的应用):
  1. 从Shopify应用商店安装Zapiet — Pickup + Delivery
  2. 在Zapiet中,进入Delivery → Zones,通过以下方式定义您的配送覆盖区域:
    • 邮政编码(最简单):列出所有您提供配送服务的邮政编码
    • 以店铺地址为中心的配送半径
    • 自定义绘制区域(需要Zapiet高级套餐)
  3. Delivery → Time Slots中设置时段:
    • 定义每日时段窗口(例如:10am–12pm、12pm–2pm、2pm–4pm、4pm–6pm)
    • 设置每个时段的运力(例如:每2小时窗口最多20个订单)
    • 设置每个时段的订单截止时间(例如:2pm–4pm时段的订单必须在12pm前下单)
  4. Delivery → Rates中设置各区域的配送费用(可基于距离或固定费用)
  5. 客户在Shopify结账时输入地址后,即可看到可用的配送时段
Zapiet中的订单管理:
  • 进入Zapiet → Orders,查看按时段排序的所有配送订单
  • 从此视图导出拣货清单和配送清单供司机使用
  • 将订单标记为“配送中”和“已送达”以更新客户状态

WooCommerce

WooCommerce

Using WooCommerce Local Pickup Plus (WooCommerce.com official extension):
  1. Install Local Pickup Plus from WooCommerce.com
  2. Go to WooCommerce → Settings → Shipping → Local Pickup Plus
  3. Add pickup/delivery locations — for delivery, define your service area by postal code or radius
  4. Enable "Delivery date & time selection" to let customers pick slots
  5. Configure time slots and capacity in the plugin settings
For more advanced zone management: use the Flexible Shipping plugin or WooCommerce Table Rate Shipping to create delivery rates based on postal code matching.
For driver dispatch: use Onfleet (onfleet.com) which has a WooCommerce webhook integration — new delivery orders automatically appear in Onfleet for driver assignment.
使用WooCommerce Local Pickup Plus(WooCommerce官方扩展):
  1. 从WooCommerce.com安装Local Pickup Plus
  2. 进入WooCommerce → 设置 → 配送 → Local Pickup Plus
  3. 添加取货/配送地点——对于配送服务,通过邮政编码或半径定义服务区域
  4. 启用“配送日期和时间选择”,让客户选择时段
  5. 在插件设置中配置时段和运力
如需更高级的区域管理: 使用Flexible Shipping插件或WooCommerce Table Rate Shipping,基于邮政编码匹配创建配送费率。
司机调度: 使用Onfleet(onfleet.com),它与WooCommerce有webhook集成——新的配送订单会自动出现在Onfleet中供分配给司机。

BigCommerce

BigCommerce

Using Zapiet on BigCommerce:
  1. Install Zapiet from the BigCommerce App Marketplace
  2. Same configuration as the Shopify workflow above — define zones, time slots, and capacity
Using ShipperHQ:
  • ShipperHQ has local delivery zones and time-window restrictions built in
  • Go to ShipperHQ → Carrier Manager → Add Local Delivery carrier and define your zone rules
在BigCommerce上使用Zapiet:
  1. 从BigCommerce应用市场安装Zapiet
  2. 配置流程与Shopify相同——定义区域、时段和运力
使用ShipperHQ:
  • ShipperHQ内置本地配送区域和时间窗口限制功能
  • 进入ShipperHQ → 承运人管理 → 添加本地配送承运人并定义区域规则

Step 3: Connect to a driver dispatch platform

步骤3:连接司机调度平台

Using DoorDash Drive (on-demand, no fixed driver costs)

使用DoorDash Drive(按需模式,无固定司机成本)

DoorDash Drive sends DoorDash gig-economy drivers to pick up and deliver your orders. Available in most major US cities.
  1. Sign up at developer.doordash.com/portal for a DoorDash Drive API key
  2. For Shopify: install DoorDash Drive from the Shopify App Store — it creates a DoorDash delivery automatically when you mark an order for dispatch
  3. DoorDash notifies the customer with a real-time tracking link via SMS
  4. You pay per delivery (typically $7–$15 depending on distance)
DoorDash Drive会安排DoorDash零工经济司机取货并配送您的订单。在美国大多数主要城市可用。
  1. 在developer.doordash.com/portal注册以获取DoorDash Drive API密钥
  2. 对于Shopify:从Shopify应用商店安装DoorDash Drive——当您标记订单待调度时,它会自动创建DoorDash配送任务
  3. DoorDash通过短信向客户发送实时追踪链接
  4. 您按次支付配送费用(通常根据距离为7-15美元)

Using Uber Direct (on-demand)

使用Uber Direct(按需模式)

Similar to DoorDash Drive — Uber Direct uses Uber drivers for local delivery.
  1. Sign up at developer.uber.com/products/uber-direct
  2. Install the Uber Direct app if available for your platform, or use the REST API
  3. Create a delivery by sending the pickup address (your store) and drop-off address (customer) to the Uber Direct API
与DoorDash Drive类似——Uber Direct使用Uber司机进行本地配送。
  1. 在developer.uber.com/products/uber-direct注册
  2. 如果您的平台有可用的Uber Direct应用则安装,否则使用REST API
  3. 通过向Uber Direct API发送取货地址(您的店铺)和送货地址(客户)来创建配送任务

Using Onfleet (your own drivers + route optimization)

使用Onfleet(自有司机团队 + 路线优化)

Best if you have your own delivery team and need route optimization and real-time tracking.
  1. Sign up at onfleet.com (starts at $349/month for up to 3 drivers)
  2. Install the WooCommerce webhook integration or use Zapier to connect your platform to Onfleet
  3. New orders auto-create Onfleet tasks
  4. Dispatchers assign tasks to drivers in the Onfleet web dashboard
  5. Drivers get a mobile app with turn-by-turn navigation and proof-of-delivery photo capture
  6. Customers receive an SMS with a real-time tracking link when the driver starts their route
最适合拥有自有配送团队且需要路线优化和实时追踪的商家。
  1. 在onfleet.com注册(最多3名司机的套餐起价为每月349美元)
  2. 安装WooCommerce webhook集成或使用Zapier将您的平台连接到Onfleet
  3. 新订单会自动创建Onfleet任务
  4. 调度员在Onfleet网页仪表板中将任务分配给司机
  5. 司机使用带有逐向导航和交付证明照片拍摄功能的移动应用
  6. 当司机开始配送路线时,客户会收到包含实时追踪链接的短信

Step 4: Handle edge cases

步骤4:处理边缘情况

Slot fills up after customer views it:
  • Most apps (Zapiet, Onfleet scheduling) use real-time slot availability checks at checkout
  • Enable slot capacity enforcement in your app settings to prevent overbooking
Address outside delivery zone:
  • Zapiet checks the delivery zone before showing time slots — if the address is outside your zone, delivery options are hidden and only pickup/standard shipping shows
  • Test this thoroughly with addresses near your zone boundary before going live
Driver can't fulfill an order:
  • For DoorDash Drive / Uber Direct: the platform automatically reassigns to another driver
  • For your own drivers (Onfleet): the dispatcher must manually reassign in the dashboard; set up Onfleet alerts for unassigned tasks approaching their slot window
Cutoff time management:
  • Set your order cutoff 2–3 hours before the delivery window to give time for picking, packing, and loading
  • Zapiet automatically hides time slots that have passed their cutoff
客户查看时段后该时段已满:
  • 大多数应用(Zapiet、Onfleet排期)在结账时使用实时时段可用性检查
  • 在应用设置中启用时段运力限制,防止超额预订
地址超出配送区域:
  • Zapiet在显示时段前会检查配送区域——如果地址超出您的区域,配送选项会隐藏,仅显示取货/标准配送选项
  • 上线前务必使用区域边界附近的地址进行全面测试
司机无法完成订单:
  • 对于DoorDash Drive / Uber Direct:平台会自动将订单重新分配给其他司机
  • 对于自有司机团队(Onfleet):调度员必须在仪表板中手动重新分配;设置Onfleet警报,提醒接近时段窗口的未分配任务
截止时间管理:
  • 将订单截止时间设置在配送窗口开始前2-3小时,以便留出拣货、打包和装车时间
  • Zapiet会自动隐藏已过截止时间的时段

Step 5: Custom / Headless Implementation

步骤5:自定义/无头电商实现

For headless stores that need full control over zone management and slot booking:
typescript
// Check if a customer address is in a delivery zone
async function checkDeliveryEligibility(params: {
  customerZip: string;
  deliveryZones: { name: string; zipCodes: string[]; deliveryFeeCents: number }[];
}): Promise<{ eligible: boolean; zone?: string; feeCents?: number }> {
  const zone = params.deliveryZones.find(z => z.zipCodes.includes(params.customerZip));
  if (!zone) return { eligible: false };
  return { eligible: true, zone: zone.name, feeCents: zone.deliveryFeeCents };
}

// Get available time slots for today (slots with remaining capacity)
async function getAvailableSlots(params: {
  date: Date;
  zone: string;
  slots: { id: string; label: string; capacity: number; booked: number; cutoffTime: Date }[];
}): Promise<{ id: string; label: string; spotsRemaining: number }[]> {
  const now = new Date();
  return params.slots
    .filter(slot => slot.cutoffTime > now && slot.booked < slot.capacity)
    .map(slot => ({
      id: slot.id,
      label: slot.label,
      spotsRemaining: slot.capacity - slot.booked,
    }));
}

// Dispatch a delivery via DoorDash Drive API
async function dispatchDoorDashDelivery(params: {
  externalDeliveryId: string;
  pickupAddress: Address;
  dropoffAddress: Address;
  customerPhone: string;
  pickupWindow: { startTime: string; endTime: string }; // ISO 8601
}): Promise<{ trackingUrl: string; fee: number }> {
  const response = await fetch('https://openapi.doordash.com/drive/v2/deliveries', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.DOORDASH_DRIVE_JWT}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      external_delivery_id: params.externalDeliveryId,
      pickup_address: `${params.pickupAddress.street1}, ${params.pickupAddress.city}, ${params.pickupAddress.state} ${params.pickupAddress.zip}`,
      dropoff_address: `${params.dropoffAddress.street1}, ${params.dropoffAddress.city}, ${params.dropoffAddress.state} ${params.dropoffAddress.zip}`,
      dropoff_phone_number: params.customerPhone,
      pickup_time: params.pickupWindow.startTime,
    }),
  });
  const data = await response.json();
  return { trackingUrl: data.tracking_url, fee: data.fee };
}
对于需要完全掌控区域管理和时段预订的无头电商商店:
typescript
// Check if a customer address is in a delivery zone
async function checkDeliveryEligibility(params: {
  customerZip: string;
  deliveryZones: { name: string; zipCodes: string[]; deliveryFeeCents: number }[];
}): Promise<{ eligible: boolean; zone?: string; feeCents?: number }> {
  const zone = params.deliveryZones.find(z => z.zipCodes.includes(params.customerZip));
  if (!zone) return { eligible: false };
  return { eligible: true, zone: zone.name, feeCents: zone.deliveryFeeCents };
}

// Get available time slots for today (slots with remaining capacity)
async function getAvailableSlots(params: {
  date: Date;
  zone: string;
  slots: { id: string; label: string; capacity: number; booked: number; cutoffTime: Date }[];
}): Promise<{ id: string; label: string; spotsRemaining: number }[]> {
  const now = new Date();
  return params.slots
    .filter(slot => slot.cutoffTime > now && slot.booked < slot.capacity)
    .map(slot => ({
      id: slot.id,
      label: slot.label,
      spotsRemaining: slot.capacity - slot.booked,
    }));
}

// Dispatch a delivery via DoorDash Drive API
async function dispatchDoorDashDelivery(params: {
  externalDeliveryId: string;
  pickupAddress: Address;
  dropoffAddress: Address;
  customerPhone: string;
  pickupWindow: { startTime: string; endTime: string }; // ISO 8601
}): Promise<{ trackingUrl: string; fee: number }> {
  const response = await fetch('https://openapi.doordash.com/drive/v2/deliveries', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.DOORDASH_DRIVE_JWT}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      external_delivery_id: params.externalDeliveryId,
      pickup_address: `${params.pickupAddress.street1}, ${params.pickupAddress.city}, ${params.pickupAddress.state} ${params.pickupAddress.zip}`,
      dropoff_address: `${params.dropoffAddress.street1}, ${params.dropoffAddress.city}, ${params.dropoffAddress.state} ${params.dropoffAddress.zip}`,
      dropoff_phone_number: params.customerPhone,
      pickup_time: params.pickupWindow.startTime,
    }),
  });
  const data = await response.json();
  return { trackingUrl: data.tracking_url, fee: data.fee };
}

Best Practices

最佳实践

  • Start with ZIP code zones, not radius or polygon — ZIP-code-based zones are easier to manage, easier to communicate to customers ("We deliver to these zip codes"), and don't require geocoding
  • Set slot cutoff times generously — give your warehouse at least 2 hours between order cutoff and window start to pick, pack, and hand off to drivers
  • Generate delivery manifests before each slot window — print the manifest 30 minutes before your driver leaves; it should list each order with address, time slot, and special instructions
  • Send ETA push notifications as the driver approaches — customers with live ETAs submit far fewer "where is my delivery" support contacts; Onfleet and DoorDash Drive both handle this automatically
  • Monitor slot fill rates — if slots fill up consistently hours before the window, add capacity; if they're under 50% filled at cutoff, consolidate or reduce windows
  • 从邮政编码区域开始,而非半径或自定义区域——基于邮政编码的区域更易于管理,更便于向客户说明(“我们配送至以下邮政编码区域”),且不需要地理编码
  • 设置宽松的时段截止时间——在订单截止时间和配送窗口开始之间至少给仓库留出2小时时间用于拣货、打包和交接给司机
  • 在每个时段窗口前生成配送清单——在司机出发前30分钟打印清单;清单应包含每个订单的地址、时段和特殊说明
  • 当司机接近时发送预计到达时间推送通知——收到实时预计到达时间的客户提交的“我的配送在哪里”支持请求要少得多;Onfleet和DoorDash Drive都会自动处理此功能
  • 监控时段填充率——如果时段在窗口开始前数小时就已填满,则增加运力;如果截止时填充率低于50%,则合并或减少时段窗口

Common Pitfalls

常见陷阱

ProblemSolution
Two customers book the last spot in a slot simultaneouslyUse atomic slot decrement with capacity check — Zapiet handles this; for custom builds use database-level locks or atomic updates
Customer enters an address outside the delivery zone but sees time slotsValidate zone eligibility server-side at checkout, not just client-side; Zapiet enforces this automatically
Cutoff time displayed in wrong timezone for customerAlways store and compare times in UTC; display to customers in their local timezone using the browser's
Intl
API
Driver assigned to more orders than they can fulfill in the windowCap orders per driver per slot and enable route optimization in Onfleet; set realistic capacity limits when building your slot schedule
问题解决方案
两名客户同时预订时段的最后一个名额使用原子性的时段运力递减和检查——Zapiet会处理此问题;对于自定义构建,请使用数据库级锁或原子更新
客户输入超出配送区域的地址但仍能看到时段在结账时进行服务器端区域资格验证,而不仅仅是客户端;Zapiet会自动强制执行此规则
客户看到的截止时间时区错误始终以UTC存储和比较时间;使用浏览器的
Intl
API以客户本地时区显示时间
司机被分配的订单超出其在时段内可完成的数量限制每个司机每个时段的订单数量,并在Onfleet中启用路线优化;构建时段计划时设置合理的运力限制

Related Skills

相关技能

  • @order-fulfillment-workflow
  • @shipment-tracking
  • @order-management-system
  • @international-shipping
  • @dropshipping-integration
  • @order-fulfillment-workflow
  • @shipment-tracking
  • @order-management-system
  • @international-shipping
  • @dropshipping-integration