WooCommerce Phone & Manual Orders (PHP)
Why take phone orders at all?
Not every customer buys from a screen. Some have questions, special configurations, purchase orders, or corporate approvals. A phone-friendly back office closes those carts, shortens sales cycles, and captures revenue you’d otherwise lose. Below is the end-to-end, field-tested workflow I use for manual orders in WooCommerce—optimized for speed, accuracy, and post-sale sanity.
The backbone: roles, permissions, and a simple SLA
Roles: create or reuse
Shop Manager
for senior agents; use a customOrder Agent
role for reps who shouldn’t touch prices or refunds.SLA: inbound call → draft order in 3 minutes → payment request sent in 5 minutes → order captured within same call when possible.
Call outcome taxonomy: Converted, Quote, Abandoned, Callback required. Keep it in order notes—this will power reporting later.
My standard phone-order flow (checklist)
Identify the caller
Look up email/phone in Customers; if new, create a customer profile on the fly.
Confirm billing + shipping + tax region upfront.
Build the cart quickly
Search products by SKU; add line-item notes for options agreed by phone.
Apply negotiated discount code (if any) with expiration.
Totals sanity check
Shipping method locked.
Taxes correct for jurisdiction.
Coupon stacking rules respected.
Take payment
Preferred: card over the phone via secure virtual terminal.
Alternative: emailed pay link that opens a pre-built checkout for the draft order.
Confirm
Read back order number, totals, and ETA.
Send confirmation while still on the call.
Aftercare
Tag the order with the agent’s initials.
Add a one-line “next step” note (e.g., “Send onboarding PDF tomorrow”).
The plugin that ties it together
Use WooCommerce Phone Orders & Manual Orders to create, edit, and finalize orders from the wp-admin without forcing the customer through a self-checkout flow. It gives agents a clean “back-office cart,” supports coupons, taxes, shipping, and can issue payment links if you don’t want to read cards over the phone.
To expand your stack later (without bloat), curate adjacent tools from WordPress Addons—reporting, CRM notes, or invoicing. I keep the agent screen lean: fewer clicks, fewer errors.
Payment patterns that work on the phone
Take the card now (fastest): If policy allows, use your gateway’s “keyed entry” or virtual terminal.
Pay-by-link (safer for some teams): Email or SMS a secure link that renders the exact order the agent assembled.
PO or wire for B2B: Convert the call into a formal quote (pending order), then reconcile once funds arrive.
Fraud hygiene
AVS+CVV must match, IP vs shipping mismatch should flag review, and high-risk countries auto-require pay-by-link with 3-D Secure.
Limit editable prices to senior roles only.
Taxes, shipping, and discounts—without surprises
Taxes: compute from shipping address (consumer) or billing (B2B) per policy; store exemption certificates on the customer profile.
Shipping: expose only two tiers on the phone: Standard and Expedited. More choices slow agents down.
Discounts: keep one reusable “PhoneSAVE5” promo; log rationale in the order note (“matched competitor”).
Make inventory and fulfillment bulletproof
Stock locks: reduce stock on draft → reserve for 15 minutes → auto-release if abandoned.
Backorders: agent must read the ETA out loud; put it in the line-item note.
Pick/pack: push manual orders to the same warehouse queue as web orders; don’t fork the process.
Data you’ll actually use
Create these saved views or reports:
Orders placed by agents this week (conversion rate by agent).
Average handle time (call start → order paid).
Discount leakage (orders with coupons applied by role).
Chargebacks by acquisition source (manual vs self-checkout).
Those four tell you if phone sales are adding profit or just noise.
Case study mini-walkthrough (realistic pattern)
A returning B2B customer calls to reorder 40 units, needs net-terms pricing matched, and asks for split shipping.
Agent finds the account, clones the last order, edits quantities.
Adds “Net-15 approved” note; applies pre-approved 4% discount.
Splits shipping: 20 units to HQ (expedited), 20 to branch (standard).
Sends pay-by-link to A/P email while still on the line; confirms receipt.
Order moves to Processing when the link is paid 4 minutes later.
Clean, auditable, and fast.
Troubleshooting: fast fixes
Taxes look off: confirm the “Calculate tax based on” setting and that the customer profile has the correct default address.
Coupons won’t apply: check exclusivity or category restrictions—agents often miss product-level exclusions.
Payment link fails: gateway tokenization disabled for MOTO/links—flip that setting and retry.
Duplicate customers: merge profiles before fulfillment to keep lifetime value accurate.
Snippets I keep in my toolbox
Create a programmatic draft order (agent hotkey)
add_action('admin_post_create_phone_draft', function () {
if ( ! current_user_can('manage_woocommerce') ) wp_die('Nope');
$customer_id = intval($_GET['cid'] ?? 0); // optional
$order = wc_create_order( array('status' => 'pending') );
if ($customer_id) {
$order->set_customer_id($customer_id);
$user = get_userdata($customer_id);
if ($user) {
$order->set_billing_email($user->user_email);
$order->set_billing_first_name(get_user_meta($customer_id,'first_name',true));
$order->set_billing_last_name(get_user_meta($customer_id,'last_name',true));
}
}
// Example: add a SKU quickly
$sku = sanitize_text_field($_GET['sku'] ?? '');
if ($sku && ($product_id = wc_get_product_id_by_sku($sku))) {
$order->add_product(wc_get_product($product_id), 1);
}
$order->calculate_totals();
$order->save();
wp_safe_redirect( admin_url('post.php?post='.$order->get_id().'&action=edit') );
exit;
});
Restrict price editing to senior roles
add_filter('woocommerce_can_edit_product_price', function($can, $product){
return current_user_can('manage_woocommerce'); // agents can't edit raw price
}, 10, 2);
Require line-item notes for discounted phone orders
add_action('woocommerce_before_order_object_save', function($order){
if ($order->get_discount_total() > 0 && is_admin()) {
$notes = wc_get_order_notes(['order_id' => $order->get_id()]);
$has_reason = false;
foreach ($notes as $n) {
if (stripos($n->content, 'discount:') !== false) { $has_reason = true; break; }
}
if (!$has_reason) {
throw new Exception('Discount reason required (add order note with "Discount: <reason>").');
}
}
});
Lightweight “reserve stock on draft” approach
add_action('woocommerce_new_order', function($order_id){
$order = wc_get_order($order_id);
if (is_admin() && $order && $order->has_status('pending')) {
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product && $product->managing_stock()) {
wc_update_product_stock($product, -1 * $item->get_quantity(), 'decrease');
}
}
// auto-release in 15 minutes if still unpaid
wp_schedule_single_event(time()+15*60, 'wc_release_phone_reservation', [$order_id]);
}
});
add_action('wc_release_phone_reservation', function($order_id){
$order = wc_get_order($order_id);
if ($order && $order->has_status('pending')) {
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product && $product->managing_stock()) {
wc_update_product_stock($product, $item->get_quantity(), 'increase');
}
}
$order->add_order_note('Reservation expired—stock released.');
}
});
Training your team (scripts that don’t sound scripted)
Open: “Let’s get this sorted quickly—what’s the email you want on the receipt?”
Totals: “I’ll read the total including tax and shipping so you can confirm.”
Payment: “I can process the card securely now or send a pay link—what’s easier?”
Close: “Your order number is 31459; I’ve emailed confirmation and tracking will follow.”
Agents who drive the call with clear options close more revenue and create fewer post-call tickets.
KPIs and quality controls that actually move the needle
AHT under 8 minutes for paid orders.
<2% manual-order refund rate (watch early).
Discount use under 12% unless you’re running phone-only promos.
QA: double-check taxes on the day new regions go live; mystery-shop once a week.
Advanced patterns you’ll appreciate later
Customer notes → CRM: pipe order notes to your CRM so sales sees what support promised.
Saved carts for callbacks: agents can email a recoverable draft; system pings the agent if unpaid after 24h.
Bundle builder by phone: prebuild “kits” the agent can add as one SKU to minimize click-time.
One more time, the exact tools I click
Back-office cart + manual order creation: WooCommerce Phone Orders & Manual Orders
Curated extensions when I really need them (reporting, invoicing, CRM notes): WordPress Addons
Final reminder
Keep the agent screen uncluttered, enforce a tiny set of rules, and measure only what you’ll act on. That’s how phone sales become a profit center instead of a parallel universe.
本作品采用《CC 协议》,转载必须注明作者和本文链接