Documentation

Set up your yard and run the day.

Everything you need to set up and run your BulkTrackPro account, from your first product to your first payout.

Getting Started

Welcome to BulkTrackPro: the big picture

What BulkTrackPro does and how the main pieces fit together.

BulkTrackPro runs the whole job of a bulk-material supplier, from the moment a customer orders to the moment the money lands in your bank.

The pieces

  • Orders & estimates: take orders online or at the desk, quote jobs, and turn a signed estimate into a live order.
  • Dispatch & drivers: assign loads, route trucks, and track deliveries in the field.
  • Invoicing & payments: bill customers, take card or bank payments, and get paid out.
  • Catalog, customers & inventory: your products, your customer book, and your stock.
  • Reports & QuickBooks: see the money and keep your books in sync.

Where to start

Follow your setup checklist on the dashboard. It walks you through connecting payments, adding products, and taking your first order.

Help is always one click away: the ? button (bottom-right) answers questions in plain words, and Help & Resources in the sidebar opens this full guide.

Why is this locked? Plans, permissions & roles

Why a page or button may be unavailable, and how to unlock it.

If a page is greyed out or a button won't click, it's one of three things, not a bug.

1. Your plan

Some features (Customers, Payments, Inventory, Reports, SMS, and more) are part of the CRM plan. A padlock next to a sidebar item means your current plan doesn't include it, so open Billing to change plans.

2. Your role

Owners and admins see everything. Staff see only what the owner has granted them. Owner-only areas (like Billing and User Management) stay hidden for everyone else.

3. Add-ons

QuickBooks and extra SMS capacity are add-ons. If a QuickBooks button is disabled, the integration isn't connected yet.

If you think you should have access and don't, the owner can grant it in User Management.

Your setup checklist

The in-app Setup Guide that walks you through going live, step by step.

Your account comes with a built-in Setup Guide that tracks every step between signing up and taking live orders.

When you'd do this: Right after you log in for the first time. Work the list top to bottom and you're ready to sell.

Where to find it

  • A banner across the top of every page reads "X of Y setup steps complete" and links straight to your next step. The X button dismisses it for the current session only.
  • The sidebar shows a Setup Guide widget with a progress ring. Click it to expand all steps, grouped into four phases: Get Set Up, Connect Your Tools, Build Your Team, and Go Live.

The steps

Each step is a link to the page where you finish it. A step ticks off on its own once the underlying data exists. You never mark it done by hand.

  1. Set up your business profile: Settings. Needs your company name and phone number.
  2. Import your customers & history: CSV Import. Upload a CSV of your existing customers and orders.
  3. Review your Storefront Services: Catalog. Check imported services and set the Available On field (Web, Mobile, or Both).
  4. Set your inventory levels: Inventory. Turn on tracking and set stock levels.
  5. Activate SMS messaging (optional): Integrations.
  6. Connect QuickBooks (optional): Integrations.
  7. Connect your Stripe payment account: Payment Settings.
  8. Add your drivers & send portal invites: Drivers.
  9. Add staff users (optional): User Management.
  10. Customize your Mobile App branding: Mobile App Branding.
  11. Customize your Consumer Storefront: Consumer Branding.

The guide only appears for the business owner. Staff and drivers never see it. Required steps (profile, import, catalog, inventory, Stripe, drivers, mobile branding, storefront) must all be green before the ring reads Setup Complete. The three optional steps (SMS, QuickBooks, staff) never block go-live.

Choosing & understanding your plan

What Yard, Depot, and Enterprise include, and which limits are actually enforced.

BulkTrackPro sells three plans. They differ on two things that are actually enforced (how many user seats and how many locations you get) and on which features are unlocked.

The three plans

  • Yard: $349.99/mo. 1 location, up to 3 users. Mobile ordering, order dashboard, driver coordination & routing, invoicing & payments, and inventory.
  • Depot: $499.99/mo. 1 location, up to 15 users. Everything in Yard, plus the full CRM & lead management, the consumer website, advanced analytics & reporting, marketing campaigns, and custom branding. This is the plan flagged Most Popular.
  • Enterprise: $699.99/mo. Unlimited locations and unlimited users, plus centralized roll-up reporting and a dedicated account manager.

What the plan actually gates

Two limits are enforced in the backend, not only printed on the card:

  • User seats: Yard 3, Depot 15, Enterprise unlimited. Run out and the Add Staff User button is blocked until you free a seat or buy more.
  • Locations: Yard and Depot are single-location; multi-location is an Enterprise feature (or the Multi-Location add-on).

Seats and locations are the limits that scale with your plan. If a page you expected isn't available, it's usually your role or subscription status, not your plan tier. See Why is this locked?

Fees are separate from your subscription

Your monthly plan is your only fixed cost. On top of it, every transaction carries a flat 1% platform fee and Stripe's standard 2.9% + $0.30 processing fee. Whether each of those is added to your customer's total or absorbed by your business depends on your own setting under Order Settings → Fees. It is not fixed by the plan.

The top tier is labeled Enterprise on the pricing screen (the "Fleet" name only exists internally). All three plans are self-serve. You subscribe directly on Billing; none of them requires a sales call.

Managing your subscription & add-ons

Change your plan, add QuickBooks / SMS / seats / locations, or request a cancellation.

Everything about what you pay lives on one page: Billing.

When you'd do this: You want to add QuickBooks, buy more seats, switch plans, or stop your subscription.

Change your plan or payment method

  1. Open Billing. Your current plan and status show under Current Plan.
  2. Click Manage Subscription to open the secure Stripe billing portal, where you change your plan or update your card.

Add or remove add-ons

  1. On Billing, find the Add-Ons card and click Edit Add-Ons.
  2. Toggle or set the quantity for each:
    • QuickBooks Integration: +$69.99/mo
    • SMS Communication: +$69.99/mo
    • Extra User Seats: +$15/user/mo
    • Multi-Location: +$100/location/mo
  3. Click Save Changes.

Request a cancellation

  1. On Billing, scroll to Need to cancel? and click Request Cancellation.
  2. Fill in the reason form and click Submit Cancellation Request.

Two timing traps: add-on changes are prorated onto your next invoice, not charged in full today. And submitting the cancellation form does not end your subscription on the spot. The team reviews it within 1 business day and ends it at the close of your current billing period, so your service keeps running until then.

Inviting your team & understanding roles

How owner, admin, staff, driver, and billing access differ, and how to invite each.

Who can see and do what comes down to five levels of access.

The roles

  • Owner: the account holder. Full access to everything, always, including Billing and User Management. There is one owner.
  • Admin: a staff member you promote with Make Admin. Gets full feature access and can manage other users. Does not get Billing or Stripe access unless separately granted.
  • Staff: the default for a new user. Sees everything except the features you block. You set those per person with the Feature access picker.
  • Driver: created and managed on the Drivers page, not here. A driver who is also granted office-dashboard access shows up in User Management as Driver + Office.
  • Billing access: an extra grant on top of admin, marked with a Billing badge. Only the owner can give it, and only to an admin.

Invite a staff user

  1. Open User Management and click Add Staff User.
  2. Enter their Full Name, Email, and Password.
  3. Under Feature access, check anything they should NOT see. Leave it blank for full access.
  4. Click Create Staff User, then use the mail icon in their row to send a welcome email.

Grant admin or billing access

  • In a staff member's row, use Make Admin to promote them. Use the credit-card icon (owner only, admin staff only) to grant billing & Stripe access.

Granting billing & Stripe access hands that person full financial control: your Stripe payout account and your subscription. Give it only to someone you trust with your money. Two more things to know: your plan caps how many seats you have (3 on Yard, 15 on Depot), so a full account blocks new invites until you free a seat or add more; and changes to a user's blocked features take effect the next time they log in, not instantly.

Connect Stripe so you can get paid

First-run Stripe Connect setup so card and online payments land in your bank.

No payments move until your Stripe account is connected. This is the one step you can't skip before going live.

When you'd do this: Before you take your first order. Connecting Stripe is what lets customers pay by card and online.

Connect your account

  1. Open Integrations and find the Stripe Payments card.
  2. Click Connect with Stripe. It takes about 5 minutes.
  3. Stripe walks you through verifying your business and linking your bank account. Finish every screen Stripe shows you.
  4. Back on the card, a green Connected badge means you're set. If it instead says your account was created but onboarding isn't complete, click Complete Setup and finish the remaining Stripe screens.

After you're connected

  • Your payout schedule is daily with a 1-day delay: funds from confirmed orders typically arrive the next business day.
  • To put your business name on customer receipts, click Open Dashboard on the card and go to Settings → Business settings in your Stripe Express dashboard.

Your very first payout has a mandatory 7-day waiting period that Stripe enforces on every new account. This is normal, not a hold by BulkTrackPro. After that first payout, the daily 1-day schedule applies. The setup checklist's Connect your Stripe payment account step stays unchecked until Stripe onboarding is fully complete, so a half-finished Stripe signup will not tick it off.

Connect QuickBooks

First-run QuickBooks Online setup so invoices, payments, and customers sync automatically.

Connecting QuickBooks Online syncs your invoices, payments, and customers so you skip double entry.

When you'd do this: You keep your books in QuickBooks Online and want orders to flow there without retyping.

Connect your account

  1. Open Integrations and find the QuickBooks Online card.
  2. Click Connect QuickBooks and sign in to Intuit, then authorize BulkTrackPro.
  3. When you return, the card shows a green Connected badge and your Company ID.

Finish the mapping

  1. On the connected card, click Open Control Panel.
  2. Match your catalog items to the right QuickBooks accounts so synced invoices post where you expect.

Disconnect

  • Click Disconnect on the card at any time to unlink the account.

QuickBooks is a paid add-on (+$69.99/mo). If the card shows Add-on required instead of a Connect button, turn the add-on on first under Edit Add-Ons on Billing, then come back and connect. The connection isn't live until both the account authorization and your QuickBooks company (realm) are linked. The Company ID on the card is your confirmation.

Set up your online storefront

First-run Consumer Branding setup so customers can order from your public page.

Your storefront is the public page where customers place orders. You build it on the Consumer Branding page.

When you'd do this: Once your catalog and Stripe are ready and you want customers ordering online.

Build the page

  1. Open Consumer Branding. The left side groups the editor into sections.
  2. Under Brand & Logo, set your logo and name.
  3. Under Theme & Colors, pick a storefront theme and your accent color.
  4. Under Store Info, fill in the Welcome Message shown at the top of your page, and your Company Description.
  5. Add your Contact Info and Social & Website links so the footer and contact strip are complete.
  6. Click Save Changes (top right). The button reads All Saved once everything is stored.

Preview and share

  • Click Open live to see the storefront in a new tab.
  • Your public URL shows next to Storefront at the top right. Click Copy to grab it and share it with customers.

The setup checklist's Customize your Consumer Storefront step only ticks off once your Welcome Message is filled in. Setting colors or a logo alone won't complete it. The storefront URL is built from your business subdomain and only appears once that subdomain is set.

Glossary of terms

Plain definitions of the words you will meet while setting up.

The words that come up most often while you set up, in plain language.

Plans & billing

  • Plan: your monthly subscription tier: Yard, Depot, or Enterprise. Sets your seat and location limits and which features unlock.
  • Add-on: a paid extra on top of your plan: QuickBooks (+$69.99/mo), SMS (+$69.99/mo), Extra User Seats (+$15/user/mo), or Multi-Location (+$100/location/mo).
  • Seat: one dashboard login. Your plan includes a fixed number (3 on Yard, 15 on Depot); extra seats are an add-on.
  • Platform fee: BulkTrackPro's flat 1% per transaction.
  • Processing fee: Stripe's standard 2.9% + $0.30 per transaction.
  • Fee handling: your choice, under Order Settings → Fees, of whether the platform and processing fees are added to the customer's total or absorbed by your business.
  • Free Account: an account granted complimentary access, with no subscription required.

People & access

  • Owner: the account holder, with full access to everything including Billing.
  • Admin: a staff member promoted to full feature access who can manage other users.
  • Staff: a standard dashboard user, limited by the features you block for them.
  • Driver: a delivery user managed on the Drivers page; shown as Driver + Office if also given dashboard access.
  • Billing access: an owner-granted permission giving an admin full financial control (Stripe payouts and the subscription).

Setup & selling

  • Setup Guide: the in-app checklist that tracks the steps to go live.
  • Catalog: your list of products and services, on the Catalog page.
  • Storefront: your public online ordering page, built on Consumer Branding.
  • Subdomain: the address your storefront URL is built from.
  • Stripe Connect: the payment account link that lets you accept card and online payments and receive payouts.
  • Payout: money from confirmed orders landing in your bank; the default schedule is daily with a 1-day delay (first payout after ~7 days).
  • Control Panel: the QuickBooks screen where you match catalog items to QuickBooks accounts.
  • A2P 10DLC: the US carrier registration your SMS number must pass before texts can send.

Setting a step's underlying data is what completes it. For example, the SMS checklist step counts carrier registration as started once it reaches pending approval, but outbound texts stay blocked until that registration is fully approved.

Your Storefront

How your storefront & your bulktrackpro.com subdomain work

Your public ordering page, the subdomain web address it lives at, and where you edit it.

Your storefront is the public web page where customers browse your catalog and place orders. It has one address, built from your subdomain: a business with the subdomain greenmulch is reached at greenmulch.bulktrackpro.com.

The subdomain is how the store knows who you are

When a shopper opens greenmulch.bulktrackpro.com, the first label of that address (greenmulch) is read off the hostname and used to look up your business and serve your products, prices, and branding. The same subdomain also powers your customer QR code and the "type a business code to connect" flow in the mobile app. They all encode the one subdomain, so they can never point at different stores.

Where you edit the look

You design the storefront on the Consumer Branding page: logo, theme, banner, order-flow fields, the top cover, store info, contact links, and SEO, each in its own section. The top bar shows your live Storefront: URL with a Copy button, and Open live ↗ opens the real store in a new tab. The right half of the page is a Live Preview that updates as you type; nothing is public until you click Save Changes.

On staging and localhost the address looks different

Only real *.bulktrackpro.com addresses carry a per-business subdomain in the hostname. On a staging or local URL there's no such subdomain, so the store is reached as /store?subdomain=<yours> instead. Same store, same data, only a different-shaped link.

Changing your subdomain

Rename the web address your storefront lives at. An owner-only change that breaks old links and printed QR codes.

When you'd do this: you're rebranding, or the subdomain you were set up with has a typo or no longer fits the business name.

The control is on Settings, under Business Subdomain. Only the business owner can change it. Staff and other roles see the subdomain but no edit field.

Steps

  1. Open Settings and find Business Subdomain.
  2. Type the new subdomain in the field (the .bulktrackpro.com suffix is fixed and shown beside it). It may contain only lowercase letters, numbers, and hyphens, with no leading or trailing hyphen.
  3. Click Save Subdomain.
  4. Confirm the warning dialog. If the name is already taken, the save is rejected with a message.

Changing your subdomain changes your storefront's whole web address. Every link you've already shared and every printed QR code keeps pointing at the old address and will stop working. After the change, re-copy your Storefront URL and re-download the QR from Customer QR Code before reprinting anything. See Your customer QR code.

Web storefront branding: logo & brand

Upload your logo and set how it shows in the storefront nav, plus the Brand & Logo text fields.

When you'd do this: you're putting your own logo on the storefront nav bar and choosing how it sits there.

Everything here is under Appearance → Brand & Logo on Consumer Branding.

Steps

  1. Under Company Logo, click Upload and pick your file. A PNG with a transparent background looks best; the hint recommends at least 200×80px.
  2. Choose a Logo Display Mode: Logo + Company Name (logo and text side by side) or Logo Only (when the name is already inside the logo).
  3. Optionally turn on Show logo box / border to paint a background box behind the logo, and set its Logo Box Color.
  4. Pick a Logo Size: Small, Medium, or Large.
  5. Click Save Changes.

Your logo renders in the storefront's top nav bar. This section also has two saved text fields (Welcome Message and Company Description), but neither shows on the storefront page itself in this build: the Welcome Message appears on your customer sign-in page, and the Company Description isn't displayed on the store. For intro copy at the top of the store, use the Top Cover (Overline / Headline / Subhead) instead.

The large photo-and-headline band across the very top of the store is a separate element, the Top Cover, not a hero editor on this page. See Storefront info bar, cover & store-info card.

Theme & colors

Pick a storefront theme preset, set one accent color, and choose fonts from the built-in list.

When you'd do this: you want the storefront's background, cards, and text to match your brand's look and your accent color.

The controls are under Appearance → Theme & Colors on Consumer Branding.

Steps

  1. Pick one of the five theme presets: Clean Light, Earthy Premium, Bold Industrial, Dark Forest, or Slate Navy. The preset sets the background, card, and text palette. New stores default to Dark Forest.
  2. Set Primary / Accent Color under Accent Color. This one color drives all buttons, links, and highlights and is applied on top of whichever theme you chose.
  3. Under Typography, pick a Header Font and a Body Font, and a Text Size of Small, Normal, or Large.
  4. Click Save Changes.

The font menus are a fixed, curated list (Inter, Roboto, Open Sans, Lato, Montserrat, Poppins, Raleway, Ubuntu, Nunito, Merriweather, Lora, Playfair Display, Oswald, Quicksand, Pacifico, Barlow, and Barlow Condensed). You cannot type in an arbitrary Google Font. Both the server and the storefront reject anything off this list and silently fall back to Inter, so an unexpected font on the live store means the stored value wasn't on the list.

Announcement banner

Show a colored bar at the very top of the storefront for a promotion or a notice.

When you'd do this: you want a seasonal promotion or an important notice across the very top of the store.

The controls are under Appearance → Announcement Banner on Consumer Branding.

Steps

  1. Turn on Show announcement banner.
  2. Type your Banner Text.
  3. Optionally turn on Dismissible to give customers an × button to close the bar.
  4. Optionally add a Banner Link (optional) to make the whole bar clickable. Enter a full URL starting with https://.
  5. Set Background Color and Text Color; the box below previews the result.
  6. Click Save Changes.

The banner shows on the live store only when the toggle is on and Banner Text is filled in. An empty text box means no banner, even with the toggle on, so if the bar isn't appearing, check that the text isn't blank.

Order-flow fields (notes, gate code, how-did-you-hear, custom questions)

Choose which extra questions customers answer at checkout, including up to three of your own.

When you'd do this: you want customers to leave delivery instructions, a gate code, or answer a question or two while they check out.

The controls are under Content → Order Flow on Consumer Branding. They appear on the delivery-details step of checkout.

Built-in fields

Toggle each on or off:

  • Order Notes: a free-text box for special instructions (e.g. "leave at side gate").
  • Gate / Access Code: asks for a gate code or property access instructions.
  • How did you hear about us?: a dropdown that tracks where new customers come from. The dropdown's choices are maintained separately under Order Settings → Ad Source Options.

There's also a Show how-to-order strip toggle (under Homepage) for the 1 · 2 · 3 "Choose / Schedule / We Deliver" steps above your products. (Custom labels for those steps live on the separate Branding page.)

Custom questions

Add up to 3 of your own under Custom Questions:

  1. Click Add Custom Question and enter the Question Text.
  2. Pick an Input Type: Text, Dropdown (one option per line), or Checkbox.
  3. Optionally mark it Required so the customer must answer before continuing.
  4. Click Save Changes.

Custom-question answers are written into the order's notes, not into their own separate fields. You read them in the order's notes area in the dashboard, so phrase each question so its answer makes sense sitting in a notes line.

Storefront info bar, top cover & store-info card

The three storefront-section blocks: a facts bar, a cover banner or photo, and a store-information card.

When you'd do this: you want to set the facts strip, the big cover at the top of the store, and the hours/service-area card.

All three live under the Storefront tab on Consumer Branding.

Info Bar Tags

Short facts shown near the top of the store (e.g. "Same-day delivery before 2 PM", "$100 yard minimum"). Add up to 8, each up to 80 characters. Leave the list empty to hide the bar entirely.

Top Cover

The wide area across the very top of the store. Pick a Cover Style:

  • None: no cover.
  • Banner: a plain colored band.
  • Photo: a full-width background photo you upload.

For Banner or Photo, add Overline, Headline, and Subhead text.

Store Info

Turn on Show store info to display a store-information card, then fill in Hours and Service Area. The Show address toggle adds your business address to that card.

Show address doesn't carry its own address field. It pulls the Business Address you set under Contact & Social → Contact Info (and shows the Business Phone alongside it). If both the address and phone are blank, turning it on shows nothing. Set them first. See Contact & social links.

Storefront SEO (title, meta, favicon)

The Page Title and Meta Description that control how your store looks when shared or found online.

When you'd do this: you want to control how your store's title and description read when the link is shared or shows up in search.

The fields are under Advanced → SEO on Consumer Branding.

Steps

  1. Set a Page Title. Leave it blank to fall back to your company name.
  2. Write a Meta Description: the short description for search and shared links (150–160 characters works well). Blank falls back to an auto line about ordering your products online.
  3. Click Save Changes.

What these actually drive

When your storefront link is served, the Page Title and Meta Description are baked into the page's Open Graph and Twitter-card tags. That's the title and description that appear when someone pastes your link into a text, chat, or social post, and what search engines read. Your logo is used as the shared preview image.

Two gaps to know at this release. First, Page Title does not change the browser-tab title. The live store's tab always shows your company name, not this field; Page Title only feeds the shared-link / search title. Second, the Favicon field here is saved but is not applied to the live storefront in the verified build (no favicon is wired into the store page). Treat Favicon as not-yet-live rather than something customers will see. (UNCONFIRMED: any path that renders this favicon.)

Category landing pages

How each catalog category becomes its own storefront landing page, and where that content comes from.

Each category you create in your catalog gets its own landing page on the storefront. That page leads with the category's hero headline and intro, then lists that category's products. The content for one of these pages lives on the category itself: a hero image and headline, an intro image, description, a CTA button label, and a products-section heading. When those fields are empty the page still renders, falling back to the category's name.

Categories are created in the Catalog

You don't create categories on the storefront. Make them in Catalog → Manage Categories, assign products, and set their order. That order is the order shoppers see. See Categories & category ordering.

Editing the per-category page content

The per-category page editor (hero headline, intro, CTA, products heading) exists in the code, but in the verified build it is not reachable from a menu on the Consumer Branding page, so there is currently no in-app path to customize these fields beyond the category name and its products. (UNCONFIRMED: a reachable entry point to this editor at commit d8c11cc.) The catalog category article points to "Branding → Category Pages" for this; treat that pointer as ahead of the shipped UI for now.

Deleting a category doesn't delete its products. They move to Uncategorized (see the catalog category article). So removing a category only removes its landing page, not the items on it.

Your customer QR code

The scannable code that opens your storefront. Download it, and reprint it after any subdomain change.

When you'd do this: you want a code to put on trucks, signage, or flyers that opens your storefront when a customer scans it.

The code lives on Settings, under Customer QR Code.

Steps

  1. Open Settings and scroll to Customer QR Code.
  2. Click Download QR Code to save the image for printing.

What it encodes

The QR encodes your storefront URL. Any phone camera that scans it opens your online ordering page. No app required. The same code carries your subdomain as a parameter, so a customer who already has the BulkTrackPro app can scan it to connect, or type your Business Code (your subdomain) by hand. A read-only preview of the same QR also appears on Consumer Branding → Mobile App.

The QR is generated from your subdomain, so it only works while that subdomain is current. If you ever change your subdomain, every already-printed code breaks. Re-download and reprint from here afterward. See Changing your subdomain.

Guest checkout: what it is & its current limits

Letting shoppers order without signing in, how it is turned on, and why you can not toggle it yourself.

Guest checkout lets a shopper place an order without signing in. The store identifies them by the phone number they type, creating or reusing a lightweight customer record keyed to that phone.

It takes two switches, both off by default

Guest checkout turns on only when both of these are on:

  • A platform-wide flag that BulkTrackPro controls.
  • A per-business flag on your account.

Both default to off, and with either one off a signed-out shopper is sent to the sign-in flow instead of the guest path.

There is no self-serve toggle for this

Your dashboard has no setting to switch guest checkout on or off. It is set out-of-band by BulkTrackPro, not from the Consumer Branding page or anywhere else in your account. To enable or disable it, contact BulkTrackPro support.

Current limits once it's on

  • Guest orders are rate-limited (roughly 10 per IP address per 15 minutes, and 10 per phone number per day) to blunt abuse.
  • A guest's card is never saved or reused: the store does not attach a guest payment to a stored customer, so one guest's card can't later surface on another account.
  • After a guest order, the store can show a "sign in to unlock" prompt inviting the shopper to claim a real account.

Because there's no dashboard control, you can't turn guest checkout on or off yourself. That's a support request. And even with your per-business flag on, guest checkout stays off unless the platform-wide flag is also on, so "nothing happened after it was enabled for me" usually means the platform flag isn't on yet.

What your customers see & can do on the storefront

A tour of the shopper experience: browse, size an order, check out by delivery/pickup/drop-off, and pay.

Your storefront is a full self-service ordering flow. Here's what a customer actually does on it.

Browse and size an order

  • Products are shown grouped by category, on cards with your pricing and any merchandising badges you set in the catalog.
  • For measured products (mulch, soil, gravel), a How much do I need? helper converts an area into cubic yards. See Order-by-area measurement.
  • Customers add items to a cart and adjust quantities; whole-number products step by 1, measured products step by half-yards.

Check out

  • They choose how to receive the order (delivery, pickup, or drop-off) within what each product and your settings allow, and pick a date and time.
  • They answer whichever order-flow fields you turned on (order notes, gate code, "how did you hear", your custom questions) and can add any checkout add-ons and read your disclaimers.
  • If a minimum-order fee applies, the store surfaces it early, at the cart, so there's no surprise at payment.

Pay

  • Payment is by card. A hold is placed on the card at order time and captured when you confirm the order. The shopper isn't charged the moment they submit.
  • Depending on how your store is configured, they either sign in or (if enabled for you) check out as a guest. See Guest checkout.

The price shown at checkout is re-priced on the server from your live catalog, taxes, fees, and add-ons before any card is touched. The amount charged always matches the order, not whatever an out-of-date page might display.

Order-by-area measurement (AR, map & manual)

The ways a customer can turn an area into the cubic yards they need, and which ones actually exist.

A measured product can be ordered two ways: the customer enters the number of units directly, or they measure an area and let the store convert that area into cubic yards using the product's Coverage Rate. Which the product offers is set per product in the catalog.

On the web storefront: the manual calculator

The web store's How much do I need? helper is a manual calculator. The customer either enters a Length × Width or types a total Area, optionally picks a depth, and the store converts to cubic yards and drops the result into the cart.

In the mobile app: AR measurement

When a product has AR Measurement enabled, the BulkTrackPro mobile app measures the area in augmented reality for the customer and feeds that area into the same coverage math.

There is no map-based measurement

Despite the common "measure on a map" expectation, the verified build has no map- or satellite-draw measurement on the web storefront or mobile app, only the manual calculator and AR. (UNCONFIRMED: any map-based measurement feature at commit d8c11cc.)

The coverage-and-depth math itself (what Coverage Rate means, the 2-inch baseline, and how depth scales it) is explained once in Coverage, depth & the cubic-yards math; it isn't repeated here.

The calculator and AR both rely on the Coverage Rate you set per product. If measured orders come out consistently high or low, the fix is the product's Coverage Rate in the catalog, not anything on the storefront. See the catalog coverage article.

Checkout add-ons & disclaimers

Optional paid add-ons customers can tack on at checkout, and disclaimer text shown to them.

When you'd do this: you want to offer a paid extra at checkout (like a rush fee or a tarp), or show customers a line of terms while they order.

These live on the separate App & Storefront Branding page. Open Branding and go to the Checkout tab, to Checkout Add-ons & Disclaimers. (This is a different page from Consumer Branding.)

Add an add-on

  1. Click + Add add-on.
  2. Enter a Label, a Price, and set Taxable on or off.
  3. Choose Available on: Both, Web only, or Mobile only.
  4. Leave Active on and click Add.

Add-ons are optional at checkout. The customer chooses whether to add them.

Add a disclaimer

  1. Click + Add disclaimer.
  2. Enter a Title and the Description: the text the customer reads.
  3. Set Available on and Active, then click Add.

Two traps. A disclaimer is informational only. It's shown at checkout but there is no "must accept" checkbox that blocks the order, so don't treat it as a hard acceptance gate. And an add-on's Price here is for display: when an order comes in, the store re-prices every add-on from the database server-side, so editing a price changes what customers are charged going forward. It isn't a cosmetic label.

The Mobile Apps

The consumer app: status and how customers get it

What is actually live for customers today: the web storefront, not an app-store download.

The way customers buy from you today is your web storefront: a branded ordering page on your own subdomain (for example yourname.bulktrackpro.com). There is no BulkTrackPro consumer app you can point customers to in the Apple App Store or Google Play yet. Plan around the storefront, because that is the channel that is live.

What customers use right now

  • A customer opens your storefront link, or scans your QR code, on any phone. As the QR panel on Consumer Branding says, it "opens your online ordering page, any phone camera can scan it, no app required."
  • They browse your catalog, measure and price the job, pick delivery or pickup with a date, and pay by card, all in the mobile web browser.
  • The order lands on your dispatch board and generates its invoice, the same as a phoned-in order.

What the app-store listing actually is

The marketing pages (for example Customer App) describe "your own app-store listing" and "iOS + Android app." That is the roadmap, not a live download. Two things in the product confirm it:

  • The Apple App Store URL and Google Play URL fields on Mobile App Branding and Consumer Branding are blank until you paste a link in yourself. Download buttons and the store QR only appear once those fields are filled.
  • There is no BulkTrackPro-published consumer app in the stores for you to link to, so those fields stay empty for now.

The shipped app is one shared app

The consumer app build is a single app that loads your branding by business code, not a separate app per yard. In the app a customer taps Change Store to switch which business they are ordering from, and the splash and home screens read "Powered by BulkTrackPro." Per-partner store listings are a future step, not how the current build works.

Don't promise customers an app-store download. Hand them your storefront link or QR code instead. That is the live, working path. If you tell a customer to "search our app in the App Store," they won't find one, and you'll field the callback you were trying to avoid.

Mobile app branding

Set the theme, logo, trust badges, checkout labels, and confirmation copy for the customer app.

When you'd do this: you want the customer app to carry your name, colors, and wording instead of the defaults.

Mobile App Branding is a three-panel editor: an icon rail on the left, the controls in the middle, and a Live Preview phone on the right that updates as you type. The preview tabs (Splash, Home, Products, Measure, Checkout, Confirm) let you check each screen.

Steps

  1. Open Mobile App Branding.
  2. Pick a section from the icon rail: Theme, Hero, Brand, Banner, Trust, Home, How-To, App, Measure, Checkout, Confirm, Contact, or Online.
  3. Set the look under Theme. Choose a Theme Preset (Dark Forest, Clean Light, Earthy Premium, Bold Industrial, or Slate Pro), a Primary / Accent Color, and a Button Shape (Pill or Rounded).
  4. Upload your App Logo under Brand, and set the Logo Display Mode (Logo + Name or Logo Only).
  5. Turn on Show Trust Badges under Trust to add up to four pill badges (for example "⭐ 4.9 Google Rating") below the Start button on the home screen.
  6. Edit the confirmation screen under Confirm: toggle Show "What Happens Next" Steps and set the three step lines, and toggle Show Contact Card on Confirmation.
  7. Click Save Changes in the top bar. It reads All Saved when there's nothing pending, and an Unsaved changes flag appears while edits are outstanding.

What the other sections control

  • Hero: the full-screen opening image and the three-part headline (part 2 renders in your accent color).
  • Banner: an optional Announcement Banner across the top of the home and measurement screens.
  • Home: the Start Button Label (default "Start Measuring").
  • Checkout: section labels like Service Type and Contact Information, plus optional Order Notes and Ad Source fields and checkout add-ons and disclaimers.
  • App: the App Store Links fields and the Connect Card (your QR code and business code). These links are blank until you fill them in.
  • Contact / Online: phone, email, address, and social links shown in the app.

Picking a Theme Preset also re-themes your web storefront. The preset writes both the app theme and the storefront theme in one click, so they stay in sync. You can't give the app one preset and the storefront another from this page. Change it only when you want both surfaces to move together.

The driver app: overview and how drivers install it

What the driver app does, and the three ways a driver gets it on their phone.

The driver app is the Driver Portal: the screen each driver signs into to see their stops, navigate to each address, capture proof of delivery, and clock in and out. It is a web app at /driver/login, so a driver can run their whole day from a phone browser; installing it to the home screen only makes it open like a standalone app. There's nothing to buy in an app store to get a driver working.

How a driver gets access first

A driver can only sign in after you create their account on the Drivers page. From there you Send invite (a welcome email with their login credentials) or copy and share the credentials directly. See Add and manage drivers. The driver then signs in at /driver/login with their email and password (the login screen reads "Welcome back. Sign in to see your routes").

The three ways to install it

  • Browser: open /driver/login in any phone browser and sign in. No install needed; a signed-in session is remembered for 90 days, so the driver lands straight on their dashboard next time.
  • Add to Home Screen (iPhone): on an iPhone, Safari shows a one-time hint, "Install this app on your phone." The driver taps the Safari Share button, then "Add to Home Screen", and gets a standalone BTP Driver app icon that opens straight to their deliveries.
  • Add to Home Screen (Android): in Chrome, the driver uses the browser menu's install / "Add to Home screen" option to pin the same standalone app.

Signing in from a link

If you send an invite link, the driver may land on a verifying screen that logs them in and redirects to the dashboard. If the link has expired, the screen shows Login Failed with a Request New Link button that returns them to the sign-in page.

The iPhone install only works from Safari. If a driver opens the invite link inside an email or text app's built-in browser, the "Add to Home Screen" option won't be there. The hint and the install path are Safari-only, because other iOS browsers don't expose it. Tell drivers to open the link in Safari before installing.

Products & Pricing

How the catalog works

Every product you sell is one item in the Catalog: its price, unit, tax, and where it shows up.

The Catalog is the master list of everything you sell: mulch, gravel, topsoil, delivery, a flat site-visit fee. Internally each row is called a Service, which is why you'll see a Create Service button (and the edit form is headed Edit Service), but on the page itself the list is titled Catalog, each row is a product, and its row button reads Edit.

What one catalog item carries

  • A name, description, and photos.
  • A Pricing Model and Unit (per yard, per ton, flat rate, and more) plus the Retail Price.
  • A tax setting, a fulfillment type, lead time, and available days.
  • Optional variants (colors/finishes), a category, merchandising badges, and per-location availability.

Two switches decide where it appears

  • Active (the checkbox in the edit form, and the Active/Inactive pill on each card) controls whether the product exists at all. An inactive product is hidden everywhere: the website, the mobile app, and Create Manual Order.
  • Show on customer storefronts controls which customer channels show an active product: website, mobile app, both, or Off — office only.

These two switches are independent. Setting Show on customer storefronts to Off — office only does NOT retire the product. It stays active and fully usable in Create Manual Order, it's only hidden from the website and app. To pull a product from everywhere, uncheck Active instead.

Create & edit a product

Add a new product to your catalog, edit an existing one, or duplicate one as a starting point.

When you'd do this: you're adding a new material, correcting a price, or standing up a near-copy of a product you already sell.

Add a product

  1. On the Catalog page, click Create Service.
  2. Fill the required fields (marked with *): Service Name, Fulfillment Type, Show on customer storefronts, Available Days, Lead Time (Days in Advance), Pricing Model, Unit (except Flat Rate), and Retail Price ($).
  3. Add anything optional: photos, description, tax, variants, badges.
  4. Click Create Service.

Edit or duplicate

  • Click Edit on a product card to change it, then Update Service.
  • Click Duplicate to open a pre-filled copy (named "… (Copy)" and set inactive). Save it with Create Copy. Duplicating carries over pricing, tax, variants, and location availability, so it's the fast path for a second color or a commercial-rate twin.

The red Deactivate button on a product card does not hide the product. It permanently deletes it from your catalog. To take a product out of circulation but keep its history and settings, open Edit and uncheck Active instead.

Pricing models & units

Per Unit, Per Weight, and Flat Rate, plus the unit list (cubic yard, ton, pound, cord, and more).

A product's price is a Pricing Model plus a Retail Price ($), and (for the first two models) a Unit.

The three pricing models

  • Per Unit: price is per unit of the chosen unit. The card reads "per cubic yard", "per ton", etc.
  • Per Weight: also per unit, but flagged as weight-based. The card reads "per ton (by weight)".
  • Flat Rate: one fixed charge regardless of quantity. There is no unit, and the card reads "Flat Rate".

The unit list

For Per Unit and Per Weight, the Unit dropdown offers: Cubic Yard, Ton, Pound (lb), Load, Bag, Cord, Pallet, Bundle, and Unit. New products default to Cubic Yard. Flat Rate products store no unit.

Where the price comes from

Retail Price ($) is the standard rate every customer sees. Per-customer discounts come from rate cards and contract pricing, not from the catalog. A product variant can carry its own price that overrides the base. See Product variants.

Coverage, depth & the cubic-yards math

How the app turns a measured area and a depth into the cubic yards a customer needs.

A product can be ordered two ways, set under Mobile App Ordering in the edit form. A product must offer at least one:

  • Offer Direct Quantity (customer enters units): the "Order" path. The customer types how many units they want, and that number is the quantity.
  • Offer AR Measurement (app measures area): the "Measure" path. The app measures the area in augmented reality and calculates the yards for them.

What Coverage Rate means

When you turn on Offer AR Measurement, you set a Coverage Rate (sq ft per unit). This is the square footage one unit covers at a 2-inch depth, the baseline. The in-form Quick Reference offers common values at 2": mulch/wood chips 162, topsoil/garden mix 108, sand 108, gravel/crushed stone 100, compost 162 sq ft per cubic yard.

The math

With no depth choice, the app divides the measured area by the coverage rate:

  • yards = area ÷ coverage rate

When you turn on Depth Selection and the customer picks a depth, the app scales the coverage for that depth (a deeper layer covers less ground):

  • effective coverage = coverage rate × (2 ÷ depth in inches)
  • yards = area ÷ effective coverage

The result is rounded up, to the nearest 0.1 yard, or to a whole number if the product has Whole Numbers Only on.

This calculation runs in the customer's app at order time, from the Coverage Rate you set here. The server stores your quantity and trusts it. It does not recompute yards. Set the Coverage Rate at the 2-inch baseline, not at your most common depth, or every measured order will be off.

Add variants (colors & finishes)

Offer one product in several colors or finishes, each with its own price and photo.

When you'd do this: one product comes in several colors or finishes (black vs. brown mulch, a paver in three shades) and you don't want a separate catalog row for each.

Steps

  1. Edit the product and scroll to Variants (e.g. colors / finishes).
  2. Click + Add variant.
  3. Enter a Label (for example "Charcoal").
  4. Optionally set a Price for that variant, and upload a variant image.
  5. Repeat for each option, then Update Service.

How variant pricing works

Leave a variant's Price blank and it uses the product's base Retail Price. Enter a price and it overrides the base for that variant only.

A variant row with no Label is dropped when you save. If a variant disappears after saving, it's because its label was blank. Give every option a name.

Compare-at "was" price & badges

Show a strikethrough original price and a label like "Best Seller" on the storefront card.

When you'd do this: you want a product to read as a deal, or you want to flag a standout item on the storefront.

Both controls live under Storefront Merchandising in the product edit form.

Compare-at "was" price

  1. Edit the product and find Compare-at Price ($).
  2. Enter the original price. The storefront shows it with a strikethrough next to the current Retail Price to signal a markdown.
  3. Leave it blank to hide it.

Badge

  1. Type the badge text (up to 40 characters), for example "Best Seller" or "Low Stock".
  2. Pick a tone for its color: Default, Brand, Sale, or Warn.
  3. Choose None on the tone dropdown to remove the badge.

The Compare-at price is cosmetic. It changes only what the card displays. It does NOT discount the charge. The customer still pays the Retail Price (minus any rate-card or contract discount).

Whole-number-only quantities

Force a product to be ordered in whole units by rounding decimal quantities up.

When you'd do this: a product can't be sold in fractions (bags, pallets, bundles), so half an order makes no sense.

Steps

  1. Edit the product and find the Whole Numbers Only checkbox.
  2. Turn it on and Update Service.

With it on, a decimal quantity is rounded up to the next whole number. A measured order that works out to 2.3 yards becomes 3. With it off, measured quantities round up to the nearest 0.1.

Commercial-only products

Hide a product from retail customers so only commercial accounts can see and order it.

When you'd do this: you sell a product only to contractors or wholesale accounts, at a rate you don't want retail shoppers to see.

Steps

  1. Edit the product and find the Commercial Customers Only checkbox.
  2. Turn it on and Update Service.

Once on, the product is only visible on the storefront to customers marked as Commercial. Retail shoppers never see it.

Selling the same material at two rates

There's no retail-vs-commercial price field on a single product. To sell the same material to both at different prices, create a separate product at the commercial rate and turn on Commercial Customers Only for it. The retail product stays untouched.

Per-product tax (default, custom, or exempt)

Set a product to follow your default tax rate, charge a custom rate, or be tax-exempt.

Each product's tax is set under Tax Settings in the edit form, with three options:

  • Use default rate: the product follows your business-wide Default Tax Rate (set in the box at the top of the Catalog page).
  • Custom rate for this service: a fixed rate for this product only, overriding the default.
  • Tax exempt: never charge tax on this product.

How the rate is resolved at order time

When an order is priced, tax is decided in this order:

  1. If the customer is tax-exempt → no tax.
  2. If the product is Tax exempt → no tax.
  3. If the product has a custom rate → that rate.
  4. Otherwise → your Default Tax Rate.

Use default rate stores no number on the product. It's resolved live every time. So when you change your Default Tax Rate, every "Use default rate" product updates automatically.

Resetting everyone to one rate

The Reset all services to a single tax rate box (with Apply to All) stamps one fixed rate onto every product at once.

Apply to All is not the same as the default. It pins a hard number onto every product (including the ones set to "Use default rate"), which severs them from the default. After that, changing your Default Tax Rate no longer reaches them. Also note: a custom 0% is a real 0% rate, not "follow the default". A product shows "follow default" only when it's on Use default rate.

Categories & category ordering

Group products into categories and set the order they appear in on your storefront.

When you'd do this: you want your storefront to show products grouped (Mulch, Gravel, Topsoil) in an order you choose.

Categories are managed on a dedicated page: from the Catalog, click Manage Categories.

Create and assign

  1. Click New Category, enter a Category Name, and create it.
  2. Assign products to it. In board view, drag a product card into the category lane. In list view, use the category dropdown on each product row.
  3. Drag a product back to Uncategorized (or pick Uncategorized in the dropdown) to remove it from a category.

Reorder

Use the arrows on each category lane/header to move it earlier or later. That order is the order customers see on your storefront. Uncategorized products always sort last.

Deleting a category

Deleting a category does not delete its products. They move to Uncategorized.

To change a category's storefront photos, headline, and description, go to Branding → Category Pages. That content isn't edited here.

Fulfillment type & lead time per product

Set how a product can be received (delivery, pickup, drop-off) and how far ahead it must be ordered.

When you'd do this: a product is pickup-only, or needs two days' notice, and you want the storefront to enforce that.

Both settings are in the product edit form.

Fulfillment Type

The Fulfillment Type dropdown sets how a customer can receive this product: Delivery Only, Pickup Only, Drop-off Only, Delivery & Pickup, or All Three (Delivery, Pickup & Drop-off). The choices you enable here also drive the per-type day picker under Available Days.

Lead Time

Lead Time (Days in Advance) is the minimum notice a customer must give, from 0 to 30 days. 0 means same-day ordering is allowed.

Delivery fee profile

Delivery fee profile picks which set of distance-banded delivery zones applies to this product. Leave it on Default (uses your default profile) unless this product needs its own zones.

Per-location product availability

Limit a product to specific yard locations when you run more than one.

When you'd do this: you run more than one yard and a product is only stocked at some of them.

This control appears only when you have locations set up, and only on an existing product (save it first).

Steps

  1. Edit the product and scroll to Location Availability.
  2. Leave it on all locations to offer the product everywhere, or pick the specific locations that carry it.
  3. Update Service.

How "no restriction" is stored

A product with no location restriction is available at every location. That's the default, and it's what "all locations" means. Picking specific locations switches to an inclusion list: visible only where you listed it.

You cannot hide a product at every location through this picker. It rejects an empty selection with "An item cannot be hidden at every location." If a product should be unavailable everywhere, turn off Active or set Show on customer storefronts to Off — office only instead.

Bulk-edit products

Change category, storefront visibility, fulfillment, status, or location availability on many products at once.

When you'd do this: you need the same change across a stack of products: recategorize them, flip them all to pickup, or hide a set from the website.

Steps

  1. On the Catalog, tick the checkbox on each product card (or use Select all at the top of the list).
  2. Click Bulk edit in the bar that appears.
  3. Set only the fields you want to change, and leave the rest on Leave unchanged. Available fields: Category, Storefront visibility, Fulfillment, Delivery fee profile, Status (Active/Inactive), and Change location availability.
  4. Click Apply to [N].

What bulk edit can't touch

Bulk edit deliberately leaves out price, name, variants, and images. Those are per-product only. For a blanket tax change, use the separate Reset all services to a single tax rate / Apply to All box at the top of the page (see Per-product tax).

Change location availability in bulk is a destructive replace. It overwrites each selected product's current location settings rather than adding to them. "All locations" here means available everywhere.

Rate cards (reusable pricing profiles)

Named discount profiles you build once and assign to customers: a blanket discount plus per-category rules.

A rate card is a named, reusable pricing profile you build once and assign to customers, so you don't re-enter the same discount on every account. Rate cards live in the Customers area, not the Catalog. Open Customers and click Rate cards.

What a rate card holds

  • A blanket discount across all products: a percentage or a flat amount off. (A 0% blanket is rejected, since that's no discount at all.)
  • Optional per-category rules: a different discount for a specific product category.

Each customer can be assigned one rate card. A customer's own per-product or per-category contract rules override the card, and "most specific wins": a product rule beats a category rule, which beats the blanket, which beats the card. The card is the customer's baseline when they have no rule of their own.

Not the same as a delivery fee profile

A rate card discounts product pricing. A delivery fee profile (set per product in the Catalog) controls delivery-fee zones, a different thing entirely. Both exist; don't confuse them.

Deleting a rate card doesn't break the customers on it. Their assignment is cleared and they fall back to full retail (minus any of their own contract rules).

Customers

The customer directory

Search, filter, and sort every customer, and switch between the Directory and Contract Pricing views.

When you'd do this: you need to find a customer, or narrow the list to one type, tag, or rep before working on a batch.

The Customers page opens on the Directory view. The toggle at the top switches between Directory and Contract Pricing (the same customer list, re-skinned to show each customer's pricing rules).

Search

The Search customers... box matches name, email, phone, address, city, business name, and ad source in one pass. It needs no exact spelling. A partial match on any of those fields returns the customer.

Filters

  • Type: All, Residential, or Commercial.
  • Tag: click a tag in the tag bar to show only customers carrying it.
  • Sales rep: filter to one rep, or to Unassigned.
  • Active only: hides customers with no order in the last year.

Sort & columns

Click a column header to sort: Orders, Last Order, Total Ordered, plus name, email, and phone. Use the Columns control to show or hide Contact, Address, Type, Ad Source, and Status.

What the Status badge means

Status is computed from the last order date, not set by hand:

  • Active: ordered within the last 365 days.
  • At Risk: last order 366–548 days ago (the re-engagement window).
  • Inactive: more than 548 days, or no orders ever.

A filter you set before a bulk action is not cosmetic. Apply to all matching writes to exactly the set the current filters show (type, tag, rep, search, Active only). Narrow the list first, confirm the preview count, then apply.

Add & edit a customer

Create a customer or edit one: commercial vs residential, and which name shows as the primary label.

When you'd do this: a new account calls in, or you need to correct a customer's details.

Add a customer

  1. On the Customers page, click + Add Customer.
  2. Fill the form. Name and Phone are the only required fields. The phone is normalized and must be unique. A second customer with the same number is rejected.
  3. If you enter an email, it's format-checked; a malformed address is rejected so invoice and receipt emails can't silently bounce.
  4. Click Create Customer.

Edit a customer

Open a customer and click Edit to change any field, then Update Customer.

Commercial vs residential, and the auto-promotion

A customer is Residential or Commercial. The type drives storefront visibility (commercial-only products), filters, and reports.

Entering a Business Name without explicitly choosing a type promotes the customer to Commercial automatically. This happens on create, and on edit when you add a business name to a residential customer. An explicit type choice always wins, so you can keep a residential customer who happens to have a home-business name by setting the type by hand.

Display Name Preference

When a business name is present, a Display Name Preference control appears with two buttons: Personal Name and Business Name. It sets which label leads in lists and on orders. Commercial customers show the business name as the primary label regardless; the preference is what decides for a residential customer who also has a business name.

Adding a business name can silently flip a customer to Commercial, which hides retail-only behavior and changes which products they see on the storefront. If you only wanted to record a company name on a residential account, set the Type back to Residential explicitly after saving.

The customer profile tabs

What each tab in a customer’s profile holds: orders, invoices, payments, addresses, cards, and more.

Click a customer in the Customers list to open their profile. A business name leads the header when present, with the contact name as the subtitle. The tabs across the top, each with a live count where it applies:

  • Overview: contact details, the Contacts section (primary + additional emails/phones), saved-address summary, a pricing-rules summary, and the business Team panel for commercial accounts.
  • Orders (n): every order for this customer, with real invoice payment status.
  • Invoices (n): single-order and consolidated invoices, with Email and Take-payment actions.
  • Payments (n): the payment ledger: dates, amounts, method, and check number. Negative amounts are refunds or reversals.
  • Store Credit (n): the store-credit ledger and balance.
  • Addresses (n): saved delivery addresses.
  • Payment Methods (n): saved cards and bank accounts on file.
  • Recurring (n): recurring billing schedules.
  • AR / Aging: this customer's outstanding balance and aging buckets.
  • Notes: the free-text note and file attachments, plus a manual activity-log entry.
  • History (n): the interaction/activity log for this customer.
  • Pricing Rates (n): the contract-pricing editor; the count is every rule set (blanket + category + per-product).

The Payments tab is the money that actually came through (the payment ledger), while Invoices is what was billed. They won't match on a partially-paid or refunded account. Read Payments for cash received and AR / Aging for what's still owed.

Additional contacts (billing vs operations)

Add extra emails and phones beyond the primary, and tag each one Billing or Operations to route messages.

When you'd do this: a business account wants invoices sent to accounts payable and delivery updates sent to a site foreman, two different people.

The primary email and phone live on the customer record (they sign in to the storefront and are the default on orders). Everything you add here is an additional contact, managed in the Contacts section on the profile Overview tab.

Add a contact

  1. Open the customer and find Contacts on the Overview tab.
  2. Add an email or phone.
  3. Give it a role: Billing, Operations, or leave it blank.

How roles route messages

  • Invoices go to the primary contact plus every Billing contact.
  • Order updates go to the primary contact plus every Operations contact.

An additional contact never changes who signs in. Only the primary does that.

You can't add the same email or phone twice on one customer. The save is rejected as a duplicate. Phones are matched on their last 10 digits, so "(555) 111-2222" and "+1 555 111 2222" count as the same number.

Saved delivery addresses

Keep more than one delivery address per customer and mark one as the default.

When you'd do this: a customer takes deliveries at more than one site: a home and a rental, or several job sites.

Steps

  1. Open the customer and go to the Addresses tab.
  2. Add an address: a label (defaults to "Home"), the street address, and optional city, state, and ZIP.
  3. Tick default to make it the one that's pre-selected on new orders.

How the default works

A customer has at most one default address. Marking a new address as default clears the flag on the old one, so there's never a tie. Addresses list with the default first.

The default address only pre-fills new orders. It never rewrites an address on an order that's already placed. Changing the default here does not touch past or in-flight deliveries.

Cards & bank accounts on file

Save a card or bank account for a customer, and what the 10-day card hold after a charge means.

When you'd do this: a repeat customer wants their card kept on file so you can charge without re-entering it.

Saved cards and bank accounts live on the profile Payment Methods tab.

Add a method

  • + Add Card: collects and saves a card. A card is chargeable immediately.
  • + Add Bank Account (ACH): only appears when ACH is enabled for your business (contact support to enable it). A bank account is saved unverified: it shows a Pending verification badge and can't be charged until the customer confirms the micro-deposits Stripe sends. You can re-send that verification link from the tab.

A customer's first saved method becomes their default automatically. An unverified bank account can never be the default. A default that always fails at charge time is worse than none. Deleting a method also detaches it from Stripe so it can't be charged again.

The 10-day card hold

After you charge a card, BulkTrackPro keeps that card on file for 10 days even if it wasn't saved permanently. The tab labels it "On file for order changes until <date>". This exists so that if you edit the order up within those 10 days, the extra amount can be charged to the same card. A background job detaches the card once the 10 days pass.

A card showing "On file for order changes until <date>" is a temporary hold, not a permanent saved card. It disappears automatically after 10 days. If the customer wants their card kept for future orders, save it explicitly with + Add Card rather than relying on the hold.

Recurring billing schedules

Where recurring schedules live, and why setting up new ones is paused right now.

A recurring schedule repeats an order template on a cadence and can auto-charge a saved card. Existing schedules appear on the profile Recurring tab.

Current state: setup is paused

Creating, editing, or manually running a recurring schedule is temporarily unavailable. Attempting it returns: "Recurring deliveries are temporarily unavailable while we make some updates. Please check back soon." Viewing existing schedules is unaffected, and the daily cron runs no auto-charges while this is paused. The pause is in place pending the disclosure and consent capture that auto-charge subscriptions require.

What they do when enabled

When recurring billing is active, a schedule carries an order template (which must have at least one line item), a frequency and start date, and an optional saved card for auto-charge. Auto-charge is card-only. A bank account (ACH) settles over 3–5 business days and can't be attached to a schedule.

Don't promise a customer a recurring auto-charge today. New schedules can't be created while the feature is paused, and the Recurring tab only lets you view what already exists.

Contract pricing: the four layers & precedence

Per-product override, category rule, blanket rule, and rate card, and the exact order that decides a price.

A customer can carry four kinds of pricing rule, edited on the profile Pricing Rates tab. When an order is priced, the rules are checked in order and the most specific one wins:

The order of precedence

  1. Per-product override: a rule for one specific product. Either an absolute fixed price or a percent off. A fixed price wins even over a priced variant.
  2. Category rule: "X% off all Mulch" (or a flat $ off per unit) for the product's category. Beats the blanket; loses to a per-product override.
  3. Blanket rule: one rule across all products: a percent off all or a flat $ off all.
  4. Rate card: a named, reusable profile assigned to the customer. The card's blanket and category rules act as the baseline defaults; the customer's own rules above override them.

If no rule applies, the customer pays the catalog retail price.

The 0% "suppress" rule

A per-customer rule set to 0% is a deliberate "no discount" signal. It forces retail for that product or category and stops lower layers from re-discounting, which is useful to override a rate card's default back to full price for one line. It shows full price with no discount badge.

Rules are live, not frozen

A blanket rule is re-evaluated from the product's current price every time, never snapshotted. Change a catalog price and every "percent off" customer reflects it instantly, with no per-customer rewrite.

Each customer can have one rate card. The card is only the baseline. The customer's own blanket, category, and per-product rules sit on top of it. Setting a customer's blanket to a value replaces the card's blanket for that customer; it does not stack with it.

Bulk pricing & assignment

Apply a blanket discount, assign a rate card, or set type/rep/location across many customers at once.

When you'd do this: you negotiated a blanket rate for all contractors, or need to hand a stack of accounts to a new sales rep.

From the Customers toolbar:

Bulk pricing (blanket) and Rate cards

  1. Click Bulk pricing (to set a blanket percent/flat rule) or Rate cards (to assign a reusable card).
  2. Choose the target: everyone, commercial, residential, wholesale, a tag, or the currently filtered list.
  3. Optionally turn on skip existing to touch only customers who don't already have a pricing rule, protecting hand-negotiated rates.
  4. Click Apply to all matching to see the count, then apply.

Bulk-assign type, rep, or location

Turn on select mode, tick the customers you want, then set Type, Sales rep, and/or Location in one update.

Apply to all matching writes to exactly the set your current filters show, including the Active only filter. A rep-filtered or tag-filtered view writes only to those customers; an unfiltered view writes to everyone. Always read the preview count before applying, because there's no undo.

Skip existing means "customers with no rule at all": that includes a blanket, a rate card, a per-product override, or a category rule. A blanket rollout with skip-existing on will leave every one of those accounts untouched, which is the point: it won't silently reprice a negotiated account.

Tags & the Tax-Exempt system tag

Build a tag library, tag customers, and understand the special Tax Exempt tag that flips tax on and off.

When you'd do this: you want to segment customers ("VIP", "Net-30", "Snow Removal") and filter the directory by those labels.

Build and apply tags

  1. On the Customers page, use the tag bar to filter by an existing tag.
  2. Click Manage tags to rename, recolor, or delete tags (and create new ones).
  3. Open a customer and assign tags on their profile.

The Tax Exempt system tag

Every partner has one built-in Tax Exempt system tag (shown in purple). It behaves differently from your own tags:

  • It can't be renamed or deleted. Only its color can change. Your own tags can be renamed, recolored, and deleted freely.
  • It's wired to the customer's tax setting both ways. Assigning the Tax Exempt tag sets the customer tax-exempt; removing it un-exempts them. The reverse is also true. Ticking Tax Exempt in the edit form adds the tag, and unticking it removes the tag.

The Tax Exempt tag and the Tax Exempt checkbox are two views of the same switch. They stay in sync. Don't treat the tag as a cosmetic label: adding it stops tax from being charged on that customer's orders.

Finding & merging duplicate customers

Spot likely-duplicate records, review a pair, and merge the duplicate into the survivor without losing history.

When you'd do this: the same customer got entered twice (once from a phone order, once from the storefront) and their history is split across two records.

Finding duplicates

When likely duplicates exist, a banner on the Customers page reads "N possible duplicate customers found" with a Review duplicates button. A pair is flagged when two live customers share any of: a phone number (matched on the last 10 digits), an email, or a name. You review one pair at a time.

For each pair the system picks the survivor (the record that's kept) as the one with more orders; ties break to the older record. If a pair isn't actually a duplicate, click Not a duplicate and it won't resurface.

Merging

Merging shows a preview first: which fields conflict (with a per-field chooser), how many orders, invoices, addresses, cards, and other rows will move, and any warnings. On merge, all of that history repoints to the survivor and the duplicate is archived. Saved cards keep working because each card carries its own Stripe reference.

You can't delete a customer who has orders, invoices, estimates, store credit, or promotions. The delete is blocked. Merge the duplicate into the survivor (or deactivate the record) instead; merging preserves every linked record, deleting would orphan it.

A merge is a one-way repoint. Review the field chooser and the row counts in the preview before you confirm. It writes an undo snapshot, but the clean path is to get the survivor and field choices right the first time.

Notes, interactions & attachments

Keep a free-text note, attach files, and read the activity log on a customer.

When you'd do this: you want to record a standing instruction ("gate code 4471"), attach a signed tax certificate, or see what's happened on an account.

Notes & attachments

On the profile Notes tab:

  • Customer Notes: click Edit Notes, type, and Save Notes. This is the free-text note that stays with the customer.
  • Attachments: click + Upload File to attach images (JPG, PNG, GIF, WebP) or PDFs, up to 20 MB each.
  • Log a manual note: record a dated entry into the activity log.

The activity log

The History tab is the interaction log, a dated, read-only trail of what's happened on the customer (and any manual entries you logged). It's the record to check when you need to know who did what, and when.

Attachments are capped at 20 MB per file and accept only images and PDFs. A larger file or a different type (a spreadsheet, a Word doc) is rejected with a clear message. Convert or export to PDF first.

Sales reps (labels, not logins)

Create the rep names you assign to customers and orders for ownership and commission tracking.

When you'd do this: you track which team member owns each customer and gets credit for each order.

Manage reps

On the Sales Reps page:

  1. Click Add Sales Rep and enter a name.
  2. Rename a rep inline, or toggle a rep active/inactive.

You then assign a rep to a customer in the edit form (or in bulk, see Bulk pricing & assignment).

Reps are not login accounts

A sales rep is an internal label, as the page says: "Reps are not login users." Creating a rep does not create a staff account or grant anyone access. It only gives you a name to attach to customers and orders.

A rep can be deactivated but never hard-deleted. Orders hold a reference to their rep so historical reports stay stable. Deactivating hides the rep from the assignment picker while keeping every past order's credit intact.

B2B team accounts for a business customer

See and manage the staff who can sign in and order under a commercial customer’s account.

A commercial customer can have a team, the staff who sign into the storefront and order under that business's account. You see it in the Team panel on the profile Overview tab ("staff who can sign in & order for this business").

How the team works

  • The Owner is minted when the business's contact first signs into the storefront. The owner can't be removed or demoted from here.
  • Members are added by invitation. Each member can be granted Can order (place orders) or not.
  • The roster reflects live state. Members who joined through the storefront show up here too.

Inviting is currently gated

Sending team invites is not enabled for every account yet. When it's off, the panel shows "Team invites aren't enabled yet for this account. The roster below is read-only." You can still view who's on the team; you can't invite or change members until it's enabled.

The Team panel is for a business customer's staff logins. It's not the same as additional contacts, which are extra emails/phones for routing invoices and updates. A team member signs in and places orders; a billing contact only receives copies.

Importing customers by CSV

Bulk-load your customer list from a spreadsheet. Name and Phone are the required columns.

When you'd do this: you're moving in from another system and have your customers in a spreadsheet.

Steps

  1. Go to Import Customers from CSV.
  2. Upload your file. Columns are auto-detected and mapped. Review the mapping and fix any that are wrong.
  3. Map every field you want to bring in: Customer Name, Phone, Email, Business Name, Address, City, State, ZIP Code, Customer Type, Notes, and Ad Source / Lead Source.
  4. Start the import. Large files run in the background, so you can leave the page and come back.

Name and Phone are required

The import won't start until both the Name and Phone columns are mapped: "Map both the Name and Phone columns before importing — they are required." Every other field is optional. A row missing a name or phone, or with an unparseable phone, is skipped and reported.

What else to know

  • Re-importing the same file is safe. Customers are de-duplicated by phone number, so a second upload skips the ones already imported.
  • Customer Type is normalized. Free-text values like "COMM", "Business", or "Contractor" map to Commercial; everything else maps to Residential.
  • Imported customers are created with SMS consent unset (transactional texts still send, no marketing) and sign in via the storefront one-time code. No password is set.
  • The file size cap is 15 MB.

This self-serve import brings in customers (and optionally your service catalog) only, not order history, payments, or lifetime totals. Those are a paid managed migration handled by the BulkTrackPro team; don't expect past orders to appear after a self-serve import.

Nonprofit auto-exempt tax

Why selecting Nonprofit stops tax automatically while Resale only labels the Tax ID.

The customer edit form has an Exemption Type dropdown with three choices: —, Resale, and Nonprofit. The two real types are treated very differently, because tax law treats them differently.

Nonprofit auto-exempts

Selecting Nonprofit marks the customer tax-exempt the moment you save, with no separate step. A nonprofit is an entity-based exemption, so the app flips the customer's tax-exempt flag for you, and no tax is charged on their future orders.

On an edit, the auto-exempt only fires on a genuine switch to Nonprofit (the stored type wasn't already Nonprofit). Re-saving a customer whose type was already Nonprofit doesn't re-flip anything, and dropping or changing the type never force-clears the exemption. You can still un-exempt by unticking the Tax Exempt box.

Resale stays manual

Selecting Resale does not stop tax. Resale is a per-transaction exemption in law, so the type only labels the customer's Tax ID on the invoice (shown as "Tax ID (Resale)"). To actually stop charging tax on a resale customer, tick the Tax Exempt box yourself.

Picking Resale does not make a customer tax-exempt. Only the Tax Exempt checkbox (or Nonprofit) does that. If you set a reseller's type to Resale and expect their orders to come out untaxed, they won't, until you also tick Tax Exempt.

Taking Orders

Create an order

Build a new order for a customer from the dashboard.

When you'd do this: a customer calls or walks in and you're taking the order yourself.

Steps

  1. Go to Create Order.
  2. Pick the customer (or add a new one inline).
  3. Add line items: choose the product and the quantity (fractional quantities like 0.5 yards are fine).
  4. Set the fulfillment type (delivery, pickup, drop-off, or transfer) and the schedule.
  5. Choose how to collect: take payment now (card / ACH / reader / cash) or bill the customer (creates an invoice).
  6. Save, or save a draft to finish later.

A draft intentionally skips inventory, invoicing, and customer notifications until you finalize it.

Add a PO number to an order

Attach a purchase-order number so it shows on the order and invoice.

When you'd do this: a commercial customer requires their PO number on the paperwork.

Steps

  1. On the Create Order form (or when editing an existing order), find the PO number field.
  2. Type the customer's purchase-order number.
  3. Save the order.

The PO number is searchable on the Work Orders list and prints on the order and invoice PDF.

On a consolidated invoice (several orders billed together), each order keeps its own PO number in the itemization.

Editing an order & how the money reconciles

What happens to the money when you change the total on a paid or authorized order.

When you'd do this: a job changes after it's placed: more material, a dropped line, a corrected price.

When you save an edit, BulkTrackPro recomputes the total (including tax) on the server and reconciles the money for you:

If the order is already paid

  • Total goes down → a partial refund is issued automatically.
  • Total goes up, card on file → the difference is charged automatically.
  • Total goes up, no saved card → the order is flagged awaiting payment and the customer is emailed a payment link.
  • No payment on file → the order updates and no money moves.

If the order is still an authorized hold (not yet captured)

  • Total goes down → the hold can't shrink, so the capture later takes only the smaller amount.
  • Total goes up → BulkTrackPro re-authorizes a saved card for the new amount; if it can't, it sends a payment link and marks the order awaiting payment.

Preview before you commit

The edit screen shows the exact refund or charge (the server's real number) before you save.

Editing an order does NOT change your inventory. Changing quantities re-prices and re-charges, but it does not adjust stock levels. Adjust inventory separately.

On a cash, check, or manually-marked-paid order, editing the total down is blocked. There's no card to refund to, so issue the refund manually instead.

Fulfillment types: delivery, pickup, drop-off, and transfer

What the four ways to fulfill an order change about fees, address, and scheduling.

On the Create Order form, the first card is Fulfillment, and its Delivery or Pickup? picker is what drives the rest of the order: which fees apply, whether an address is required, and how scheduling works.

The three you pick on the form

  • Delivery: you deliver to the customer. A delivery address is required, and distance, zone, and minimum-order fees are calculated automatically.
  • Pickup: the customer collects at your yard. No delivery address, and no automatic delivery fees.
  • Drop-off: you drop material at a site without the full delivery workflow. Like pickup, it carries no automatic delivery fees; add any charge with Add Custom Fee.

Transfer: the fourth type, started elsewhere

A transfer is an internal stock move between two of your locations. It is not in the Delivery or Pickup? picker. You start a transfer from Inventory. A transfer has no customer and no fees; you pick a Source (load from) and a Destination (deliver to), which must be two different locations.

Why the type matters

The fulfillment type is chosen before customer and items on purpose: it decides whether the address block appears, whether delivery fees auto-compute, and which time slots load.

Distance and minimum-order fees apply to deliveries only. On a pickup or drop-off, those automatic fees never attach. If the customer owes a flat or handling charge, add it with Add Custom Fee or it won't be billed.

Add line items (including fractional quantities)

Add products and services to an order and enter half-yard and other partial quantities correctly.

When you'd do this: you're building an order and need to add what the customer is buying.

Steps

  1. On the Create Order form, go to the Order Items card.
  2. Use Add Service to pick a material or service from your catalog (type to search).
  3. In the Quantity column, enter the amount. Partial amounts are allowed. Type 0.5 for half a yard, 1.5 for a yard and a half.
  4. The unit of measure (yard, pallet, bag, and so on) shows under the quantity so you can confirm what you're counting.
  5. The Price column defaults to the catalog price. Type over it to charge a one-off price for this line.

Fractional quantities are real quantities

A quantity like 0.5 is priced as exactly half the unit price. 0.5 of a $200 yard is $100. The order, invoice, and any charge all carry the same fractional figure.

The quantity field's form minimum is 0.1; the server caps quantity at 100,000 and an overridden price between $0 and $1,000,000. Enter fractional amounts as a decimal in the quantity field; never round a half-unit up to 1 to "make it work," because that charges the customer for a full unit.

Add fees to an order

How automatic delivery fees work and how to add or override a fee by hand.

When you'd do this: an order needs a charge beyond the material price: a rush fee, a handling charge, or a manual delivery fee.

Automatic delivery fees

On a delivery, the server calculates distance, zone, and minimum-order fees for you and shows them in the live total. You don't add those by hand. On a pickup or drop-off, no delivery fees attach automatically.

Override the delivery fee

On a delivery, the Delivery Fee field lets you type a dollar amount to replace the auto-computed fee. The row is marked manual and the automatic fee is suppressed. Leave it blank to charge the automatically-calculated fee, or use Use auto fee to go back.

Add a one-off charge

  1. In the Additional Fees card, click Add Custom Fee.
  2. Enter a Fee name (for example, "Rush fee"), an optional Description, and an Amount.
  3. The fee joins the live total.

There are no preset fee buttons. A one-off charge goes through Add Custom Fee, available on every customer-facing fulfillment type (delivery, pickup, drop-off) but not on internal transfers. A hand-added copy of an automatic delivery-type fee is dropped on save, so don't try to re-create distance or minimum-order fees by hand. Each fee amount must be between $0 and $1,000,000.

Schedule a delivery or pickup

Set the date and time slot for an order, and what a full slot means.

When you'd do this: you're placing an order and need to pin down when it happens.

Steps

  1. On the Create Order form, open the Delivery Information card (it reads Pickup Information on a pickup, Transfer on a transfer).
  2. Set the Delivery Date (or Pickup Date / Transfer Date). A past date is accepted and marked Backdated.
  3. Open the Delivery Time (or Pickup Time) picker. It loads the time slots available for that date, each showing how many of its spots are taken, for example (2/5).
  4. Pick a slot. If no slots are configured for the date, the field becomes a free-text box reading Select a date first or enter custom time.

A slot marked (FULL - 5/5) is at capacity. The picker lets you see the load before you commit so you don't stack another stop onto a slot that's already full.

Collect payment now vs bill the customer

The two groups of payment choices when you create an order and what each one does.

At the bottom of the Create Order form, How do you want to handle payment? splits into two groups: Collect payment now and Bill the customer. Your choice sets what happens the instant you create the order.

Collect payment now

These create the order and immediately take money:

  • Cash and Check / Other: record the tender by hand (cash shows change due).
  • Charge on reader: tap or insert the card on your in-person reader (shown only when you have a reader registered).
  • Card on file / New card: charge a saved card, or key a new one at the front desk.
  • Bank on file (ACH) / ACH: debit a bank account; ACH settles in 3–5 days rather than instantly.
  • Store Credit (and Store Credit + card): apply the customer's credit first, bill or charge any remainder.

Bill the customer

These create the order without collecting:

  • Invoice now: creates the order and generates an invoice.
  • Bill later: creates the order with no invoice yet; it shows in AR as unpaid until you bill it.
  • Send payment link: creates the order and sends the customer a secure link to pay online, by email, text, or both.

The primary button names what it will do: Create & Take Cash, Create & Invoice, Create & Send Link, and so on.

Bill later does not create an invoice, so nothing is sent to the customer and nothing lands in QuickBooks until you invoice it. If you expect a bill to go out, choose Invoice now or Send payment link instead.

Save an order as a draft

Why a draft collects no money, holds no inventory, and sends nothing until you finalize it.

When you'd do this: you're part-way through an order and need to step away without committing it.

A draft is an unfinished order. On the Create Order form, Save Draft stores it without creating an invoice or notifying the customer.

What a draft deliberately skips

Until you finalize it, a draft does none of the things a real order does:

  • No invoice is created.
  • No inventory is deducted, and the oversell block is skipped. You can save a draft even when stock is short.
  • No customer notifications (the "Order Received" email or text) are sent.
  • No card is charged and no allotment or store credit is drawn.

Resuming and finalizing

Open a saved draft from the Drafts panel and click Resume. Saving again replaces the existing draft; creating the order removes it from Drafts. A draft can't be flipped to a live status from the order list. You finalize it by creating the order so every side effect runs in order.

A draft reserves nothing. Because it skips the oversell check, a draft saved against short stock will still need enough inventory when you finalize it. The stock check runs then, not at save.

Order statuses and the order lifecycle

Every order status, what moves an order between them, and the two states you cannot jump out of.

An order carries two separate states: its status (where it is in the workflow) and its payment status (where the money is). They move independently.

Order status

  • Draft: an unfinished order. No invoice, inventory, charge, or notifications. Finalized by creating the order, not by a status change.
  • Pending: created and awaiting confirmation.
  • Confirmed: committed. Confirming an order for the first time captures any authorized card payment.
  • Completed: fulfilled.
  • Cancelled: voided; see Cancel an order.

A manual order is born Confirmed (or Draft if you save it as one); an online order comes in Confirmed.

Payment status (the pill on the order)

  • Card Held: a card is authorized but not yet charged.
  • Paid: collected.
  • Unpaid: nothing collected yet.
  • Refunded: money returned.
  • Voided: an authorization released without a charge.

Delivery badges

Once a driver is involved, the order also shows a delivery badge: Assigned, Out for delivery, Arrived, or Delivered.

Two transitions are blocked on purpose. A draft can't be moved to a live status from the order list: "Finalize the draft before changing its status." A cancelled order can't jump straight to confirmed or completed. Set it back to Pending (re-open) first. Both guards exist so a half-finished or voided order can't be resurrected onto a driver's board without its side effects running.

Cancel an order (and what happens to the money)

How to cancel an order and exactly how the refund behaves for card, ACH, cash, and store credit.

When you'd do this: an order isn't happening and needs to be backed out cleanly.

To cancel, open the order on the Work Orders page and set its status to Cancelled (from the status buttons or the status dropdown). Cancelling also releases any active driver assignment and returns the order's inventory.

What happens to the money, by payment type

  • Card, still an authorized hold (not captured) → the hold is released, no charge; the order's payment shows Voided.
  • Card, already charged → a full refund is issued automatically and the partner transfer is reversed. It's protected against double-refunding.
  • ACH (bank), still settling → the cancel is blocked until the debit clears (3–5 business days). Wait for it to settle, then refund it.
  • Cash, check, or a manually-keyed card → the order's invoice is voided and the order is marked refunded, but no money moves automatically. You get a signal that a manual refund is owed, and you hand the cash back yourself.
  • Store credit or a prepaid allotment → restored to the customer's balance. A card refund on the same order covers only the card portion, so nothing is double-returned.

An order on a combined (multi-order) invoice can't be cancelled directly. You'll be told to void or rebuild that invoice first, then cancel the order. This avoids the money bugs that come from re-splitting a shared invoice.

Complete an order, reschedule it, or resend the confirmation

The order-detail actions for marking an order done, changing its date, and sending the confirmation again.

When you'd do this: an order is live and you need to close it out, move its date, or get the confirmation back in front of the customer.

Mark an order complete

Open the order on the Work Orders page and set its status to Completed from the status controls.

Confirm a pending order

On a pending order, click Confirm Order. If the order has a card on hold, the button reads Confirm & Charge. Confirming captures the held card.

Reschedule

In the order detail, click Reschedule to change the delivery date and time.

Resend the confirmation

In the order detail, click Send Confirm to send the order confirmation to the customer again by email or text.

Confirm & Charge collects the held card the moment you confirm. If the authorized hold is less than the current order total, the capture is blocked rather than charging a wrong amount. Reconcile the total first.

Refund an order (full, partial, or as store credit)

Issue a refund from the order and choose whether it goes back to the card or to store credit.

When you'd do this: a customer is owed money back on a paid order.

Steps

  1. Open the paid order on the Work Orders page.
  2. Click Issue Refund.
  3. Under Refund Type, choose Full Refund or Partial Refund. For a partial, enter the Refund Amount (the form shows the Max you can refund).
  4. Pick a Reason: Requested by customer, Duplicate order, Fraudulent charge, Order cancelled, or Other.
  5. To return the money as credit instead of to the card, check Issue as store credit instead of refunding to card/cash. This adds the amount to the customer's store credit balance; no money leaves the business.
  6. Leave Notify customer by email checked to email them, then confirm.

A refund to the original payment method can't be undone and appears for the customer within 5–10 business days. A card refund can claw back part of the payout you already received for that order; a store-credit refund keeps the funds and records what you owe the customer instead.

Record a payment, send a pay link, or charge a card

Every way to collect on an unpaid order: cash or check, a payment link, a keyed card, or an in-person reader.

When you'd do this: an order is unpaid and you need to collect on it after the fact.

Open the unpaid order on the Work Orders page. The detail panel offers the collection options for that order:

Record a cash or check payment

Click Record Payment (cash/check) and enter the tender and any reference number.

Send a payment link

Click Send payment link to send the customer a secure link to pay online. Choose Send via Email, Text, or Both. Texting needs a phone on file and SMS enabled; it skips gracefully otherwise.

Charge a card

Click Enter card manually to open Collect Card Payment and key the customer's card at the front desk.

Charge on a reader

If you have a reader registered, click Charge on reader (POS) and tap or insert the customer's card.

Payment actions appear only while the order is unpaid. Recording a cash or check payment logs money you collected outside the system. It does not move funds through BulkTrackPro, so only record what you've actually taken in.

Delete an order (drafts only)

Why only drafts can be deleted and everything else must be cancelled.

When you'd do this: you want a stray order gone entirely, not only voided.

Only a draft with no recorded payments can be deleted. Open the Drafts panel on the Create Order form and click Delete on the draft ("Delete this draft? This cannot be undone.").

Everything else is cancelled, not deleted

A real order can't be deleted. If you try, the server returns: "This order has financial records (invoice and/or recorded payments) and cannot be deleted. Cancel the order instead (this voids its invoice and issues any refunds)."

Deleting is blocked for a reason: a hard delete would also destroy the order's invoice and every recorded payment row, silently wiping that day's cash, tax, and settlement reports. Cancel the order instead. It voids the invoice and issues any refunds cleanly.

The Work Orders list: filters, badges, and export

Find orders with the filters, read the badges, and export the filtered list to CSV.

The Work Orders page lists and tracks every customer order.

Tabs

  • All Orders: everything.
  • Pending Confirmation: orders waiting on you to confirm.
  • Estimates: your saved estimates.

Filters

  • Search: by order number, customer name, email, phone, or P.O.
  • Status: All, Pending, Confirmed, Completed, Cancelled.
  • Type: All, Delivery, Pickup, Drop-off, Transfer.
  • Service: narrow to orders for one service.
  • Date: All Time, Today, This Week, This Month, or a Custom Range.
  • Amount: an exact total, or a Min/Max range.

Badges you'll see on a card

  • Status: Pending, Confirmed, Completed, Cancelled.
  • Fulfillment: Delivery, Delivery + Install, Pickup, Drop-off, Transfer.
  • Source: Online, Manual, or From Estimate; customer type Commercial / Residential.
  • Delivery: Assigned, Out for delivery, Arrived, Delivered, or No driver assigned.
  • A card-hold pill reads Card Held — Confirm to charge.

Export and print

CSV downloads the currently filtered orders as a spreadsheet; Print prints the filtered list.

The CSV and Print both act on the orders as currently filtered, not the whole book. Set your Status, Type, and Date filters first, then export, or you'll get a different set than you expect.

Placing an order outside your delivery area

What the out-of-area warning means and how staff can create the order anyway.

When you'd do this: a customer's address falls beyond your delivery zones and the form flags it.

When you enter a delivery address outside your area, the live total shows one of two warnings:

  • Deliverable but beyond your zones: "This address is outside your delivery area — no delivery fee will be applied. You can still create the order."
  • Not deliverable: "This address is outside your delivery area and can't be delivered. Change the address, switch to pickup, or set the delivery fee manually."

The staff override

On the first case, staff can place the order anyway. When you click Create, a confirm appears: "This address is outside your delivery area — no delivery fee will be applied. Create the order anyway?" Clicking OK authorizes it. The server records the override, not the dialog alone.

A customer placing an order through your online store is hard-rejected server-side for an out-of-area address; only staff on the dashboard can override.

The override applies at create time. Editing an existing order does not carry it, so an out-of-area address can't be saved onto an order through an edit. Set the fee manually or switch the order to pickup instead. An out-of-area order carries no delivery fee, so add any charge you intend to collect with Add Custom Fee.

The Order Map and TV / kiosk mode

See a day's deliveries plotted on a map, and put it full-screen on a wall display.

When you'd do this: you want to see where the day's deliveries are, or put a live board on a screen in the shop.

The Order Map

Open Order Map to see the day's deliveries laid out geographically, color-coded by status, alongside depots and live drivers.

  1. Set the date and how many days forward to include (1 day, 3 days, 7 days, or 14 days).
  2. The legend doubles as a filter. Click a status to show or hide it: Scheduled (gray), Assigned (blue), On the way (orange), Delivered (green). Live drivers can be toggled too.
  3. Use the refresh button to pull the latest.

TV / kiosk mode

Click TV mode to open the map full-screen with no dashboard chrome, sized for a wall display, with larger pins. It auto-refreshes every 60 seconds so the board stays current untouched. Click Exit to return to the standard map.

TV mode drops the date and day-range controls. It always shows the live board. To change the date or range, use the standard Order Map, not the kiosk view.

Estimates

Create an estimate

Build a quote a customer can review and e-sign before it becomes an order.

When you'd do this: a customer wants a written quote they can approve before you book the job.

Estimates live on the Orders page, under the Estimates tab.

Steps

  1. Open Orders and click the Estimates tab.
  2. Click New Estimate.
  3. Enter the customer. Pick an existing one or type a new name, email, and phone. A new name with an email is saved as a customer automatically.
  4. Set the fulfillment type (delivery, pickup, or drop-off) and, for delivery, the delivery address.
  5. Add line items. Pick from the catalog (Search products & services…) or type a custom Item name, Qty, and Unit Price. Fractional quantities (0.5 yards) are fine.
  6. Add any Additional Fees. Use + Delivery Fee under Quick Add Fees, or Custom Fee for a one-off.
  7. Set the Valid Until date if the price should expire.
  8. Click Save Estimate.

A new estimate is saved as a Draft. It is not yet visible to the customer and cannot be signed until you send it.

Notes typed in the estimate print on the customer's PDF; Internal Notes do not. Don't put anything customer-facing in Internal Notes.

Line items, fees & the per-estimate tax mode

How an estimate is priced, and the one-off tax control that decides whether and when sales tax is charged.

When you'd do this: you're quoting a tax-exempt customer, or a job where tax should be added later, and need the estimate to show the right number.

An estimate total is the sum of line subtotals (quantity × unit price) plus Additional Fees, with sales tax layered on by the server. That is the same tax math the converted order uses, so the quote can never show a different tax than the order it becomes.

The per-estimate tax mode

In the estimate editor, the No sales tax on this estimate toggle opens three behaviors (stored per estimate):

  • Standard (toggle off): tax follows your business setting. If Show tax on estimates is on, the estimate shows and charges sales tax; if off, it shows no tax. This is the default.
  • Tax exempt: "No tax on the estimate or the final order. The total shown is final." No tax on the estimate, and the converted order is forced fully tax-exempt too.
  • Tax added at invoicing (defer): the estimate shows the pre-tax price with a Plus applicable sales tax, added at invoicing. note. Normal tax is then applied when it becomes an order.

Why this matters for money

Exempt and Tax added at invoicing both display no tax on the estimate, but they are not the same thing. Exempt charges no tax, ever. Defer charges the customer normal tax on the final order even though the quote looked tax-free. That is deliberate, and the "added at invoicing" note is what tells the customer.

Tax exempt here is a one-off for this estimate, not the customer's profile. For a customer who is genuinely tax-exempt on everything, mark them Tax-Exempt on their customer profile instead. This toggle only affects this one estimate.

Once an estimate is signed or converted, the tax mode is locked. You can't retroactively re-tax or un-tax a total the customer already signed.

Valid-until date & expiry

Set a date after which the quoted price is no longer approvable.

When you'd do this: your pricing is only good for a set window and you don't want a stale quote approved weeks later.

Steps

  1. Open the estimate in the Estimates tab and edit it.
  2. Set the Valid Until date.
  3. Save.

The date is optional. Leave it blank and the estimate never expires on its own.

How expiry works

An estimate is treated as expired once its valid-until date is strictly before today (in your business's time zone). An expired estimate:

  • shows an Expired badge in the office list;
  • shows the customer "This estimate has expired. Please contact us for an updated quote." on the signing page, with approval disabled;
  • cannot be signed by the customer.

Sending is blocked past the valid-until date. Trying to email an expired estimate returns "This estimate has expired. Update its valid-until date first." Push the date out (or clear it), then send again.

Send an estimate (what makes it signable)

Email or share the review-and-sign link, and the one status change that unlocks signing.

When you'd do this: the quote is ready and you want the customer to review and approve it.

Steps

  1. Find the estimate in the Estimates tab.
  2. Click Email to send the review-and-sign link to the customer's email address, or Copy Link to paste it yourself, or Send via SMS to text it (needs a customer phone).
  3. The estimate moves from Draft to Sent.

Only a sent estimate is signable

A Draft cannot be signed, even if someone has the link. The customer signing page only accepts an approval when the estimate is in the Sent state. Clicking Email is what promotes a draft to Sent, so the first email is also what unlocks signing. Copy Link on a draft hands over a link that won't approve until the estimate has been sent.

The emailed total is computed live at send time, so it matches exactly what the customer sees and signs on the page.

Email needs a customer email on file. Without one, the Email button is disabled ("No customer email"). Add an email to the customer, or use Copy Link / Send via SMS instead.

Re-sends are debounced: a second send within 15 seconds is refused with a "wait a few seconds before re-sending" message, so a double-click can't email the customer twice.

Customer e-signature & approval

What the customer does on the signing page, and what BulkTrackPro records as the binding approval.

When you'd do this: you want to understand what the customer signs and what proof you're left holding.

On the shared link the customer sees the line items, fees, and total, then an Approve this estimate block. To approve they must:

  • type their full legal name ("Type your full legal name");
  • draw a Signature on the pad ("Draw your signature using your mouse or finger."); and
  • when your business has terms set, tick I have read and agree to these terms & conditions.

Clicking Approve Estimate records the approval. BulkTrackPro captures the typed name, the drawn signature image, the signer's IP address, a timestamp, and a snapshot of the exact terms text they agreed to.

What gets locked at signing

Approving does more than flip a status. At sign time the server locks the total the customer signed and freezes the full per-line tax breakdown onto the estimate. That frozen total is what the order is later billed. See Convert an approved estimate to an order.

Approving does not create an order

A signed estimate becomes Approved and waits for your office. It does not auto-create an order, charge a card, or send an invoice. You convert it when you're ready.

The signature is rejected unless it's real. A typed name alone won't approve it, and the drawn signature must be an actual image the server can decode. An empty or garbage pad is refused with "A valid drawn signature is required to approve this estimate." The terms checkbox is required only when your business has terms configured.

Convert an approved estimate to an order

Turn a signed estimate into a pending order billed at the exact total the customer signed.

When you'd do this: the customer has signed and you're ready to book the job.

Steps

  1. Open the Approved estimate in the Estimates tab.
  2. Click Convert to Order and confirm.
  3. A new pending order is created and linked back to the estimate, which becomes Converted.

Converting also generates the order's invoice (so it shows under Invoices & AR) and, if you're on QuickBooks sync, exports it.

Signed = billed

The order is billed the exact total the customer signed, the frozen total locked at signature. If someone changes your tax rate or the "Show tax on estimates" setting between the signing and the conversion, the order still charges the signed amount, not a freshly recomputed one. The signed per-line tax is replayed onto the order too, so your sales-tax reporting reflects what was actually collected.

The one exception is the Tax added at invoicing (defer) mode: that estimate was quoted pre-tax on purpose, so the converted order applies current tax on top, exactly what the "added at invoicing" note told the customer.

Only an approved estimate converts

Draft, Sent, and Expired estimates can't be converted, only Approved ones. Converting is idempotent: clicking twice won't create two orders.

A Delivery estimate needs a delivery address to convert. Without one you'll get "This estimate is set to Delivery but has no delivery address." Add the address to the estimate first. A convert is also hard-blocked if a line would oversell tracked inventory at the fulfilling location.

Editing a signed estimate voids the signature. Changing a signed (Approved) estimate clears the e-signature and returns it to Draft. It must be re-sent and re-signed, because a captured signature must never stay attached to numbers it didn't sign. A Converted estimate can't be edited at all (edit the order instead), and a signed or converted estimate can't be deleted.

Estimate statuses

What each estimate status means and how an estimate moves between them.

The badge on each estimate card shows where it is in its life.

Statuses

  • Draft: created but not yet sent. Editable; not visible to the customer and not signable. You can send or delete it.
  • Sent: emailed to the customer. Still editable, and now signable from the link.
  • Approved: the customer e-signed it. The total is locked. Waiting for the office to Convert to Order. Can't be deleted (it holds the signed record); editing it voids the signature and returns it to Draft.
  • Converted: turned into an order. Linked to that order ("Converted to order #…"). Can't be edited or deleted.
  • Expired: the valid-until date has passed. Not signable until you extend the date. (This is derived from the date, not a state you set.)

How it moves

  1. Draft → Sent when you email it.
  2. Sent → Approved when the customer signs.
  3. Approved → Converted when you convert it to an order.

You never set Approved or Converted by hand. You can move an estimate to Draft or Sent yourself; Approved is set only when the customer signs, and Converted only when you convert it to an order. (Some older estimates may show Converted from a legacy "Accepted" state; they already have a linked order.)

Estimate settings (show tax, terms & conditions)

Set whether estimates show sales tax and the terms customers must agree to before approving.

When you'd do this: you want all new estimates to show (or hide) sales tax, or to make customers agree to your terms before they sign.

Steps

  1. Open Order Settings.
  2. On the Hours tab, find the Estimates section.
  3. Toggle Show tax on estimates: on, estimates include sales tax; off, they show a pre-tax total.
  4. Type your Estimate terms & conditions. Leave it blank to skip the agreement step entirely.
  5. Save.

These are business-wide defaults. An individual estimate can still override tax with its own per-estimate tax mode. See Line items, fees & the per-estimate tax mode.

How terms appear to the customer

When terms are set, the signing page shows them in a Terms & Conditions box and requires the customer to tick I have read and agree to these terms & conditions. before they can approve. With no terms set, there's no checkbox and nothing to agree to.

These settings only affect new and unsigned estimates. Already-signed estimates keep the tax and terms they were signed under. Changing the setting here never rewrites a document a customer already approved.

Dispatch & Drivers

Assign an order to a driver

Put an order on a driver’s route from the dispatch board.

When you'd do this: an unassigned delivery needs to go on a truck.

Your dispatch board is the Drivers page.

Steps

  1. Open Drivers.
  2. Click Assign Orders to open the assignment board.
  3. Assign each order one of three ways:
    • Drag the order card onto a driver's lane.
    • Click the order's assign button and pick a driver from the search list.
    • Click Auto-Fill to distance-assign every unassigned delivery at once.
  4. Click Confirm All to save.

To move an order to a different driver, use Reassign Orders, click the order's Reassign, pick the new driver, and Confirm.

Nothing is saved until you click Confirm All. Drag-and-drop changes on the board are a draft. If you close the board before confirming, they're lost. (Reassigning to a driver who already has that order merges it into one assignment, so it never double-books.)

The Drivers page is your dispatch board

One screen for every driver, their live status, and the day’s work.

When you'd do this: you run deliveries and need one place to see every driver and move work onto trucks.

Drivers is the dispatch board. Everything driver-related lives here as tabs: Drivers, Order Map, Timesheets, and Time Clock Setup.

The Drivers tab

  • Top buttons: Assign Orders (the drag-and-drop assignment board), Reassign Orders, and Add Driver.
  • Five live counters across the top: Total Drivers, Active Now, Busy, Offline, and Active Deliveries.
  • A Live driver map embed (collapse it with Hide map) shows each active driver's position and next stop.
  • Each driver card shows status, who they're Delivering right now, Active Deliveries, Completed, and buttons for Orders and SMS.

A driver's status reads as one of Available, On Delivery, Returning, On Break, or Off Duty. The list auto-refreshes every 30 seconds.

The other tabs

  • Order Map: the day's deliveries as pins on a map (also at Order Map).
  • Timesheets: driver clock-in hours.
  • Time Clock Setup: draw the yard clock-in zones.

An older, simpler Driver Assignments page still exists as a one-order-at-a-time, assign-only view. The Drivers board is the full dispatch tool.

Pickups never show up on the Assign Orders board. A pickup is collected by the customer, so there's no route to assign. It's handled on the Yard Board instead. Only deliveries and transfers appear here to be put on a truck.

Add and manage drivers

Create driver logins, send invites, grant office or yard access, and deactivate drivers.

When you'd do this: a new driver is starting, or you're changing who can log in.

Add a driver

  1. On Drivers, click Add Driver.
  2. On the Add Driver prompt ("This uses one of your driver accounts"), click Continue.
  3. Fill in Name, Phone, Email, and a Password (minimum 6 characters). The email and password are the driver's login.
  4. Click Create Driver.
  5. On the success screen, click Copy All Credentials or Send Welcome Email. The password is shown only once.

Drivers sign in to the driver app at /driver/login with that email and password.

Driver accounts (seats)

The header shows Driver accounts available: X of Y (or Unlimited on a free account). Each active driver uses one account. When none remain, Add Driver is blocked with "No driver accounts available. Add more from the Billing page." Add seats on the Billing page.

Manage an existing driver

  • The mail button on a card re-sends the invite (Send invite). A driver with no email shows No invite until you add one.
  • The toggle on each card activates or deactivates a driver. Deactivating keeps their history but takes them off the live board.
  • Edit opens the driver form. Also allow office dashboard access lets a driver sign in to the office dashboard with their driver login (needs an email first).
  • Yard operator access opens the Yard Board for that person: today's whole yard and how much of each order has left.

Remove a driver

Click the trash icon on the card and confirm. A driver who still holds active deliveries can't be deleted. Reassign or complete those stops first.

A new driver can't log in until you hand over their credentials. The password appears only once, on the success screen. Close it without clicking Copy All Credentials or Send Welcome Email and the driver is stranded. Re-send later with Send invite from the driver list.

Driver routing and capacity

How home base, service area, and vehicle capacity let Auto-Fill assign orders by distance.

When you'd do this: you want Auto-Fill to assign orders by distance instead of placing every stop by hand.

Auto-Fill matches each delivery to the nearest capable driver. It reads three settings per driver, in the Routing & capacity section that shows when you Edit a driver on Drivers.

The three settings

  • Home base address: where the driver starts the day. Used as the fallback location when there's no live GPS. Auto-fills from the driver's selected location (or your business address); edit as needed.
  • Service area radius (miles): orders farther than this from the driver are skipped by Auto-Fill. Leave it blank to accept any distance.
  • Vehicle capacity (units): orders larger than this skip the driver. Use whatever unit you size orders in (yards, tons, pallets).

A driver also has a Location (or All locations (floater)). A located order prefers that location's drivers plus floaters.

How Auto-Fill picks

For each order it scores every eligible driver by straight-line distance from their live position (or their home base when the GPS ping is stale), drops anyone outside their service area or without capacity, and assigns the closest. Ties go to the driver with the fewest open stops. An order no single truck can carry is split across trucks (see Split loads across trucks).

Orders it can't place come back in the Unassigned column with the reason, for example "Outside every active driver's service area", "No in-zone driver has capacity for this order", or "No driver has a depot or live position. Set a home base on each driver". You can still drag any of those onto a lane to override.

These fields appear only when you EDIT a driver, never when you create one. A driver with no home base or no service area still works for manual drag-and-drop assignment, but Auto-Fill silently skips them until the fields are filled in.

Reassign and move orders between drivers

Move an assigned order to a different driver from the Reassign list or the board.

When you'd do this: an order is on the wrong driver, or a driver called in and their stops need to move.

There are two ways to move an assigned order to a different driver.

From the Reassign Orders list

  1. On Drivers, click Reassign Orders.
  2. Find the order. Search by customer, order #, or driver.
  3. Click Reassign on that order, pick the new driver, and click Confirm.

This saves right away, one order at a time, and texts the new driver.

From the Assign Orders board

Drag a stop from one driver's lane to another (or use the assign button on the card), then click Confirm All. The basics of the board are in Assign an order to a driver.

Moving a committed stop between drivers moves it in place, so it never leaves a second copy behind.

The two paths commit differently. Clicking Confirm in the Reassign list saves that one move immediately. Board drags stay a draft until you click Confirm All. See Assign an order to a driver, which also covers why dropping an order onto a driver who already has it merges instead of double-booking.

Cancel a delivery

Release the driver and re-queue the order, with no refund or void.

When you'd do this: a scheduled delivery can't run (weather, a no-show, a recalled truck) and the order needs to go back in the queue.

Cancelling a delivery releases the driver and returns the order to the Unassigned list to be re-assigned. It does not touch money, inventory, or the invoice.

Cancel it

  1. Find the stop. Click Orders on a driver card, use the card's remove (×) button on the Assign Orders board, or use the older Driver Assignments page.
  2. Click Cancel Delivery.
  3. Enter a Reason (required) and confirm.

The order reappears under Unassigned, ready for another driver or another day. (Your reason is saved on the record, but it isn't shown on the board card.) On a split load, cancelling one leg only frees the order when no other leg remains.

"Cancel Delivery" is not a refund. Nothing is refunded or voided. Money the customer already paid stays collected. To actually cancel and refund, cancel the ORDER on the Orders page instead.

Split loads across trucks

Deliver one order with more than one driver, while the money stays on the single order.

When you'd do this: one order is too big for a single truck, or you want two drivers to cover it.

A single order can be delivered by more than one driver. That's a split load. Each driver gets their own leg, but the order stays one order.

How to split

  • On the Assign Orders board, drag the same order into a second driver's lane, then click Confirm All. The order now has a leg on each driver.
  • Or let Auto-Fill split it for you: when no single truck has capacity, it packs the order across enough in-zone drivers to carry it.

Each leg can carry its own delivery address, date, and time window for routing, so the trucks can go to different places or on different days.

What stays on the order

The charge, tax, and invoice are always order-scoped. Splitting across trucks never splits the money. There's still one order total, one payment, and one invoice no matter how many legs. A per-leg address is for routing, display, and ETA only.

A split is always within one business: every leg belongs to the same partner. One order never spans two businesses.

A split order isn't done until every leg is. With the load spread across trucks, the order stays open until the last leg is delivered (and on a bill-later order its single invoice stays uncollected until then). One truck finishing its leg doesn't complete or bill the order on its own.

Live driver tracking and the dispatch map

See where drivers are and what’s next, with location shared only while clocked in.

When you'd do this: you want to see where your drivers are and what they're headed to next.

The Live driver map sits on Drivers. It plots every active driver who has either a recent GPS ping or a home base, and refreshes every 30 seconds.

Reading the map

  • Each driver is a colored pin with their initials; the side list mirrors the colors and shows each driver's next stop and open-stop count.
  • A green pulsing dot means a live position. A dimmer pin is the driver's depot (home base) when there's no recent GPS.
  • A driver with no home base and no recent GPS doesn't appear. The list prompts "set home base on the driver to surface here".
  • The Order Map tab (/order-map) is the companion view: one pin per delivery for the day, not per driver.

Consent and the clock

Location is opt-in. In the driver app the driver taps Allow location sharing, under the line "We only track your location while you're on a delivery or clocked in, never off the clock." While sharing is on, the app sends the driver's position roughly every 20 seconds.

The map needs a Google Maps key configured; without one it falls back to a list-only view.

For a business that uses the time clock, the office sees live GPS only while a driver is clocked in. The moment a driver clocks out, their pin freezes at the last on-shift spot and is badged "off shift". It stops moving and never shows a live position off the clock. See Time clock, timesheets & geofences.

The driver app field workflow

What a driver taps from sign-in through navigation, proof of delivery, and complete.

When you'd do this: you're briefing a driver on what they'll tap in the field, start to finish.

Drivers sign in at /driver/login with the email and password you created for them, and land on a dashboard of today's stops.

The stop lifecycle

  1. Start Delivery: the driver taps this to begin a stop. It marks them en route, texts the customer a "driver is on the way" update, and opens turn-by-turn navigation automatically.
  2. Navigate with Google Maps: opens directions to the address. (Start Delivery opens it for them; this button re-opens it.)
  3. Arrival is automatic. When the driver's phone reaches the stop, the app marks it arrived on its own. There's no "arrived" button to tap.
  4. Complete Delivery: opens the proof-of-delivery step.

Proof of delivery

On completion the driver sees Proof of delivery: "Take a photo of the delivered product so we have a record. Optional: capture the recipient's name." They take a Photo of delivery, optionally enter a Recipient name (optional), and tap Complete delivery. The photo and the driver's location are stored as the delivery record. A Skip POD and just mark complete link finishes the stop without a photo.

Duty status

Apart from stops, the driver sets their own availability with Available, On Break, Off Duty, or Returning. (On Delivery is set automatically when they start a stop.)

Tapping "Start Delivery" texts the customer immediately and launches navigation. It's the "I'm rolling now" button, not "I'll head out later". A driver should tap it only when they actually leave, or the customer gets an early on-the-way text.

Driver two-way SMS

Assignment texts go to the driver’s phone; their replies land in the office inbox.

When you'd do this: you want to understand how a text to a driver actually reaches them, and where their replies go.

Driver texting is real SMS to the driver's own phone, not a chat inside an app.

Outbound: the office texts the driver

When you assign or reassign an order, BulkTrackPro texts the driver's phone from a shared BulkTrackPro number with the order details. This works for every business whether or not you've set up your own SMS, because it rides the platform number.

Inbound: the driver replies by text

When a driver texts back, their reply lands in the office under SMS Marketing → Conversations, where the thread is tagged Driver. Replies do NOT appear on the driver's card, and NOT in the SMS button on the Drivers page. When a new text arrives, a "New text message received" toast appears anywhere in the dashboard.

Opting out

If a driver texts STOP, assignment texts to them are suppressed until they text START. The office sees this as a red SMS off badge on the driver: "This driver texted STOP. Assignment text messages are suppressed until they text START."

Not live yet

The per-driver SMS button on each driver card opens a "Coming Soon" placeholder for Driver SMS. It can't send or show messages. Use SMS Marketing → Conversations for driver replies.

Driver replies show up under SMS Marketing → Conversations, not on the Drivers page. The driver-card SMS button is "Coming Soon" and won't show the conversation. Look in Conversations (threads tagged "Driver") for anything a driver texts back.

Time clock, timesheets, and geofences

Set up clock-in zones, let drivers clock in, and review or export their hours.

When you'd do this: you want to track driver hours, or set where the app reminds drivers to clock in.

Time Clock Setup (clock-in zones)

The Time Clock Setup tab (/timeclock-setup) is where you draw the yard boundary, a clock-in zone. Click Add Zone, then click the map or drag the pin to set the center, and set a Radius in meters (50–5,000 m; default 150 m). Optionally link it to a location. The Nudge enabled toggle makes the driver app prompt drivers to clock in when they enter the zone.

How drivers clock in

In the driver app a Time Clock card shows Clock In, then Clock Out, Start Break, and End Break once on the clock. When Clock-in reminders (geofence nudge) are on (a per-driver setting on the driver's edit form and on the driver's own card), the app shows "You're at [yard], clock in?" as the device reaches the zone. It only ever reminds them to clock in; the driver still taps.

Timesheets

The Timesheets tab (/timesheets) lists shifts over a date range (default this week). Columns are Driver, Date, Clock In, Clock Out, Break, Worked, Status, and Edit. You can Add Shift, edit or delete a shift to correct it, and Export CSV. A shift still running shows In progress; one the system auto-closed shows Needs review.

Privacy

For a business that uses the time clock, a driver's GPS is shared with the office only while they're clocked in. See Live driver tracking and the dispatch map.

Clocking in is not restricted by the zone. The zone only drives the reminder and the "at yard" time breakdown. A driver can clock in from anywhere. And Total Worked Hours counts only closed shifts: an in-progress or "Needs review" shift is left out until it's closed or corrected, so a forgotten clock-out reads as zero worked hours until you fix it.

Scheduling & Delivery

Set delivery, pickup, and drop-off hours

Set the days and open/close times for each fulfillment type, plus the pickup and drop-off addresses customers see.

When you'd do this: you want customers to book only on the days and times you actually run deliveries, pickups, or drop-offs.

Hours live on Order Settings under the Hours & Availability tab. You set them separately for each fulfillment type. There is no single "business hours" control here.

Steps

  1. Open Order Settings and stay on the Hours & Availability tab.
  2. In Delivery Hours, Pickup Hours & Address, or Drop-off Hours & Address, find the day you want to change.
  3. Leave a day open by setting its Open and Close times with the hour / minute / AM/PM pickers.
  4. To close a day entirely, check Closed on that row, and its time pickers disappear.
  5. For pickup and drop-off, fill the Pickup Address and Drop-off Address fields. These are shown to customers when they choose that fulfillment type.
  6. Click Save All Settings.

What the hours drive

A day marked Closed generates no time slots for that fulfillment type, so customers can't book it. On the storefront, a closed day is rejected with "The store is closed on the selected date. Please choose another date."

If you have multiple locations

Once you have more than one location, this tab shows "hours, time slots, and delivery zones are now managed per location" with a link to each location. Set hours on the location page instead; the partner-level pickup and drop-off addresses remain as fallbacks.

The three hour sets are independent. Closing Delivery Hours on Sunday does not close pickup or drop-off on Sunday. Set each fulfillment type's days yourself, or a customer can still book the ones you left open.

Time slots and capacity (overbooking cap)

Set how far apart booking times are and how many orders can land in one slot before it stops accepting bookings.

When you'd do this: you want to cap how many deliveries can be booked into the same window so a slot never gets oversold.

Slots live on Order Settings under the Time Slots & Capacity tab.

Steps

  1. Open Order Settings and click the Time Slots & Capacity tab.
  2. Set the Time Slot Interval: 15, 30, 45, 60, 90, or 120 minutes. This is how far apart the bookable times are (9:00, 9:30, 10:00, and so on) within your open hours.
  3. Set Maximum Orders Per Time Slot: between 1 and 100. Once a slot reaches this many booked orders, it stops accepting new ones.
  4. Click Save All Settings.

How a full slot behaves

The server counts booked orders per slot. When a slot's booked count reaches the maximum, it is marked full and hidden from customers. They never see a full slot, so they can't pick it. On the dashboard you can see the load on the Delivery Calendar's Capacity view, which shows each slot's booked / capacity, a percent-full bar, and a red FULL tag.

If you have multiple locations

With more than one location, this tab defers to per-location settings. Open the location to set its interval and capacity.

The cap is per time slot, not per day. A max of 5 with four 30-minute slots in a day allows up to 20 orders that day, not 5. Size the number against one window's workload, not the whole day's.

Block unavailable and recurring holiday dates

Block a single calendar date or a date that recurs every year so customers cannot book it.

When you'd do this: you're closed for a holiday, inventory day, or a one-off, and want that date off the booking calendar.

The Unavailable Dates card is on Order Settings under the Hours & Availability tab.

Steps

  1. Open Order Settings on the Hours & Availability tab and scroll to Unavailable Dates.
  2. Pick the date in the date field.
  3. To block it every year (for example a fixed holiday), check Recurring annually. Leave it unchecked to block only that one calendar date.
  4. Click Add Date. The date appears in the list tagged Recurring annually or One-time.
  5. Click Save All Settings.

Remove a date later with Remove next to it.

How blocking is enforced

A customer who picks a blocked date at checkout is turned away with "The selected date is unavailable. Please choose another date." A one-time block matches that exact date; a recurring block matches the same month and day in every year.

If you have multiple locations

The Unavailable Dates card appears for single-location setups. With multiple locations, availability is managed per location on the Hours & Availability tab.

Recurring matches by month-and-day forever. Pick it only for dates that truly repeat (July 4th), not a one-off like a single staff day, or you'll silently block that date every future year.

Advance notice and delivery days (app ordering)

Set the earliest lead time and the weekdays customers can book in the native app and the dashboard day picker.

When you'd do this: you need at least a day's heads-up before a delivery and want app customers held to that.

The App Ordering card is on Order Settings under the Hours & Availability tab.

Steps

  1. Open Order Settings on the Hours & Availability tab and find App Ordering.
  2. Under Delivery Days, toggle the weekdays (Mon through Sun) customers and staff can choose for delivery.
  3. Set Advance Notice (days): the minimum is 1. This is the earliest, in days from today, an app customer can schedule a delivery.
  4. Click Save All Settings.

These settings drive the native app and the dashboard's manual-order day picker only, not your web storefront. The web store enforces each product's own availability instead: its available days and its lead time, set per product in the Catalog. Changing Advance Notice here will not move your storefront's earliest bookable date. To hold web-store customers to a lead time, set it on the product.

How delivery zones and distance pricing work

The model behind zone-based delivery fees: mile bands vs drawn map areas, fee profiles, and how a cart with several profiles is charged.

Delivery Zone Pricing attaches a flat delivery fee to every delivery order based on how far the address is from your origin. It lives on Order Settings under the Fees & Services tab, in the Delivery Zone Pricing card. Turn it on with its Enable checkbox.

Two ways to define a zone

A profile uses one mode at a time, chosen with the Mile bands / Map areas toggle:

  • Mile bands: numeric rings from your location. Each zone has a From (miles) / To (miles) range and a flat $ fee. The server matches road distance to the first band whose range contains it and charges that band's fee.
  • Map areas: polygons you draw on a map. The server charges the first drawn area (by order) that contains the delivery point.

Add a band with Add Zone; each zone also has a Description (shown to customer) and an Outside flag (see Rejecting orders beyond your area).

Delivery Fee Profiles

Zones are grouped into profiles. The Delivery Fee Profiles bar lets you create (Add), rename, select, and Delete profiles; one is marked • default and can't be deleted. Each service type uses one profile. On an order, the delivery fee is the sum of one matched zone fee per distinct profile present in the cart. So a cart mixing products on two different profiles can carry two zone fees added together.

A zone's fee can be zero

A matched zone with a $0 fee is still deliverable. The address is in range, with no charge. No fee line is added.

If you have multiple locations

Zones are managed per location once you have more than one; the card links you to each location instead of editing them here. Editing zones requires the Settings permission.

A delivery that resolves beyond every configured zone is not automatically charged or blocked by default. It comes back as deliverable with no zone fee. Whether to hard-reject those addresses is a separate setting; see Rejecting orders beyond your area.

Reject orders beyond your delivery area

When an out-of-area address is blocked at checkout versus allowed through with no fee, and the mile-band setting that controls it.

An address that falls outside your zones can either be allowed through with no delivery fee or hard-rejected. Which one depends on how your zones are built and one checkbox.

Mile-band mode: the "Reject" checkbox

In the Delivery Zone Pricing card (Fees & Services tab), band mode shows Reject orders beyond the furthest zone.

  • Off (default): an address past your furthest band is still deliverable, with no zone fee attached.
  • On: an address past your furthest band is rejected as outside the service area.

The per-zone "Outside" flag

Each band has an Outside checkbox. A zone flagged Outside with no fee hard-rejects any address that lands in it. But a zone flagged Outside that still has a positive fee is treated as a deliverable premium band and charged. The fee wins over the label.

Map-area mode is stricter

In map mode, an address outside every drawn area is always rejected as outside the service area. This does not depend on the "Reject" checkbox. A drawn area marked Outside rejects any address inside it regardless of its fee.

Who the block stops

A customer ordering through your online store is hard-rejected server-side for an out-of-area address. Staff creating an order on the dashboard can override a deliverable-but-out-of-zone address at create time. See Placing an order outside your delivery area.

This guards customer orders placed on your storefront. It doesn't stop your own staff, who can still create an out-of-area order from the dashboard by confirming the "outside your area" override. The setting protects the storefront, not the back office.

Charge a fee on orders below a minimum

Add a flat fee to delivery orders whose product subtotal falls below the amount you set.

When you'd do this: small jobs aren't worth a truck roll, so you want to add a fee when a delivery is below a set amount.

The Minimum Order Fee card is on Order Settings under the Fees & Services tab.

Steps

  1. Open Order Settings and click the Fees & Services tab.
  2. In the Minimum Order Fee card, check Enable.
  3. Set the Minimum Order Amount: the subtotal a delivery must reach to avoid the fee.
  4. Set the Fee Amount (if below minimum): the flat charge added when it doesn't.
  5. Click Save All Settings.

How it's applied

On a delivery order, if the product subtotal is below your minimum, the flat fee is added as a Minimum Order Fee line labeled "Order below minimum of $X." It is a fixed add-on, not a top-up to the minimum.

The comparison is against the product subtotal only. Delivery fees and tax don't count toward clearing the minimum. And the fee rides the delivery fee path, so it attaches to delivery orders, not pickup or drop-off. For a flat charge on a pickup, add a custom fee on the order instead.

Tax your delivery fees

Choose whether tax is calculated on delivery fees or on the product subtotal only.

When you'd do this: your jurisdiction taxes delivery charges and you need tax calculated on the fee, not only the materials.

The Tax delivery fees toggle is on Order Settings under the Fees & Services tab, in the Tax Settings card.

Steps

  1. Open Order Settings and click the Fees & Services tab.
  2. In Tax Settings, check or uncheck Tax delivery fees.
    • On: tax is calculated on the subtotal plus delivery fees.
    • Off: tax applies to the product subtotal only.
  3. Click Save All Settings.

Your default tax rate and per-service tax are set on the Catalog page, not here.

This toggle only does something when a tax rate actually applies: delivery fees are taxed only if Tax delivery fees is on, the customer is not tax-exempt, and your default tax rate is above 0%. If your tax rate is 0 or the customer is exempt, turning this on changes nothing.

Choose how customers tell you where to drop a delivery

Let customers type free-text drop-off instructions, or pick from a list of spots you define.

When you'd do this: you want cleaner placement instructions at checkout, either a free-text note or a fixed list of spots like Driveway or Backyard.

The Drop-off Location card is on Order Settings under the Hours & Availability tab, and it shows for every partner.

Steps

  1. Open Order Settings on the Hours & Availability tab and find Drop-off Location.
  2. Choose one:
    • Let customers type their own instructions: an open text box at checkout (for example, "top of the driveway across from the garage").
    • Let customers choose from a list you define: customers pick one of the spots you set.
  3. If you chose the list option, add each spot under Drop-off spots with the text field and Add; remove one with its ×.
  4. Click Save All Settings.

If you pick the list option but add no spots, customers fall back to the free-text box instead. The card warns "Add at least one spot, or customers will see a text box instead." Choosing the list and leaving it empty is the same as choosing free-text, so add your spots before you rely on it.

The delivery calendar

See every scheduled order by day, and check how full each time slot is.

When you'd do this: you want to see what's on the books for a day, or check whether a time slot still has room.

The Delivery Calendar at Calendar is on every plan. Switch between three views with the tabs at the top:

The three views

  • Calendar: a month grid; each day shows the orders scheduled on it. Click a day to focus it.
  • List: the same orders as a flat, time-ordered list.
  • Capacity shows the Time Slot Capacity Chart: pick a date under Select Date and see each slot's booked count against its limit, with a red FULL badge on any maxed slot. The legend colors delivery (green), pickup (blue), and drop-off (orange) slots; a closed day shows "The business may be closed."

What you can do from here

  • Export to CSV downloads the orders currently in view.
  • On any order, open the customer's profile, or change the order's status from the inline Pending / Confirmed / Completed / Cancelled dropdown.

The status dropdown on a calendar order changes the real order. It's not a calendar-only label. Setting it to Completed or Cancelled here is the same status change as doing it on the order itself, with the same downstream effects (cancelling triggers the normal refund/inventory-return behavior).

Invoicing & AR

Hold (park) an invoice

Park an invoice so nothing tries to collect it, and it drops out of AR.

When you'd do this: an invoice exists but shouldn't be chased yet: a disputed job, a pending credit, a "don't bill this one."

Steps

  1. Find the invoice on the Invoices page.
  2. Click the pause button on its row (tooltip: "Hold (park as not billed yet)"). The invoice gets a Held badge.
  3. To bring it back, click the same button again. It's now a play icon (tooltip: "Un-hold (return to billing)").

To see everything you've parked, use the Held filter.

What holding does

While an invoice is held, it:

  • drops out of Accounts Receivable (your outstanding totals and aging),
  • hides from the main invoice list (it shows only under the Held filter),
  • won't mint or email a new pay link,
  • can't be charged through batch / combined payments,
  • can't be folded into a consolidated invoice.

Holding doesn't retract a pay link you already sent. It blocks new pay links, batch/combined charges, and consolidating, but a link already emailed to the customer stays payable until the invoice is settled or deleted. If a sent link must not be paid, settle or delete the invoice rather than only holding it.

How invoices get created

Most invoices appear automatically when an order is placed; the Bill button covers the rest.

An order placed through BulkTrackPro gets its invoice on its own. You don't create one by hand for a normal order.

The automatic path

When an order is saved, the system creates its invoice in the background, with a number in the format INV-YYYYMMDD-XXXXX. One order gets exactly one live invoice. Placing the same order twice, or two staff saving at once, still produces a single invoice, never a double-bill.

A $0 order (or a credit-shaped total) is created already marked paid. There's nothing to collect, so it doesn't sit in AR as a phantom balance.

When no invoice exists yet

Two cases leave an order without an invoice:

  • The order was saved with hold invoice turned on, so it could be grouped onto a bigger invoice later.
  • The order predates the customer link, or came in without one.

These show on the Invoices page as Not yet billed rows. To bill one:

  1. Filter to Not yet billed, or find the order's row (it carries a "This order has not been invoiced yet" marker).
  2. Click the Bill button (tooltip: "Generate an invoice for this order").
  3. Confirm the prompt. It names the order number and the dollar amount.

The row turns into a real invoice ("Invoice generated. Send, take payment, or print it from the new row.") and the Send, payment, and print actions light up.

The Bill button needs a linked customer. An uninvoiced order with no customer on file can't be billed from here ("This order is missing a customer and cannot be billed automatically"). Add the customer to the order first.

Payment terms & due dates

How the due date is set from your net terms, and why it can shift to the day you send.

Due date = the invoice date plus your net terms. Net terms come from one setting (invoice due days under Order Settings) and default to 30 (Net 30) if you've never set it.

How the date is calculated

  • The clock starts on your local calendar day, not the server's UTC clock. An invoice created at 9pm Pacific is dated that same local day, not pushed to tomorrow.
  • The due date is that day plus your net-terms days, counted in plain calendar days.

Change invoice due days in Order Settings and every invoice created afterward uses the new terms. Existing invoices keep the terms they already have.

The re-anchor on first send

The due date an invoice is born with is a placeholder. The first time you send it, the due date is recomputed from your current net terms, anchored on the day you send. So an invoice created last week and sent today gets "today + net terms," not "last week + net terms."

This recompute runs only on the first send, and only for a plain, still-open invoice. It is skipped when the invoice is locked, already sent, paid or partially paid, or a consolidated (multi-order) invoice. Those keep the due date they have.

The due date you see before sending can move when you send. If a customer asks "when is this due?" before you've sent it, quote the date from the sent invoice. The pre-send date can shift to the send day. Consolidated invoices are the exception: their due date is set when you combine and does not re-anchor.

Sending invoices: email, pay link & reminders

Email an invoice, send only the pay link, send a reminder, or send one combined statement.

When you'd do this: an invoice is ready and the customer needs to see it or pay it.

Send one invoice

  1. On the Invoices page, find the row.
  2. Click Send Invoice (the mail icon). The customer gets the itemized invoice email with a pay link and the PDF attached.
  3. To send only the payment link (a short "here's your secure link" message instead of the full invoice), use the pay-link action, which can go by email, SMS, or both.

The email goes to the customer's current primary email. Billing-role contacts on the customer are auto-CC'd.

Send a reminder

Click Send Reminder (tooltip: "Send Reminder") on the row. This is disabled once the invoice is paid.

Automatic reminders

When an invoice is sent for the first time, a reminder schedule is created: 7 days before due, on the due date, and 3, 7, 14, and 30 days overdue. The reminder job runs once a day at 9:00 AM Eastern. Milestones already in the past when the invoice is sent are skipped. A back-dated invoice does not fire a burst of catch-up emails. Reminders stop automatically once the invoice is fully paid, and are not sent while an ACH payment is still verifying or processing.

Send several at once

Select invoices with the row checkboxes, then:

  • Email as one statement: one email to a single customer listing every selected invoice, each line with its own pay link. All selected invoices must belong to the same customer (max 50).
  • Email individually: one separate email per invoice, each to that invoice's own customer. Mixed customers are fine (max 50).

A reminder only carries a pay link when there's still a balance to collect. For a paid, authorized (card-hold), partially-paid, or cancelled invoice the reminder still sends, but with no payable link, so it can't solicit a second payment. See why a re-sent receipt has no pay link.

Editing, holding & deleting invoices

How to change an invoice amount, park one out of AR, or remove it without losing the record.

An invoice's amount follows its order. There's no free-text "edit the invoice total" field. You change what's billed by editing the order, and the invoice amount re-adjusts to match.

Editing the amount

Edit the order (items, quantities, fees) and the linked invoice's amount updates with it. If the customer already paid and then changed the order, reverse the payment first so the invoice reopens. See recording payments & reversals.

Holding (parking)

The pause button parks an invoice: it drops out of AR and the main list, and the manual Send, pay-link, charge, batch, and combine actions all refuse it until you un-hold. Full steps are in Hold (park) an invoice.

Deleting

The trash button (tooltip: "Delete invoice") soft-deletes the invoice after a confirm dialog ("Delete invoice?"). Deleting:

  • removes it from the Invoices list, AR, reports, and the QuickBooks export queue,
  • keeps the underlying row for tax, audit, and dispute history (it's logged to the customer's history as deleted),
  • frees every order it covered so they can be billed again,
  • voids the matching invoice in QuickBooks if one was synced,
  • deactivates its pay link so an old emailed link can't still be paid.

Holding does not cancel reminders that were already scheduled. Parking an invoice hides it from AR and blocks the manual collection actions, but the daily reminder job still fires any reminders already on its schedule. Holding alone is not a guaranteed "stop all contact." Mark it paid, or delete it, to end reminders for good.

The invoice PDF: what’s on it

A field-by-field map of the generated invoice PDF, from the header box to the balance line.

The PDF is generated from the invoice and its order(s), with your branding on top. Here's every block it can show.

Header

  • Your logo and company name as the letterhead.
  • An INVOICE wordmark top-right, and a status badge (the invoice's status in capitals).
  • A bordered meta box:
LabelWhat it is
Invoice #The INV-… number
Date BilledThe invoice date
Order # / Order(s)The single order id, or a count on a consolidated invoice
P.O. # / P.O. #sPurchase-order reference(s) from the billed order(s), when present
Service DateThe delivery/service date, when present
PaidThe payment date, shown only on a paid invoice
Paid viaThe real tender (Card, Cash, Check, Bank transfer…), on a paid invoice

Party band

Three columns under the rule:

  • Remit To: your remit address and contact, with Tax ID (EIN) if set.
  • Bill To: the customer's billing details and Tax ID. A tax-exempt customer's line reads Tax ID (Resale) or Tax ID (Nonprofit).
  • Ship To: the delivery party.

Line items

A table headed ITEM / DESCRIPTION, QTY, UNIT PRICE, TOTAL, grouped by date (so a multi-order invoice shows each order's items under its own date), with a Tax line per group.

Totals & settlement

  • The grand-total bar reads Total Due: on an open invoice, Amount Paid: on a paid invoice, or Total Charged: when the customer was charged a card fee on top.
  • A settlement block below it can show Amount Paid:, Refunded / Credited:, Credit pending to card:, and a final Balance Due: (or Balance Credit: when the invoice is overpaid).

Optional cover letter & terms

If a communication template with a cover letter is used, the PDF leads with a cover-letter page, and a PAYMENT TERMS block renders from the template's terms text. See invoice & communication templates.

The PDF carries no standalone due-date line. The due date lives on the emailed invoice and in the Accounts Receivable list, not as its own row on the PDF. Any "payment is due within N days" wording on the page comes from the template's Payment Terms block, not the invoice's calculated due date.

Recording payments, partials & reversals

Mark an invoice paid by cash/check/ACH, record a partial, or reverse a manual payment.

Use this for money that came in off-platform. A customer handed you cash, mailed a check, or wired you. Card and bank (ACH) payments taken through BulkTrackPro record themselves.

Record a payment

  1. On the Invoices page, click Record Payment on the row (tooltip: "Record Payment (cash, check, ACH…)").
  2. Enter the amount and pick the method. For a check you can record the check number as a reference.
  3. Save (Record Payment / Record Cash Payment).

Partials

Record less than the balance and the invoice stays open as Partial until the running total covers it. Each partial is kept as its own ledger entry; the invoice only flips to Paid, and leaves AR, once fully covered. A payment is always capped to what's still owed. You can't over-record past the balance.

Cash recorded this way feeds a tracked cash drawer when you have one.

Reversing a payment

The reverse button (tooltip: "Reverse payment / mark unpaid (to edit the order and re-bill)") reopens a paid invoice as unpaid, for the "customer paid, then came back to change the order" case. The invoice keeps its number; editing the order afterward re-adjusts the amount.

Reverse only works on manual tender. It reopens cash, check, wire, and money-order payments. A card or bank (ACH) payment moved real money, so it can't be silently marked unpaid. The system blocks it and routes you to an actual refund instead (see issue a refund). A cash payment that fed a tracked drawer is likewise sent to a cash refund, so the till stays straight. And an invoice with an in-person card charge mid-tap is held off: "An in-person card charge is in progress for this invoice. Wait for it to finish before marking it paid."

The Accounts Receivable dashboard & aging

What the AR totals, aging buckets, and status filters on the Invoices page mean.

The Invoices page is your Accounts Receivable screen: invoice list on the bottom, money summary on top.

The summary cards

  • Total Outstanding: everything billed and not yet paid.
  • Total Overdue: the outstanding amount that's past its due date.
  • Payments Received: collections for the selected period.
  • Tax Collected: tax collected for the selected period.

Aging Summary (As of Today)

Outstanding balances bucketed by how far past due they are:

BucketMeaning
CurrentNot yet due
1-30 DaysPast due
31-60 DaysPast due
61-90 DaysPast due
90+ DaysSeriously overdue

Aging counts against your local calendar day, so an invoice doesn't tip into "overdue" a few hours early because of a time-zone rollover.

Status filters

Chips above the list narrow it: All, Unpaid, Partial, Paid, Overdue, Processing, and Not yet billed (uninvoiced orders). The Held toggle switches the list to parked invoices only.

Held and dead invoices are excluded from these numbers. Parking an invoice (and an invoice whose order was cancelled or refunded) drops it out of Total Outstanding, overdue, and the aging buckets, so the dashboard matches the list, which also hides them. If a balance "disappears" from AR, check the Held view.

Communication templates for invoices & emails

Build branded templates that style your invoice PDFs and pre-fill customer emails.

When you'd do this: you want your invoices and customer emails to carry a consistent cover letter, opening line, and footer instead of the bare default.

Create a template

  1. Open Communication Templates.
  2. Click New Template.
  3. Give it a Template Name (required), and tick Set as default if this should be the one used automatically.
  4. Fill the parts you want:
SectionWhere it shows
Email SubjectThe default subject line when this template emails a customer
Opening LineA short greeting line
Cover LetterPage 1 of the invoice PDF, before the invoice table
Payment TermsA PAYMENT TERMS block on the PDF
FooterThe closing line of the invoice/email
  1. Click Save Template.

How templates get used

The default template styles the generated invoice PDFs and pre-fills the composer when you email a customer. When you send a single invoice, you can pick a non-default template for that one send.

Only the default template auto-applies. A template you create but don't mark as default never styles a PDF on its own. It's used only when you pick it at send time. Set one as default, or your invoices keep rendering with the plain layout.

Combine orders into one invoice

Merge several of one customer’s orders into a single consolidated invoice.

When you'd do this: one customer has several orders and wants a single invoice for all of them, not one per delivery.

Steps

  1. On the Invoices page, filter to Not yet billed and select the customer's uninvoiced orders with the row checkboxes.
  2. Click Bill & Send. Orders are grouped by customer in the review modal.
  3. For that customer's group, choose One combined invoice.
  4. Optionally untick Email the invoices to each customer now to bill without sending.
  5. Click Bill & Send / Bill … customer(s).

The orders merge into one consolidated invoice; the individual single invoices they'd otherwise have are voided in the same step, so there's never a double-bill. Each order's items stay grouped under its own date on the combined PDF.

What can be combined

Combining needs a linked customer and more than one order. The One combined invoice option is dimmed otherwise ("combine needs a linked customer"). Up to 200 orders per combined invoice. An order's existing invoice can be rolled in only if it isn't already paid, partially paid, part of another consolidated invoice, or synced to QuickBooks.

A held invoice blocks the combine. If any order you're merging has a parked (held) invoice, the whole combine is refused: "These orders have a held (parked) invoice — un-hold it before combining." Un-hold those invoices first, then combine.

Bill several orders at once

Turn a batch of uninvoiced orders into their own invoices in one pass.

When you'd do this: several orders are sitting as Not yet billed and you want each to get its own invoice, not one merged bill.

Steps

  1. On the Invoices page, filter to Not yet billed and select the orders with the row checkboxes.
  2. Click Bill & Send. Orders are grouped by customer in the review modal.
  3. Leave each group on Separate invoices (one invoice per order).
  4. Keep Email the invoices to each customer now ticked to send as you bill, or untick it to bill quietly.
  5. Click Bill & Send / Bill … customer(s). The modal reports how many billed and emailed per customer.

Separate billing works whether or not an order has a linked customer, and when emailing, each invoice goes only to its own customer. Up to 50 orders per pass ("Bill at most 50 orders at once.").

Which orders qualify

Only orders that are genuinely uncollected get billed: pending, unpaid, or failed, with no payment yet taken. An order that already carries a deposit or any payment is skipped ("Order already has a payment — not billable here"), so nobody gets billed for money already in hand.

Recurring orders bill themselves. An order from a recurring schedule is collected automatically by that schedule, so bulk-bill refuses it: "Recurring order is collected automatically — not billable here." Leave recurring orders to their schedule rather than billing them here.

Getting Paid

Processing fees & who pays them

What the fees are and whether you or your customer absorbs them.

Every card or bank payment carries two fees: the payment-processor fee and the BulkTrackPro platform fee. This article explains who absorbs them.

The two fees

  • Processor fee: the card/bank network's cut on each charge.
  • Platform fee: BulkTrackPro's small per-transaction fee.

Who pays

Each partner is set up to either absorb the fees (they come out of your payout) or pass them to the customer (added at checkout). New accounts default to absorbing both.

Who bears the fees is set with the BulkTrackPro team, not from a self-serve toggle. Contact support to change it. Whatever is set, the amount shown on the invoice always matches the amount actually charged.

Issue a refund (full, partial, or as store credit)

Refund a customer and understand how it affects your payout.

When you'd do this: a customer needs money back on a paid order.

Steps

  1. Open the order on the Work Orders page.
  2. Choose Refund.
  3. Pick full, a partial amount, or refund as store credit.
  4. Confirm. The customer's refund and your payout adjust automatically.

Heads up: a card refund can claw back part of the payout you already received for that order. ACH (bank) refunds settle over several days, not instantly.

How card payments work: authorized now, captured later

Why a card shows a pending hold first and is only charged when you confirm or dispatch the order.

A card payment happens in two stages: a hold now, the actual charge later.

The two stages

  • Authorize (hold): when the customer pays by card, BulkTrackPro places a hold on the card. It is not a charge yet; the money is set aside.
  • Capture (collect): the real charge happens later, automatically, when you confirm the order or assign it to a driver. You don't press a "capture" button; committing to the order collects it.

Why it works this way

You shouldn't take a customer's money before you've committed to fulfilling the order. The hold reserves the funds the moment they order; the charge lands when the order becomes real.

What each side sees

  • Your customer sees a pending authorization on their statement (not a completed charge) until capture.
  • You see the order as authorized until it's confirmed or dispatched, then paid.

Bank payments are different

ACH (bank) payments can't be held this way. They settle over several days rather than holding-then-capturing.

A hold expires on its own in about 7 days if it's never captured. An order left in limbo (never confirmed, never assigned) won't collect, and the reserved funds are released without a charge. A background check captures billable orders so this rarely slips, but an order that never reaches a billable state is never charged.

Connect and manage your Stripe account

Set up Stripe so you can accept payments, then manage the connection and your dashboard.

When you'd do this: before you can take your first card or bank payment.

Steps

  1. Open Integrations. On the Stripe Payments card, choose Connect with Stripe. The setup takes about 5 minutes.
  2. Complete Stripe's onboarding. If you come back before it's finished, the card reads Pending Approval. Choose Complete Setup to return to Stripe and finish.
  3. When onboarding is done the card reads Connected. Use Open Dashboard to reach your Stripe Express dashboard, or Update Account to change your business or bank details.
  4. To make customer receipts show your business name and support email, open the Express dashboard and go to Settings → Business settings.

If you need to start over

The Disconnect link on the Stripe card detaches the account. You'd reconnect from step 1.

Until Stripe onboarding is fully complete you can't collect real money. The card sits at Pending Approval. And a Test mode active banner means Stripe is processing nothing for real; you must be out of test mode to take live payments.

Saved cards and the 10-day card hold for edits

How a customer card gets saved for future charges, and the 10-day hold that lets you charge an edited order.

A card can be kept on file two ways: a permanent save you opt into, or a temporary 10-day hold that only exists to settle an order edit.

Saving a card on file

When you charge a card, Save this card to the customer's profile for future charges is checked by default. With it ticked, the card is stored as a reusable card on file and the first saved method becomes that customer's default. Later charges can run against the card on file without re-keying it.

The 10-day hold for edits

When a customer pays online but does not opt to permanently save their card, BulkTrackPro still keeps the card for 10 days as a hold. If you edit the order up within that window, the difference can be charged to the same card. The held card is removed automatically after 10 days.

Why the distinction matters

  • A 10-day held card is never made the customer's default and is never auto-picked for unrelated charges. It exists only to settle an edit on that one order.
  • A permanent save (the customer opted in, or staff ticked the box) stays on file until it's removed.

This on-file hold is not the authorization hold on the card itself. The card's pending authorization expires in about 7 days (see How card payments work); the saved-card hold is a 10-day window to charge an edited order.

ACH (bank) payments for commercial customers

Let commercial customers pay by bank account, and understand when the money lands.

ACH lets commercial customers pay from a bank account instead of a card. It is cheaper on large invoices, but it settles over days, not instantly.

Who can use it

ACH is for commercial customers only. Residential customers pay by card.

Turning it on

  1. Open Integrations and find Accept bank payments (ACH) (shown once Stripe Connect is complete).
  2. If the ACH capability (Stripe) reads anything other than Active, choose Activate ACH on Stripe and accept the capability in your Stripe Express dashboard. Stripe may ask for more business info first.
  3. Once the capability is Active, tick Enable ACH payments for commercial customers.

What it costs

The ACH fee is 0.8% of the charge, capped at $5, with no fixed per-transaction fee. That is cheaper than card (2.9% + $0.30) on larger invoices.

When the money lands

A bank debit settles in 3 to 5 business days. A first-time bank account may need micro-deposit verification first (about 1 to 2 days). You see the money in roughly 5 to 7 business days.

ACH can't be authorized-then-captured like a card. It's a single debit that goes to processing for days, then either succeeds or fails. Your payout for it is only issued once it succeeds. The payout delay and monthly ACH cap are risk settings managed by BulkTrackPro, not self-serve; contact support to adjust them.

Take in-person card payments with a reader

Request a card reader we ship you, register it, and collect card payments at the counter or on a delivery.

When you'd do this: collecting a card payment at the counter, on a delivery, or out in the yard.

Steps

  1. Open Integrations and go to In-Person Payments. Choose Request a device: the BBPOS WisePOS E (handheld) or the Stripe Reader S700 (countertop). BulkTrackPro orders and pays for the device and follows up by email.
  2. When the reader arrives, under Your card readers choose Register a reader. Enter the Registration code shown on the reader's screen and a Label (for example, "Front counter").
  3. Charge the order on the reader. A registered reader shows Online when it's ready to take payment.

How it differs from online card

  • A reader tap captures immediately. There's no authorize-now, capture-later hold like an online card charge.
  • In-person card pricing is 2.7% + 5¢ per charge, versus 2.9% + $0.30 for online card.

Tick Save this card at charge time to keep the tapped card on the customer's profile for future charges. Some wallet taps (Apple Pay / Google Pay) and certain cards can't be saved. That's expected and never blocks the payment.

Charge many invoices in one combined payment

Collect one customer’s several unpaid invoices in a single charge on the Payments page.

When you'd do this: a customer wants to settle several open invoices at once.

Steps

  1. Open Payments and pick the customer. Their unpaid invoices are listed with the total outstanding.
  2. Select the invoices to collect. You can also check unbilled tickets to bill them into this payment.
  3. Choose Charge (or Bill & Charge if you selected tickets). The charge modal collects the combined total by card on file, a new card, or bank (ACH).

How one charge covers many invoices

The whole selection is collected as one payment. The partner receives the combined net in a single transfer, apportioned across the invoices, and the processing fee's fixed part is charged once for the whole batch, not once per invoice.

Because the fixed fee applies once, combining invoices is cheaper than charging each separately. A single charge covers up to 30 invoices; beyond that, split it into smaller batches.

Record a cash, check, or other manual payment

Mark an invoice paid for money you collected outside BulkTrackPro: cash, check, or other.

When you'd do this: a customer paid by cash or check and you need the invoice marked paid.

Steps

  1. Open the invoice on Invoices and record a payment.
  2. Set the Payment Method: Credit Card, ACH, Check, Cash, or Other.
  3. For Cash, enter Amount tendered. BulkTrackPro shows the Change due. For Check or Other, add a Reference Number (Check #, Transaction ID).
  4. Choose Record Cash Payment / Record Payment.

What recording does

A manual tender settles the invoice in BulkTrackPro's ledger. It does not move money through Stripe. You've already collected the cash or check yourself.

Recording a manual payment triggers no Stripe payout. Only Stripe card and ACH charges pay out to your bank. Record a manual payment only for money you've actually received, or the invoice will read paid when it isn't.

Payouts and payout timing

When money from a card or bank payment actually reaches your bank account.

A payout is the money from your settled payments landing in your bank. How long it takes depends on card versus bank, and whether it's your very first payout.

Card payments

New accounts are set to a daily payout schedule, so money from a settled charge reaches your bank about a day later. (Stripe requires a 2-day delay at first; BulkTrackPro moves eligible accounts to a 1-day delay.) Your schedule and its delay are a Stripe-account setting. You can see and change them anytime in your Stripe dashboard.

Your first payout

Your very first payout after connecting Stripe has a mandatory 7-day waiting period that Stripe applies to all new accounts. After that first one, you're on the daily schedule above.

Bank (ACH) payments

An ACH debit settles in 3 to 5 business days, and you see the money in roughly 5 to 7 business days. The bank debit has to clear before the payout follows.

A payout follows settlement

Money only pays out after the charge itself settles, not on the order date. For an order held and captured later, the clock starts at capture.

A refund or chargeback after a payout has landed claws the money back out of your Stripe balance or reduces a future payout. New partners are often caught by the 7-day hold on the first payout. Don't expect next-day money on day one.

Refunds and clawbacks: what happens to your payout

How a refund reverses the share of a payout you already received, and why you can’t be clawed back twice.

A refund gives money back to the customer and reverses the matching share of the transfer that paid you, so the refunded amount comes back out of your side.

Full and partial refunds

  • A full refund reverses the whole partner transfer for that charge.
  • A partial refund reverses the transfer proportionally. You keep the part of your payout that matches the unrefunded amount.

If your payout already landed

When the payout is already in your bank, the clawback comes out of your Stripe balance or reduces a future payout, rather than pulling money back from your account directly.

Card versus bank

A card refund processes quickly. An ACH (bank) refund settles over several days, like the original debit.

A refund and a later chargeback on the same charge won't claw you back twice. Reversals are capped at the original transfer and deduplicated, so even when a refund and a dispute both land, you're never reversed past what you were paid.

Disputes and chargebacks

What happens to the order and your payout when a customer disputes a card charge, and where you respond.

When a customer disputes a card charge with their bank (a chargeback), BulkTrackPro reverses your transfer for that charge, flags the order, and alerts you. Then you respond in Stripe.

What BulkTrackPro does automatically

  • It reverses the partner transfer for the disputed charge, so the disputed funds leave your side.
  • It flags the order as disputed.
  • On batch and pay-link disputes it also emails the owner.

Combined (batch) charges

If the disputed charge was a combined payment across several invoices, each invoice's share is reversed and those invoices reopen.

Where you respond

You contest or accept the dispute (and submit evidence) in your Stripe Express dashboard. BulkTrackPro does not submit evidence for you; open the dashboard from the Integrations page.

A dispute claws the money back even if the payout already landed, and Stripe charges a dispute fee on top. Keep your delivery proof. That's what you upload in Stripe to contest it. If you win, the money is returned.

What payment method shows on a receipt

How each tender is labeled on receipts and invoices, and why every card type reads as one label.

Receipts and invoices show a single, customer-facing label for how an order was paid. It appears on the receipt's Order Info line as Payment: <status> · <method>.

The labels

  • Any card (online, card-on-file, or an in-person reader tap) reads as Card.
  • A bank / ACH payment reads as Bank transfer (ACH).
  • A payment made through a hosted pay link reads as Online payment (the link can settle by card or bank).
  • Cash reads as Cash; a check reads as Check; a wire reads as Wire transfer; a money order reads as Money order.
  • Store credit and prepaid Allotment draws read as themselves.
  • Net-terms / "bill me" / accounts-receivable markers show no method (blank), so an unpaid net-30 invoice never reads as if a tender was taken.

Why every card looks the same

All card variants collapse to one Card label by design. A receipt won't distinguish Visa from Mastercard, or an online charge from an in-person reader tap or a card on file. They're all Card.

If a payment method isn't shown at all, that's intended for net-terms and internal ledger markers. It means no tender was recorded, not that the receipt is missing data.

QuickBooks

Connect & disconnect QuickBooks

Link your QuickBooks Online company so orders, invoices, and payments can sync, and how to disconnect.

When you'd do this: your books live in QuickBooks Online and you want your sales to land there instead of re-keying them.

Before you start

QuickBooks is a paid add-on (+$69.99/mo), added from your Billing page. Until it's on, this page shows QuickBooks Add-On Required with an Add QuickBooks on Billing Page button. Free accounts have it without the add-on.

Only the account owner (or an owner-granted billing admin) can connect or disconnect. A plain staff login can't rewire your financial data to another QuickBooks company.

Connect

  1. Open QuickBooks.
  2. Click Connect QuickBooks Online.
  3. Sign in at Intuit and pick the QuickBooks company to link. You land back here with a connected banner.
  4. The Connection Status card now reads Connected and shows your company ID.

Disconnect

  1. Scroll to the QuickBooks Connection card at the bottom.
  2. Click Disconnect QuickBooks and confirm.

Disconnecting clears the stored tokens and stops all syncing. Your service/product mappings are kept, so reconnecting the same company picks up where you left off.

Disconnect stops every sync, including auto-export at creation. Invoices paid while you're disconnected don't post to QuickBooks on their own. They queue in the Manual Export to QuickBooks panel until you reconnect and export them.

Map your products & services to QuickBooks items and accounts

How each service or product routes to a QuickBooks item and income account, and why an unmapped line blocks the sync.

A mapping tells BulkTrackPro which QuickBooks item (and therefore which income account) each of your services and products posts to. Without one, the line has nowhere to land in QuickBooks.

How a line routes

Every invoice line follows the chain Your service → QB Item → QB income account. You set the middle link; the income account comes from the QB Item you pick. The Routing Summary table at the bottom shows this chain for every mapped service.

Create a mapping

  1. In the Account Mapping Interface, click a service or product in the left column (Your Services & Products).
  2. In the right column, stay on the QB Products & Services tab (the preferred path) and click the matching QuickBooks item. The income account is inherited from that item. The middle column shows a Proposed QB Item card.
  3. Click Create Mapping. The item gets a Mapped pill and the Mapped Items counter ticks up.

Prefer to pick a raw income account instead? Switch the right column to the Income Accounts tab, pick an account, and Create Mapping. Use Refresh Items / Refresh Accounts if a newly-added QuickBooks item or account isn't listed yet, and Create QB Account to provision a missing standard account (Sales, Inventory Asset, Cost of Goods Sold) without leaving this page.

Auto-create items

If you map to an income account (not an existing item), BulkTrackPro creates a QuickBooks item named BTP - <service name> on the first sync. The mapping shows Created on first sync until then. You can turn this off with Auto-create QB Items when mapping in the Inventory Accounting section if you'd rather manage items by hand in QuickBooks.

Inventory-tracked items

For an inventory-tracked service or product, QuickBooks only accepts income accounts of type Income / Sales of Product Income. The account picker hides incompatible accounts and shows an Inventory item notice. Use Create QB Account if you don't have a compatible one.

An unmapped line doesn't post silently. It fails the whole invoice with a 422 and the code QB_MISSING_MAPPING. If a service, product, fee, or tax line has no income mapping (or auto-create is off and no item is picked), the export refuses rather than booking it against QuickBooks' default item with the wrong account. Map every active service (the yellow Action Required banner lists the ones still unmapped), then re-sync.

Route delivery fees to their own QuickBooks item

Send delivery-fee revenue to a dedicated QuickBooks item instead of inheriting the product income account.

When you'd do this: you want delivery revenue booked to its own QuickBooks income account instead of landing in the material's income account.

What it does

By default a delivery fee reuses the order's product/service income item, so it inherits that product's income account (for example "Firewood income"). A delivery-fee mapping points the fee at a dedicated QuickBooks item and its income account instead. It never changes the invoice total, only which item the same fee dollars post to.

Set the default (mixed-material orders)

  1. In the left column, find the Default delivery-fee item (mixed-material orders) card.
  2. Pick a QuickBooks item from the dropdown. It saves on selection and shows a green check with the item name.
  3. To undo, click Clear.

This default covers orders that mix several materials. When nothing is set, the field reads Not set — uses the item's own income account.

Split delivery revenue by material

  1. Click a service in the left column (this option is shown for services, not products).
  2. In the middle column, use the Delivery fee income picker to choose a QuickBooks item for that material.

Per-material overrides win over the default. Each one is a deliberate, single save. There's no "apply to all".

Pick a Service or Non-inventory QuickBooks item for a delivery fee, never an inventory item. An inventory item would decrement QuickBooks stock on every invoice, so the save is rejected with "Pick a Service or Non-inventory QuickBooks item for a delivery fee — an inventory item would decrement stock."

Sales-tax handling: exact line item vs native QB tax

Choose whether the tax you collect posts as an exact line item or as real QuickBooks sales tax.

BulkTrackPro always decides what's taxable and at what rate. This setting only controls how that tax shows up on the synced QuickBooks invoice. It lives under Sync Settings → Sales-tax in QuickBooks, with two radio options.

Exact amount (line item): the default

Sends the exact tax you charged as a "Sales Tax" line. It always matches your receipts to the cent. QuickBooks records it as income, not under a QuickBooks tax code, so QuickBooks' own sales-tax reports won't pick it up.

Native QB tax

Marks each line taxable or non-taxable and lets QuickBooks record it as real sales tax, so QuickBooks' tax reports work. QuickBooks computes the amount itself, so it can differ by a cent or two from what you actually charged.

If an order has several different positive tax rates, that invoice falls back to the exact line-item "Sales Tax" line for that invoice even when native mode is on, so the tax still foots.

Picking

  1. Click Sync Settings (top-right).
  2. Under Sales-tax in QuickBooks, choose Exact amount (line item) or Native QB tax.
  3. Click Save Settings.

Native mode trades penny-exactness for working QuickBooks tax reports. If your bookkeeper reconciles tax inside QuickBooks, that cent-or-two rounding is expected. If you need every synced invoice to tie to the receipt exactly, keep the default line-item mode.

Export at creation vs manual export

The difference between posting invoices to QuickBooks automatically at order creation and exporting them yourself.

There are two ways invoices reach QuickBooks: automatically, driven by your sync settings, or on demand from the Manual Export panel. They're not mutually exclusive. The manual panel is always there as a backstop.

Export orders to QuickBooks at creation (accrual)

Set under Sync Settings. It's the accrual model: the invoice posts to QuickBooks as A/R the moment the order is created, the payment is recorded when the order is paid, and refunds auto-post. Two switches must both be on for it to run:

  • Enable Automatic Sync
  • Export orders to QuickBooks at creation (greyed out until Automatic Sync is on)

With Automatic Sync off, nothing posts on its own. You export by hand.

Manual Export to QuickBooks

The Manual Export to QuickBooks panel lists invoices not yet in QuickBooks, grouped so you can see what each export will do:

  • Credit Card Payments, Cash Payments, Check Payments: post the invoice with its payment.
  • Unpaid — post as A/R: posts an unpaid A/R invoice; no payment is recorded.
  • Record payment in QB: the invoice is already in QuickBooks but now paid; this records the payment against it without creating a duplicate.
  • Record additional payment in QB: more was collected since the last export; records only the extra amount.

Tick the invoices (or Select All a group) and click Export Selected. Each row shows its destination account, or a No QB mapping warning if it isn't mapped yet.

"All caught up!" and a load error look different on purpose. Don't confuse them. If the panel shows Couldn't load pending exports, that is a fetch failure, not an empty queue. Revenue is not reconciled. Click Retry. Only the green All caught up! state means nothing is waiting.

ACH payments: why they post to QuickBooks later

ACH payments wait for the bank to clear before they post to QuickBooks, so a bounced debit never leaves a stray entry.

An ACH (bank) payment doesn't post to QuickBooks the instant it's taken. It waits until the bank actually settles the debit.

Why the wait

ACH debits can be returned 1–3 days later for NSF or a closed account. If the payment were mirrored into QuickBooks immediately and then bounced, you'd have to go reverse the entry by hand. So BulkTrackPro holds the QuickBooks payment until settlement is confirmed.

What you see

  • Until the ACH settles, a sync attempt returns deferred. If you sync one manually the message reads "Payment is pending bank settlement — it will post to QuickBooks once the ACH clears."
  • Once the bank clears it, the payment posts to QuickBooks on the next sync, automatically if auto-sync is on, or when you export it from the Record payment in QB group.
  • Card, cash, and check payments don't defer; they post as soon as they're synced.

A paid ACH order can sit "paid" in BulkTrackPro while QuickBooks still shows it open for a few days. That gap is the settlement window, not a sync failure. It closes on its own once the debit clears.

How refunds post to QuickBooks (RefundReceipt)

A cash/card refund posts as a RefundReceipt that reverses the original income; a refund to store credit is handled differently.

A cash or card refund posts to QuickBooks as a RefundReceipt, a standalone money-out document that reverses the original sale's income.

What the RefundReceipt does

  • It's built from the same item mapping the invoice used, so the refunded dollars come back out of the exact income accounts they went into. In native-tax mode it also reverses the sales tax.
  • It records the cash-out against your deposit account: your configured deposit account, or Undeposited Funds if none is set.
  • It does not touch the QuickBooks invoice's balance; the invoice stays fully paid and the RefundReceipt records the money leaving.

Refunds issued as store credit

A refund given as store credit is not a RefundReceipt. It posts a journal entry that reclassifies the receivable into a store-credit liability. No cash leaves QuickBooks, because none left your business.

When QuickBooks can't be reached

A QuickBooks hiccup never unwinds a refund you've already given the customer. If QuickBooks is disconnected or the post fails, the refund is marked pending-manual so you can record it in QuickBooks yourself, and it surfaces in the Recent QuickBooks Activity feed.

If a refund races an auto-export, QuickBooks can briefly show the invoice fully paid while the refund is already done in BulkTrackPro. This leaves a pending-manual marker telling you to record the refund (RefundReceipt or credit memo) and reduce or unapply the QuickBooks payment so income and cash match. Watch the activity feed after refunding an order that synced moments earlier.

"Reconnect required" and missing-mapping errors

Fix the two most common QuickBooks sync failures: an expired connection and an unmapped line.

When a sync fails, the message points at one of two things: the connection, or a mapping. The Recent QuickBooks Activity feed (last 10 attempts, successes and failures) shows the exact error on each failed row.

"Reconnect required"

QuickBooks refresh tokens live about 100 days, and a partner can revoke access from Intuit. Both are expected states, not a bug. When that happens, syncs return "Your QuickBooks connection has expired or been revoked. Please reconnect QuickBooks from Settings → Integrations."

  1. Open QuickBooks.
  2. Click Connect QuickBooks Online and sign in again (owner or billing admin only).
  3. Re-run the export. Your mappings were kept.

Missing-mapping errors

A line with no income mapping fails with a 422 and the code QB_MISSING_MAPPING rather than posting to the wrong account. The message names what couldn't be routed: a service, product, fee, or tax line.

  1. Check the yellow Action Required banner. It lists services still needing a mapping.
  2. Map each one (see mapping products & services). If Auto-create QB Items is off, you must pick an existing QuickBooks item by hand.
  3. Re-export the invoice.

"This invoice is already being synced"

A 409 with "This invoice is already being synced to QuickBooks. Refresh in a moment." means another export of the same invoice is in flight. Wait a moment and refresh. It's self-correcting, not a failure.

A failed export is a held invoice, not a lost one. The invoice stays in the Manual Export to QuickBooks panel (rows show a No QB mapping flag where that's the cause). Fixing the connection or the mapping and re-exporting is all it takes. Nothing is double-posted, because the export is idempotent.

The Daily Journal Entry report

A one-day balancing entry (debits = credits) of how a day's orders were paid and what they were made of.

The Daily Journal Entry is a double-entry view of a single day (debits always equal credits) answering "for the orders created that day, how did the money come in and what is it made of?" It's a BulkTrackPro report; it does not push anything into QuickBooks.

How to run it

  1. Open Reports.
  2. Choose Daily Journal Entry and pick a date.

How to read it

The day is bucketed by order-created (invoice) date, not delivery or due date.

  • Debits = Cash + Credit Card (net of fees) + Check + ACH + Store Credit + Other + A/R added that day + BTP Fees.
  • Credits = Sales (goods + delivery + add-ons) + Sales Tax.

Credit card is shown net of processing fees with the fee broken out as its own debit line (Stripe processor ~2.9% + 30¢, BTP platform ~1%), so the fee cancels out and the two sides always tie. A/R added that day is the plug (gross minus every tender applied), so the entry foots to the cent. The report flags whether it's balanced.

"A/R added that day" can be negative, and that's valid. If a day's orders took in more tender than their gross (a net overpayment or credit against that day's orders), A/R goes negative. It's the balancing figure, not an error.

Inventory

How inventory works

The Stock Overview, the two value numbers, and what each product card tells you.

Inventory tracks stock levels across your products and services. Every product and every service you sell gets one card; a service and a product with the same name collapse to a single card (the service is the source of truth), so you don't see the same material twice.

The two tabs

  • Stock Overview: the cards, one per item, with a search box and (for multi-yard partners) a location filter.
  • Transaction History: every stock movement as a table: Date, Product, Type, Change, Before → After, and Reason / Order. Filter it by All Types, Order Deductions, Cancellation Returns, or Manual Adjustments.

The four summary numbers

  • Products Tracked: how many items have tracking on.
  • Low Stock: tracked items at or below their alert threshold.
  • Out of Stock: tracked items sitting at 0.
  • Est. Stock Value: the sum of quantity × that item's retail catalog price, across tracked items with stock. A rough "what's this worth at sale" figure.

The status badge on each card

A tracked card reads In Stock, Low Stock (at or below the threshold), or Out of Stock (0). An item you haven't set up, or have switched off, reads Not Tracked.

Est. Stock Value uses your retail price. The smaller Asset value (at cost) line underneath it (and the Asset value on each card) uses the cost per unit you entered, which is the balance-sheet number QuickBooks records. Asset value only counts items that have a cost set, so it is almost always lower than, and never equal to, the retail estimate.

Set up & adjust stock

Turn tracking on for an item, set its starting count, then add, remove, or recount stock.

When you'd do this: you want a material to show live stock, or you took in a delivery and need the count to match the yard.

Set up an item

  1. On Inventory, find the item's card and click Set Up Inventory.
  2. Enter the Current Stock Quantity.
  3. Set the Low Stock Alert Threshold. You're warned when stock falls to or below it. It defaults to 10.
  4. Add Notes (optional) if you want: storage spot, supplier, etc.
  5. Turn on Track inventory for this product, then click Save.

The Unit of Measurement is shown but not editable here. It's set by the product or service pricing (Cubic Yards, Tons, Bags, Pallets, Units, Gallons, or Pounds).

Adjust stock later

  1. On a tracked card, click Adjust Stock.
  2. Pick Add Stock, Remove Stock, or Set Exact.
  3. Enter the quantity (for Set Exact this is the New Quantity), choose a Reason, and click Confirm Adjustment.

Every change is journaled in Transaction History with the before/after and who made it. The toggle at the top-right of each card is a shortcut to turn tracking on or off without opening the full form.

Track inventory for this product starts off for an item you've never set up. Until you turn it on, the card reads Not Tracked: the item never deducts when orders come in and never blocks an oversell. Flipping the card toggle off later has the same effect. Tracking stops until you turn it back on.

Overselling is blocked: the hard stop

A tracked item with too little stock stops the order before it is created, with the exceptions that do not.

When an order is placed for more of a tracked item than you have in stock, the order is refused before anything is saved. The customer or staff member sees "Not enough inventory to place this order", naming the item, the quantity requested, and the quantity on hand. This applies to storefront checkout, the mobile app, and staff-created orders alike.

How the stock move happens

  • Placing an order deducts the stock of each tracked line, routed to the order's location.
  • The deduction can never drive a count below 0. It clamps at the floor. That is exactly why the up-front block exists: the block is the only thing that actually refuses the sale. Without it, a deduction would silently stop at 0 and the order would still go through.
  • Cancelling an order returns the exact amount that was removed.

Two things that are NOT blocked, by design

  • Untracked items. An item with tracking off has no stock to check, so it never blocks and never deducts. It behaves as it did before you ever opened this page.
  • Drafts. Saving an order as a draft skips the block entirely, because a draft is meant to be fixed up later. The check only bites when the draft becomes a real order.

The block is a true hard stop for tracked items, but it is not a universal safety net. A draft, or an item you forgot to turn tracking on for, will sail past it. If a product must never be oversold, confirm its tracking is on. See Set up & adjust stock.

Inventory across locations

When you run more than one yard, each location holds its own stock row, set up and counted separately.

If you run two or more active locations, stock is tracked per location. Each yard that carries an item has its own stock row, so one product can show one card per location, each with its own quantity, threshold, and history.

What changes with multiple yards

  • A location pill appears on each card, and a location dropdown (All locations by default) filters the Overview.
  • When you Set Up Inventory on a fresh item, you choose which location the count is for. A new item defaults to your first active location.
  • An order deducts from, and the oversell check runs against, the stock row at the order's location, not a shared pool.

A row's location is fixed

Once a stock row exists for a location, you can't move it to a different yard by editing it. The location is read-only in the setup form. To shift stock between yards, use a transfer instead.

Setting up stock at one yard does not stock it at the others. Each location starts empty until you set it up there (or transfer stock in). A single-yard partner is unaffected. Stock is held on one partner-wide row and the whole location picker stays hidden. See Transfers to move stock between yards.

Transfers: "transfer now" vs "send with a driver"

Move stock of one item between two yards, either instantly or as a run a driver hauls.

When you'd do this: one yard is short of a material and another has it, so you want to move stock between them.

The Transfer button sits on each inventory card (multi-location partners only) and opens the Transfer Stock window pre-filled with that card's item and location as the source.

Steps

  1. On a card, click Transfer.
  2. Choose how to move it: Transfer now or Send with a driver.
  3. Confirm the Item, the From and To locations, and the Quantity.
  4. For a driver run, also pick the Date. Add Notes if you want.
  5. Click Transfer Stock (now) or Create driver run.

The two modes

  • Transfer now: "Move the stock immediately." The source is debited and the destination credited in one atomic step. If the source doesn't have enough, it's refused on the spot.
  • Send with a driver: "Creates a run to assign; moves on completion." It creates a transfer order that lands unassigned on the assignments board for that date. The stock doesn't move until the driver marks the run complete.

Send with a driver moves no stock when you click it. The source keeps showing the full quantity until the driver completes the run. The move and the paperwork happen on completion, not creation. Transfer now is the opposite: it moves stock immediately and refuses right away if the source is short. Pick the mode that matches whether the material has actually left the yard yet.

The transfer order type

A fourth, fee-less order type that exists only to move stock between your own yards.

When you choose Send with a driver on a transfer, BulkTrackPro creates a transfer order, a distinct order type alongside delivery, pickup, and drop-off. It exists only to haul your own stock from one yard to another, so it behaves nothing like a customer order.

What makes it fee-less and internal

  • Its customer is recorded as Internal Transfer. There is no real buyer.
  • It carries no fees: no delivery fee, no surcharges. A transfer isn't a delivery, so none of the automatic fee logic applies, and the transfer screen sends no fee lines.
  • It is never invoiced and never charges anyone. No money moves.
  • It is held out of your sales figures and revenue reports, so it never inflates revenue or order counts. (It still appears in the Orders list, tagged Transfer.)

How the stock actually moves

The transfer order rides the normal assignments board. When the driver completes it, stock moves from the source location to the destination in equal measure. The destination is credited exactly what the source gives up, so a transfer can never create or destroy stock. Cancelling a completed transfer reverses the move the same way.

Transfers stay out of your sales and revenue numbers. Because a transfer is an internal stock move, it's excluded from order counts and revenue reports. Don't go looking for one there to reconcile sales. Cancelling a completed transfer reverses the move, returning the stock to the source location.

Editing an order does NOT move inventory

Stock is deducted when an order is created, not re-run when you edit it, so edits and inventory can drift.

Stock is deducted at one moment: when an order is created. Cancelling an order returns that stock. Nothing in between touches inventory, and that includes editing the order.

What this means in practice

  • Create an order for 5 yards and inventory drops by 5. That's the only automatic deduction for that order.
  • Edit that line up to 20 yards, or down to 2, and inventory does not change. The original 5-yard deduction stands.
  • The oversell block also doesn't re-run on an edit. You can edit a line above what's in stock without being stopped, because the check only guards order creation.

So after editing quantities on an existing order, your stock count no longer reflects what actually left the yard. Reconcile it yourself with Adjust Stock on the item's card (see Set up & adjust stock).

Editing an order never re-deducts or restores inventory. Only the create and cancel steps move stock. Change a quantity on a live order and you must correct the count by hand. The money side of an edit is a separate matter. See Editing an order for how charges reconcile.

Linking inventory to QuickBooks

Give an item a cost, turn on QB sync, and push it to QuickBooks as an Inventory Item.

When you'd do this: you want your stock to appear as an Inventory Item on your QuickBooks balance sheet, valued at what you paid for it.

Each tracked card carries a QuickBooks Inventory panel with a Cost / unit field, an Asset value, a sync toggle, and (once enabled) a sync button.

Steps

  1. On a tracked card, type the item's wholesale Cost / unit (what you paid, not your sale price). Asset value updates to cost × quantity.
  2. Turn on the QuickBooks Inventory toggle.
  3. Click Sync to QuickBooks. BulkTrackPro creates an Inventory Item in QuickBooks named "BTP - <item>", with your current quantity as its starting on-hand, your cost as the purchase cost, and your retail price as the unit price.
  4. Later, after a stock count done outside the order flow, click Push qty to send BTP's current quantity to QuickBooks as an inventory adjustment so the two match.

Syncing the same item again is safe. Once it's in QuickBooks the card shows "Synced (QB Item …)" and a second sync does nothing.

The sync toggle stays disabled until both a cost per unit is set and your partner-level Inventory Asset and COGS accounts are configured in QuickBooks settings. A cost of exactly $0 is rejected. Leave the field blank if the cost is unknown rather than entering zero. For the account mapping itself, see Map products & services to QuickBooks.

Yard Management

The yard board & how loads are logged

See every order loading out today and tally each truck that leaves the yard.

When you'd do this: a truck is being loaded in the yard and you want to record what went out against the order.

The board at Yard Board lists every order being fulfilled on the chosen day (titled "Yard Board · loading out today") with a progress bar per order. The three tiles across the top are Orders (total that day), In yard (not yet loaded out), and Loaded out (done).

Log a truck load

  1. Open Yard Board. It opens on today; use the date picker to see another day.
  2. Find the order. Type an order # or customer name into Search order # or customer.
  3. Click Log a load on the order's card.
  4. In Log a truck load, type the amount on this truck under Loading now for each product. Each product row shows how much is ordered, how much is already loaded, and how much is left.
  5. Optionally fill Truck / driver (free text, or pick a driver from the list) and Notes.
  6. Click Log load. The order's progress bar advances.

When the whole order has left, click Done to mark it Loaded out. Click Reopen to undo that. Use History on a card to see each truck logged, and the trash icon there to undo a truck.

Who can open it

The board is reachable two ways against the same data: office staff/owners with the Yard Board permission open it at /yard; drivers flagged as yard operators open it from the driver app. A staff member without the Yard Board permission sees "Yard access not enabled."

Logging more than what's left is allowed, not blocked. Over-entering a quantity shows a warning that more than remaining is allowed but to double-check the amount, and still saves. The board never caps a load at the ordered amount, so a fat-fingered quantity goes in as typed. Fix it with History → undo rather than logging a negative.

Per-product yard operation

How the board tracks each material on a multi-product order separately, and what one truck records.

An order with several materials is tracked per product, not as one lump. Each material on the card shows its own loaded / ordered tally in its unit (yd³, tons, cords, and so on), and turns green when that material is fully loaded.

One truck, one or more products

Log a load records one truck leaving the yard. On a multi-product order you enter how much of each material is on that truck in one go. Leave a product's Loading now blank if none of it is on this truck. Everything you enter together is saved as one trip (one "load out"), so History shows it as a single truck and the trash icon undoes the whole truck at once.

  • Each material can appear once per truck. Entering the same product twice is rejected.
  • On a multi-product order every logged line must be attributed to a product. There is no "whole order" quantity.
  • An older single-total order with no line items takes one plain quantity instead, tallied against the order's total.

What "fully loaded" means

Completion is strict per product: every material has to reach its ordered quantity. A grand total that happens to add up is not enough if one material still lags. The order isn't counted complete until each line is covered. This is the same check that auto-closes a pickup once it's fully loaded.

Undoing one row of a multi-product truck isn't offered. You undo the whole truck. The trash icon in History removes the entire trip (every material on that truck), because the rows share one load group. If you logged the wrong amount for a single material, undo the truck and re-log it, rather than expecting to edit one line.

Pickups at the yard

How a customer pickup behaves on the yard board: auto-close, the "Done" override, and reopening.

A pickup order is tagged Pickup (vs Delivery) on its yard card. The difference matters at the yard: a pickup has no drive-and-deliver step after loading, so loading the customer's truck is the end of the line.

Auto-close

When you log loads that bring every product on a pickup to its ordered quantity, the pickup is marked loaded out automatically. You don't have to click Done. Loading it out also advances the order itself to completed. A delivery never auto-completes this way; you either click Done at the yard or it completes through the driver flow.

Closing out early, and reopening

  • Click Done to mark a pickup loaded out before it's fully tallied (e.g. the customer took what they came for).
  • Click Reopen to undo a loaded-out pickup. That restores the order to the status it held before it was closed out.
  • The Log a truck load form reminds you that a pickup auto-marks loaded out once every product is fully loaded, and to use Done to close it out early.

Pickups with no scheduled date

A pickup without a delivery date still shows up, but only on today's view, so it doesn't clutter an arbitrary past or future day. It stays on the board the day it's loaded out so you can still undo it, then drops off the next day.

Undoing a load can quietly reopen a completed pickup. If you remove a truck from a pickup that was auto-marked loaded out and it's no longer fully loaded, the board clears the "loaded out" stamp and walks the order back from completed to its prior status. That is correct behavior, but it means an "undo" on a finished pickup can revive an order you thought was closed, so check the card's state after undoing.

Running the yard board on a shared screen

Leave the yard board open on a monitor as a live loading status for the crew.

When you'd do this: you want a live "what's loading out today" view on a monitor in the yard or office so the crew can see progress without asking.

The yard board is built to sit open: it refreshes itself every 30 seconds while the tab is visible, so a monitor left on Yard Board keeps showing current progress on its own. The header tiles (Orders, In yard, Loaded out) read across the room, and each order carries a progress bar.

Set it up

  1. Open Yard Board on the shared machine.
  2. Leave it on today (the default). Switching the date picker pins it to that day instead of rolling to the new day.
  3. Click Hide loaded to drop finished orders and show only what's still in the yard.
  4. Leave the tab in the foreground. Background tabs pause the 30-second refresh.

There is no separate full-screen "TV mode" for the yard board. It runs inside the normal app shell. The dedicated kiosk/wall display (bare, auto-refreshing, big pins) exists only for deliveries, on the Orders Map at /order-map/tv. For the yard, use the board itself on a screen; the auto-refresh is the same idea without the full-screen chrome.

The driver yard board (for yard-operator drivers)

How a driver flagged as a yard operator reaches and uses the loading board from the driver app.

When you'd do this: you're a driver or loader working the yard and need to tally trucks against orders from your phone.

The driver yard board at /driver/yard is the same loading board the office uses (same Log a load, per-product tallies, Done, Reopen, and History) rendered for the driver app.

Reaching it

  1. Log into the driver app.
  2. Open the menu and tap Yard Board.
  3. The link only appears for accounts flagged as yard operators. If an account isn't flagged, opening the board shows "Yard access not enabled. This account isn't set up as a yard operator. Ask your office to enable it," with a Back to Driver Portal link.

Use the Portal link at the top-left to return to the driver dashboard.

What a driver sees

  • The board shows the whole day's orders for the yard, not only the driver's own stops. A loader tallies whatever truck is at the dock.
  • A driver tied to one location sees only that location's orders; an unassigned (floater) driver sees the whole yard.
  • Logging, marking loaded out, and undoing all record who did it, by name, on the order's activity timeline.

The yard-operator flag is granted by the office, and revoking it cuts access on the next action, not at logout. The server re-checks the flag on every request, so a driver whose yard-operator access is turned off stops being able to load or undo immediately, even mid-session. If a loader suddenly gets "access required," their flag was pulled, not a bug.

Reports & Analytics

How reports work

Pick a report, set a date, read it on screen, and export it to CSV or PDF, plus the three things every number depends on.

Reports lists every report down the left sidebar, grouped by category. Click one and it runs against whatever date control that report uses. Change a date or a filter and it re-runs on its own.

The date control changes per report

A report shows only the control it actually consumes:

  • Range (start + end date) for most reports, with Quick-date presets (Today, Last 7, This Week, Last 30, This Month, Last Month, This Year).
  • Single day for Daily Sales, AR Added (Single Day), and Daily Journal Entry; defaults to today.
  • Month for Monthly Business Summary and Monthly Invoices.
  • "As of" date for AR Aging (a point-in-time snapshot); defaults to today.
  • No date for live snapshots: Outstanding Payments, Jobs Ready to Invoice, Customer List, Customer Lifetime Value, Repeat Customer Analysis, and Outstanding Store-Credit Liability.

Every report exports

Each report has Export CSV, Print, and Export PDF. CSV is the raw data table for a spreadsheet; Print and Export PDF open a formatted PDF preview first.

Two facts behind every money figure

  • "Paid" is invoice-derived, not order-derived. A paid/collected figure is read from the invoice (canonical, junction-aware), not from orders.payment_status. That order field never flips to "paid" for cash or check payments, so an order-based count would undercount every non-card sale.
  • Days are your local calendar day. Reports bucket by your business's local day (derived from your business address, defaulting to US Eastern), not the server's UTC day, so an evening order lands on the right date instead of tomorrow.

The reports use three different date bases and they are not interchangeable. Revenue Summary is booked by delivery date, Monthly Invoices is billed by invoice date, and Deposit Detail is collected by payment date. Running all three over "the same month" will give three different totals. That is correct, not a bug. Match the report to the question before you reconcile numbers.

Revenue & financial reports

The Revenue & Financial group: what each report measures and on which date basis, so you pull the right number.

These live under Revenue & Financial and all require the Financials feature.

ReportWhat it measures
Revenue SummaryBooked revenue by order (delivery) date, including tax & fees. Splits into Collected vs Pending; your total booked-sales figure.
Revenue by Service TypeBooked revenue grouped by service, with orders and average revenue.
Revenue by CustomerTop customers by spend over the range (Rank, Orders, Total Spent, Avg Order Value).
Revenue by Ad SourceRevenue + estimate close-ratio by marketing source. See Revenue by Ad Source.
Outstanding PaymentsLive snapshot of unpaid order balances (Amount, Days Outstanding, Payment Status). No date range.
AR AgingOutstanding balance by age bucket, as of a chosen date: Current (0-30), 31-60, 61-90, 90+.
AR Added (Single Day)New receivables created on one day.
Daily Journal EntryA balancing journal entry for one day, by order-created (invoice) date; debits equal credits.
Sales Tax CollectedSales-tax filing basis, by service (order) date, refund-adjusted. Use this for state filing.
Refunds & Net RevenueGross charged revenue minus recorded refunds = net revenue, over the range.
Revenue CompositionGross breakdown by delivery date into materials, tax, and fees (add-on / distance / manual / other), reconciled to the Stripe payout.
Monthly InvoicesPer-invoice detail by invoice date, including consolidated multi-order invoices. Billed, not booked.
Deposit DetailCash & payments collected by payment date, scoped to the selected location; optional payment-type filter.
Stripe PayoutsEach Stripe payout (Arrival Date, Payout ID, net Deposited) broken down to its invoice line items.
Fee Detail / Net SettlementPer-payment Gross, Stripe Fee, BTP Fee, and Net, plus who bore the Stripe fee.

A completed order that has no invoice yet shows under the separate Sales group as Jobs Ready to Invoice (Order #, Customer, Salesperson, Completed, Days Waiting, Total). It's your billing to-do list.

Revenue Summary's total is booked sales including tax and fees. It is not your taxable sales and not what landed in your bank. For a tax filing use Sales Tax Collected; for the money that actually settled after processing fees use Fee Detail / Net Settlement or Stripe Payouts. Reading the Revenue Summary total as your deposit will overstate your cash.

Cash reports

Cash Sales and Drawer Over/Short: the two reports for physical cash handling.

The Cash group has two reports, both Financials-gated.

Cash Sales

Cash collected over the range, grouped by period: Gross Cash Sales, Cash Refunds, Net Cash, and Transactions. Net Cash is gross minus cash refunds.

Drawer Over/Short

One row per closed cash drawer: Closed Date, Drawer / User, Location, Expected at Close, Counted, Over/Short, Opening Variance, Close Action, and Deposit Slip #. Over/Short is Counted minus Expected. Positive is over, negative is short.

Drawer Over/Short only has rows for drawers you actually open and close. If no one uses the cash-drawer workflow, this report is empty. That is not a data problem. Cash Sales, by contrast, reports every cash payment recorded on an order whether or not a drawer was used.

Outstanding Store-Credit Liability

A snapshot of store credit you owe customers, receivables they owe you, and pre-paid allotments still on the books.

The Outstanding Store-Credit Liability report (in the Store Credit group) is a live snapshot. It ignores the date picker. It carries three distinct figures plus detail rows:

  • Store Credit Outstanding: the total credit balance you owe customers (your liability).
  • Customer Receivables: balances customers owe you (accounts that have gone negative).
  • Allotment Liability: pre-paid, fixed-price material a customer has bought but not yet taken delivery of.
  • Accounts With Credit: how many customer accounts hold a positive balance.

Below the summary, each active allotment material lists its units remaining and dollar value, and each negative-balance customer lists what they owe.

These are three separate numbers measuring opposite directions of money. Do not add them into one total. A positive account balance is credit you owe; a negative balance is a receivable the customer owes you (shown as a "Receivable" row); allotment liability is undelivered pre-paid material. Netting them together hides both what you owe and what you're owed.

Customer analytics reports

Customer List, New Customers, Customer Lifetime Value, and Repeat Customer Analysis.

The Customer Analytics group has four reports. Each exposes per-customer spend, so each requires the Financials feature.

ReportWhat it showsDate control
Customer ListEvery customer with contact fields, Type (retail/commercial), Orders, Lifetime Value, and Joined date.Live snapshot (no range)
New Customers ReportCustomers acquired in the window: Name, Type, Orders, Total Spent, Joined.Date range
Customer Lifetime ValueCustomers ranked by Lifetime Value, with Orders, Avg Order, First/Last Order.Live snapshot (no range)
Repeat Customer AnalysisCustomers with more than one order: Total Orders, Total Spent, Avg Order, First/Last Order.Live snapshot (no range)

Three of the four ignore the date picker entirely. Customer List, Customer Lifetime Value, and Repeat Customer Analysis are point-in-time snapshots of all history. Only New Customers Report honors the start/end range. Setting a date range expecting to narrow the LTV or Repeat list does nothing; those always reflect every order on record.

Sales-rep reports

Revenue by Sales Rep, Top Reps Leaderboard, New Customers by Rep, and Sales Totals of Jobs Accepted.

The Sales Reps group has four reports.

ReportWhat it shows
Revenue by Sales RepEach rep's Orders, Total Revenue, and Avg Order Value over the range. (Financials.)
Top Reps LeaderboardReps ranked by Total Revenue (Rank, Sales Rep, Orders). (Financials.)
New Customers by RepNew customers each rep brought in. (Not Financials-gated.)
Sales Totals of Jobs AcceptedAccepted estimates per rep: Date Accepted, Date Proposed, Days To Accept, Job Name, Source, Discount %, Total w/o Discount, Total w/ Discount. (Financials.)

Attribution isn't uniform across these reports: Revenue by Rep and Top Reps credit the rep assigned to the order, while Sales Totals of Jobs Accepted credits the customer's assigned rep. Either way, work with no rep attached drops out, so an untagged order (or a customer with no rep set) understates the totals. Set reps consistently if you want these to foot.

Operations & delivery reports

Order Summary by Status, Delivery Performance, Driver Performance, Service Performance, and Product / Material Mix.

The Operations & Delivery group has five reports.

ReportWhat it showsFinancials-gated
Order Summary by StatusOrder counts and revenue broken out by order status.Yes
Delivery PerformanceDeliveries by status with Count, Avg Time (hrs), On Time, and Late.No
Driver PerformanceEach driver's Total Assignments, Completed, In Progress, Pending (ranked).Yes
Service PerformancePer service: Pricing, Price, Orders, Unique Customers, Total Revenue, Avg Order, Last Order.Yes
Product / Material MixPer product: Units Sold, Revenue, Avg Unit Price, Orders.Yes

Only Delivery Performance is open to staff without money access. The other four carry revenue columns and are Financials-gated, so an operations-focused staff member blocked from financials won't see Driver, Service, Material, or Order-Summary reports at all, even though they read as operational. Give them the Financials feature if they need those.

Email deliverability report

Whether your customer emails are landing (delivered, bounced, delayed, or marked spam) and which recent ones failed.

Email Deliverability (the Communications group) reports outbound customer emails and their delivery outcome over the range. It is gated on the Reports feature only, not Financials.

The summary

  • Delivery rate: delivered as a share of all sent.
  • Bounce rate: bounced as a share of emails that reached a delivered/bounced/complained outcome.
  • Counts for each status.

The statuses

  • sent: accepted by the mail provider, no outcome yet (pending).
  • delivered: reached the inbox.
  • delivery_delayed: temporarily deferred, still retrying.
  • bounced: rejected; the address didn't accept it.
  • complained: the recipient marked it as spam.
  • failed: could not be sent.

Below the summary, the most recent emails are listed (problem statuses first, then newest), capped at 500 rows.

This data is collected going forward. The report can only show emails sent after deliverability tracking was turned on, so an empty or thin early history means there was nothing to record yet, not that nothing was sent. The 500-row list is also a recent-activity window, not your full send history.

Daily & monthly summaries

Daily Sales Report and Monthly Business Summary: one-day and one-month roll-ups.

The Time-Based Summaries group has two roll-ups, both Financials-gated.

Daily Sales Report

Booked revenue for a single day, by order (delivery) date, including tax & fees. Pick the day with the single-day picker (defaults to today).

Monthly Business Summary

A month's booked revenue plus payments collected that month. Pick the month with the month picker (defaults to the current month).

The Monthly Business Summary mixes two date bases on purpose: booked revenue is by delivery date, but the collected-payments figure is by payment date and excludes store credit. So "revenue" and "collected" in the same month won't match each other. A job delivered this month may be paid next month, and store-credit redemptions never show as collected cash.

Scheduling & exporting reports

Email a report on a recurring schedule, send one now, or export any report to CSV or PDF.

When you'd do this: you want a report in your inbox every week, or you need a one-off file for your accountant.

Export the report you're viewing

Every report has three buttons: Export CSV (raw data table), Print, and Export PDF (both open a formatted PDF preview first).

Schedule a recurring email

  1. On Reports, click Scheduled Reports in the sidebar.
  2. In New scheduled report, set Name, Report, Frequency (Daily, Weekly, Monthly), Date range (Last 7 days, Last 30 days, This month, Last month), and Recipient email.
  3. Click Create scheduled report.

Manage existing schedules

Under Your scheduled reports, each row has an Active toggle, Edit, Delete, and Send now for an immediate one-off send.

The report list you can schedule is a fixed subset, and every financial one re-checks your Financials access on every action. A staff member blocked from financials can't create, edit, toggle, delete, or Send now a financial schedule. Editing a non-financial schedule to point at a financial report re-runs that check and is refused. The gate follows the report type, not the page.

Dashboard widgets

The draggable cards on your Overview dashboard: what each shows and which plan/feature each needs.

The Overview tab of your Dashboard is a customizable grid of widgets. Add, drag, resize, and remove them; the layout is saved per user. Click a widget (in view mode) to drill into the page that manages its data.

Widgets are grouped in the gallery as Operations, Financial, Customers, Team & Delivery, and Utilities.

  • Operations: Today's Orders, Total Orders, Confirmed, Pending, Recent Orders, Today's Deliveries, Unassigned Orders, Out for Delivery, Pending Estimates, Low Stock Alerts, Orders by Status.
  • Financial: Month Revenue, Revenue (14-day chart), This Week Revenue, Avg Order Value, Revenue by Service, Outstanding A/R, Overdue Invoices, A/R Aging, Payments Received, Sales Tax Collected, Days Sales Outstanding, Collection Rate, Top Customers, Payment Methods, Estimate Pipeline.
  • Customers: Total Customers, New Customers, Recent Customers.
  • Team & Delivery: Out for delivery now, Yard — loading out today, Drivers on the Clock, On-Time Delivery, Driver Leaderboard, Live Map.
  • Utilities: Quick Actions, Quick Access shortcuts.

Most financial widgets need the Financials feature plus a second data feature. A/R widgets also need Invoices & A/R, and several revenue widgets also need Reports (a couple, like Month Revenue and the revenue chart, need only Financials). A staff member missing a required feature won't see that widget in the gallery or the starter layout; it isn't hidden by a dashboard setting. Fix the person's feature access, not the dashboard.

Who can see financial reports

The Financials feature controls which reports a staff member can open, and it is enforced everywhere, not only in the sidebar.

Reports as a whole need the BulkTrack CRM plan and the Reports feature. On top of that, the clearly financial reports require a separate Financials feature, the switch that decides whether a given staff member sees money.

Who passes

Owners and admin staff always pass. Everyone else passes unless financials is in their blocked features. Block it and that person loses the revenue, cash, AR, tax, payouts, fee, store-credit, per-customer, and per-rep-revenue reports.

What stays visible without Financials

A few reports are gated on Reports only, so a financials-blocked staffer still sees them: Delivery Performance, Email Deliverability, and New Customers by Rep.

It's enforced end to end

The sidebar hides the financial categories so there's no "visible report that errors." But the real enforcement is on the server: the report API, the Export PDF endpoint, and every Scheduled Reports action each independently re-check Financials. There's no back door where a blocked user pulls a revenue number through an export or a schedule.

Hiding a report from the sidebar is cosmetic; the server gate is what protects the data. Don't rely on the menu being empty as proof a staffer can't reach a figure. Conversely, if you want to truly restrict someone, set their financials block, because renaming or reordering the sidebar does nothing. A reportType sent to the export or schedule API is normalized before the check, so a disguised value ("Revenue-Summary", trailing spaces) can't slip past it.

Revenue by Ad Source

Marketing attribution: revenue and estimate close-ratio grouped by the ad source customers came from.

Revenue by Ad Source (in the Revenue & Financial group) ties revenue and estimate performance back to the ad source recorded on the order or customer. Columns:

  • Ad Source: the source bucket; blank/unassigned rolls into Not Assigned so the report foots.
  • Revenue and # Orders: booked revenue (tax-inclusive) and order count in the range.
  • % of Revenue: that source's share of total revenue.
  • Proposed $ / # Proposed: estimates proposed in the window.
  • Accepted $ / # Won: those now accepted.
  • Close Ratio: won ÷ proposed.
  • Composite: a blended score of count-close-rate and dollar-close-rate.

The revenue columns and the close-ratio columns measure two different populations. Revenue counts orders falling in the range; the estimate side cohorts by proposed (created) date, so a quarter's "Close Ratio" is scoring the estimates written that quarter, not the ones won that quarter. Don't read across the row as a single funnel; the left half is realized sales, the right half is a cohort close-rate. All dollars are tax-inclusive.

How currency is displayed in reports

Report money shows with thousands separators on screen and in PDFs, while CSV exports stay as raw numbers.

Money in reports is formatted with a dollar sign, thousands separators, and two decimals: $84,210.00, not $84210.00. This applies to the numbers you read on screen and to the generated PDF export.

CSV is intentionally different

The Export CSV path writes raw numeric values (no dollar sign, no commas), so a spreadsheet reads them as numbers you can sum, sort, and chart.

A note on reconciliation

Each report's summary total is computed before any per-row rounding, so the summary is the authoritative figure. Re-adding the rounded per-row values yourself can land a cent or two off the summary. That's sum-of-rounded vs rounded-sum, not an error.

Don't expect the CSV to look like the screen. The commas and dollar signs are display-only; the CSV deliberately omits them so formulas work. If you paste a screen figure like 1,200.50 into a cell, the comma can make the spreadsheet treat it as text. Use the CSV's raw value instead.

Marketing & Growth

Coupon codes vs promo codes

Two different tools that look alike: a coupon grants store credit, a promo code discounts an order at checkout.

The Promotions page hosts two codes that are easy to confuse. A coupon code grants store credit; a promo code discounts an order at checkout. They are different mechanisms, not two names for one thing.

Coupon Codes: credit-grant

Create these on the Coupon Codes card. Redeeming the code adds a fixed dollar amount of store credit to a customer. The fields:

  • Code: the text the customer or your staff enters (for example WELCOME25).
  • Credit value ($): the store credit a single redemption grants.
  • Max redemptions (optional): total times the code can be used; blank means unlimited.
  • Expiry date (optional).

Each row shows a status of active, expired, or exhausted, and a Print voucher button that generates a printable voucher PDF to hand out.

Promo Codes: checkout discount

Create these on the Promo Codes card. Redeeming the code discounts an order at checkout. Pick a Discount type:

  • Percent off (whole order)
  • Amount off ($)
  • Percent off (per item)
  • Free delivery

Then scope it with Applies to (Entire order, Specific services, or Delivery), and optionally set a Minimum order ($), Max redemptions, a Per-customer limit (defaults to 1), and whether it's Stackable with other discounts.

Why the page sometimes shows only one card

Coupons move money (a redemption puts store credit on your books that you then owe the customer), so they live under the store-credit permission. Promo codes only reduce one order's total, so they live under the separate promotions permission. The page renders only the card(s) your plan's permissions cover: with store credit but not promotions you see Coupon Codes alone, and vice versa.

A coupon is not a discount. Its Credit value becomes spendable store credit (a real liability the business owes until the customer uses it), whereas a promo code forgoes revenue on the one order it's applied to. Reach for a promo code when you mean "take money off this sale," and a coupon only when you mean "put money in this customer's account."

Store credit & pre-paid allotments

How the per-customer store-credit balance works, and how pre-paid allotments lock a price for units bought ahead.

Store credit is a running balance kept per customer. Allotments are pre-paid, price-locked blocks of one material a customer buys ahead. Both are managed on a customer's record, under the Store Credit tab.

The store-credit balance

A customer's balance is a signed number on a ledger:

  • A positive balance is credit you owe the customer, a liability.
  • A negative balance is a receivable. The customer owes the business. A negative balance is valid, not an error; don't zero it out.

Credit lands on the balance three ways:

  • + Add Credit opens Add Store Credit, an out-of-band top-up for money the customer already paid you.
  • Grant Credit opens Grant Store Credit, a promotional give, no money collected.
  • Redeeming a coupon code adds the coupon's value (see Coupon codes vs promo codes).

A single load is capped at $999,999.99. A card-funded load settles immediately; an ACH (bank) load settles over several business days and only posts to the balance once the bank debit clears.

Reversing a ledger entry

A mistaken load or grant can be reversed from the ledger for fat-finger recovery. A redemption that was spent on an order can not be reversed here. Undo that through the order's refund or edit instead, so the order's tender and paid status stay in sync.

Allotments: pre-paid, price-locked units

Sell an allotment with + Sell Allotment. You pick the material, a Locked unit price ($/unit), and the number of units. The customer draws the units down later as they order. The funding choice sets how it behaves:

  • Charge card on file now: charge the saved card for goods plus tax up front.
  • Payment already collected (pre-paid): you took payment elsewhere; the units are treated as pre-paid.
  • Price Lock — bill per pickup (no charge now): nothing is collected at sale; each pickup is billed at the locked rate.

You can also send a customer a remote "lock in your winter price" offer link: a shareable link the customer opens without logging in, reviews, and pays by card. The allotment is created when they pay.

The liability report rolls these up: store credit outstanding (a liability), negative balances (receivables), and active allotments grouped by material.

The funding choice changes who owes tax, and when. A pre-paid allotment (card or already-collected) charges goods and tax at the sale, so each later pickup draws down tax-free. A Price Lock allotment collects nothing up front, so every pickup is taxed at the locked rate when it's drawn. Choose "pre-paid" for a Price Lock sale and you'll under-collect tax; choose Price Lock for a sale you already took payment on and the customer gets billed again at each pickup.

SMS marketing: campaigns, conversations, and templates

Send a text blast, reply to customers two-way, and save reusable message templates.

When you'd do this: you want to text customers a promotion, or reply to the texts they send back.

SMS is a paid add-on (+$69.99/mo on your Billing page) and must be activated in Integrations before the page will send. The SMS Communication page has four tabs: Campaigns, Conversations, Templates, and Test.

Send a campaign (text blast)

  1. On the Campaigns tab, choose Create Campaign.
  2. Enter a Campaign Name and the Message (capped at 160 characters).
  3. Set Send To: Customers or Drivers. For customers, set Customer Type: All Customers, Residential Only, or Commercial Only.
  4. Leave Allow Replies off for a one-way blast, or turn it on so responses land in Conversations.
  5. Use Preview Recipients to see the recipient count, then check Send immediately or leave it unchecked to Save as Draft. A draft shows Send Now and Delete buttons.

With Allow Replies off, a one-way customer campaign automatically appends "Reply STOP to unsubscribe." With it on, no opt-out footer is added. Campaign status reads draft, sending, completed, or failed.

Reply in Conversations

The Conversations tab lists two-way threads and auto-refreshes every 30 seconds. Open a thread to read its history and reply. Insert template pre-fills the composer with a rendered template you can still edit. A live counter under the box shows characters, segments, and encoding; a conversation message can run to 1600 characters.

Save templates

The Templates tab holds reusable messages. A template is either Manual (staff sends from Conversations) or tied to an automatic trigger: Automatic — "on the way" text or Automatic — "order completed" text. Insert merge fields such as {customerFirstName}, {companyName}, or {orderNumber} and they fill in with real data when the message is sent.

Test first

The Test tab sends a message to your own phone (enter it in E.164 format, e.g. +15551234567) so you can see what a customer receives. Test messages count toward your SMS usage.

A campaign only reaches customers who have opted into SMS, so the Preview Recipients count is often lower than your total customer list. That gap is excluded, not a bug. And the 160-character cap is a hard limit on campaigns: write tight, because there's no "continue in a second text."

Set up ad sources ("How did you hear about us?")

Curate the ad-source choices customers and staff pick at checkout, so you can measure where orders come from.

When you'd do this: you want to track where new orders come from by curating the "How did you hear about us?" choices.

Ad sources are managed in Order Settings on the Ad Source Options tab.

Steps

  1. Open Order Settings and select the Ad Source Options tab.
  2. Under Add New Option, type a source (for example "Google Search", "Facebook", "Referral") and choose Add.
  3. For an existing option, use the edit (pencil) button to rename it, Deactivate / Activate to hide or show it, or the trash button to delete it.

Your active options appear in the mobile app at checkout and in manual order creation on the dashboard, under the How did you hear about us? prompt. A customer is asked once per phone number. Inactive options are hidden from that prompt but not deleted.

To see what the captured sources are earning you, open the Revenue by Ad Source report, which groups revenue and estimate close-ratio by the source saved on each order.

Editing or removing an option never re-attributes customers already on file. The source is stored on the order/customer when first captured, and a returning customer isn't asked again. Deleting an option only pulls it from the picker; orders already tagged with that text keep it. To retire a source without disturbing your history or the Revenue by Ad Source report, Deactivate it rather than Delete it.

Communications

Automated emails & texts: what sends when

Which automatic customer messages fire on each event, and how the Commercial vs Residential toggles control them.

Every automatic customer message is on by default and can be switched off per customer type and per channel. BulkTrackPro keeps a separate set of switches for your Commercial and Residential customers, for Email and Text (SMS) independently. Nothing is suppressed unless you explicitly turn it off.

Where the switches live

Open Order Settings and choose the Communications tab. The panel is titled Communication Automation: "Choose which automated messages we send your customers. Everything is on by default — turn off anything that's too much." Flip between Commercial and Residential at the top; each keeps its own settings. Each row has an Email box and a Text (SMS) box. A dash means that channel doesn't apply to that message.

The messages, and what triggers each

  • Payment received / receipt (email): the receipt for a paid order. Fires when a storefront order is paid.
  • Order placed confirmation (email + text): the "we've received your order" message, sent when an order is created.
  • Order confirmed (email + text): sent when you move an order to confirmed.
  • Order completed / delivered (email + text): sent once, on the edge where the order becomes completed (driver finishes, or you mark it complete).
  • Order cancelled (email + text): sent when an order is cancelled.
  • Delivery scheduled / en route (text only): the "on the way" text a driver's start-delivery action fires.
  • Invoice & payment reminders (email): covered in Invoice & payment reminders.

Two things a toggle can't override

  • A hand-sent message always goes. These switches gate only the automatic sends. Sending an invoice or receipt by hand from an order still works regardless of these settings.
  • A text never goes to someone who opted out. If a customer replied STOP (or was opted out by an edit or import), no automatic text goes to them even when the toggle is on. A customer who was never asked still receives transactional texts.

Turning off a channel is silent and per-type. Switch off Text for Residential and those customers stop getting order-completed and en-route texts, with no per-order warning that they were skipped. The switch is scoped to the customer type you're editing, so check both Commercial and Residential before you assume a message is off (or on) for everyone.

Notices that always send: refunds, charges & payment failures

The transactional messages that ignore the Communication Automation toggles, and who receives each.

Money-movement notices are transactional and bypass the Communication Automation switches entirely. The Communications tab states it plainly: "Payment-failure and refund notices are always sent." Turning off a customer type's messages does not silence these.

What always goes to the customer

These send on the money event no matter what the toggles say:

  • Refund issued: "A refund of $X has been issued to your original payment method and will appear within 5–10 business days."
  • Refund as store credit: "A refund of $X has been issued as store credit to your account."
  • Additional payment required: when an edit raises the total and the balance is owed, with a pay link.
  • Additional charge applied: when an edit charges the customer's saved card for the difference.

Each arrives as an "Update on Your Order" email.

What always goes to you (the partner)

Bank (ACH) payment events notify you, not the customer, at your business contact email and phone:

  • ACH payment initiated: informational; funds settle in 3–5 business days.
  • ACH payment settled: quiet email confirmation; money is in your Stripe balance.
  • ACH payment failed: a loud "⚠️ ACH FAILED" text and email. The invoice flips back to UNPAID.

An ACH failure can land 1–3 days after the customer "paid", and after you've delivered. It is an alert to you, not a dunning message to the customer: recover the payment yourself (different card, cash, or new bank account) and contact the customer. Don't wait for the system to chase them for this one.

Get an email when a customer places an order

Set the address that receives a new-order alert, and turn it off by clearing it.

When you'd do this: you want an email in your inbox the moment a customer places an order.

Steps

  1. Open Order Settings. On the default Hours tab, scroll to Order Notifications.
  2. In Email me when a customer places an order, type the address that should receive the alert.
  3. Save. New-order alerts now go there, with the customer's contact, line items, fulfillment, and total.

To turn the alerts off, clear the field and save. The help text says it directly: "New-order alerts go here. Leave blank to turn order emails off."

This alert goes to the one address you set, for every new order. It is not split by Commercial vs Residential, and it is separate from the confirmation the customer receives.

This alert has no delivery log. It's sent and forgotten. If it stops showing up, there's no send record to check, so look in spam and confirm the address is spelled right before assuming something's broken. Only one address is supported; to route it to several people, use a shared inbox or a forwarding alias.

Invoice & payment reminders

The automatic dunning ladder, and the per-customer-type switch that controls whether it runs.

Reminders are the one automatic message that runs on a schedule rather than an event. When an invoice is first sent, a reminder ladder is created: 7 days before due, on the due date, and 3, 7, 14, and 30 days overdue. The job runs once a day at 9:00 AM Eastern. For how to send a reminder by hand and the rule about pay links on reminders, see Sending invoices: email, pay link & reminders.

When reminders stop on their own

A reminder in the ladder is skipped or dropped when:

  • the invoice is paid (the rest of the ladder is cancelled),
  • reminders are switched off on that individual invoice,
  • the invoice has no customer email, or
  • an ACH payment is still verifying or processing (those customers aren't delinquent, so they're not dunned).

The customer-type switch

Reminders are the only email in the Communication Automation grid (Order Settings → Communications): the Invoice & payment reminders row. It's on by default, set separately for Commercial and Residential. Turning it off for a customer type pauses the dunning ladder for those customers.

Switching off "Invoice & payment reminders" pauses the whole ladder, but reversibly. A reminder skipped because the toggle is off isn't deleted. Turn the toggle back on and it's re-evaluated on the next daily run. So a customer type you muted mid-cycle will pick the ladder back up where it left off, not fire a catch-up burst.

Activate SMS & register for A2P 10DLC

Turn on texting: add the SMS add-on, submit your business registration for carrier approval, and wait for active status before sending.

When you'd do this: before any text (automatic or hand-typed) can leave BulkTrackPro. US carriers require every business texting number to be registered (A2P 10DLC), so activation is a registration step, not a one-click toggle.

Steps

  1. Add the SMS add-on on your Billing page (+$69.99/mo). Until it's added, the SMS page shows SMS Marketing Add-On Required.
  2. Open Integrations and choose Activate SMS.
  3. Fill in your business registration: EIN (9 digits), business type, business address, website, and an authorized representative (real name, email, phone, and job title). These are sent straight to the SMS provider for carrier registration.
  4. Submit. Your number is provisioned and your A2P brand and campaign are filed for carrier review.
  5. Watch the status in Integrations. Carrier approval typically lands within about 72 hours. Use refresh to re-check. Once status is active, send a Test message from the SMS page to confirm.

What happens to your EIN and address

Your EIN, address, and representative details are forwarded directly to the SMS provider (Twilio) and are never stored in BulkTrackPro's database. They exist only inside the carrier registration, which is where A2P compliance requires them to live.

Nothing sends while registration is pending. A provisioned-but-unapproved number is in pending_a2p state, and carriers filter 100% of its traffic (error 30034). The messages look sent but never arrive. Sending is deliberately held until status is active. Also: the representative must be a real, reachable person. Synthesized or placeholder rep details get the registration rejected by the carrier.

The two-way SMS inbox (Conversations)

Read and reply to customer texts, insert a template, and open a thread straight from an order.

When you'd do this: a customer texted your business number, or you want to message one directly.

Steps

  1. Open SMS Communication and choose the Conversations tab. Each customer who has texted (or been texted) shows as a thread; unread threads carry a count badge, and the list refreshes on its own every 30 seconds.
  2. Click a thread to read its history and reply in the composer at the bottom. Press Enter to send; Shift+Enter adds a line break. A counter under the box shows characters, segments, and encoding.
  3. Use Insert template to drop a rendered message into the composer, then edit it or send as-is.
  4. From the Work Orders page, Text customer opens the right thread here directly, even for a customer who has never texted before.

Driver threads also appear here, marked with a Driver badge; they ride BulkTrackPro's shared number rather than your business number.

A thread exists only after someone texts. Inbound replies land here once a customer has texted your number or you've texted them first. A brand-new customer won't appear until there's a message. And Insert template lists only your active manual templates; the automated order triggers aren't offered for hand-sending.

Settings & Account

Company profile & business tax ID (EIN)

Set your company name, contact details, website, and EIN, and where each one shows up for customers.

When you'd do this: you're setting up the account, or your business name, phone, or address has changed and you need it right on customer-facing pages and invoices.

Steps

  1. Open Settings. The Company Profile card is at the top.
  2. Fill in Company Name, Contact Email, and Contact Phone. All three are required (the form marks each with a red asterisk). The phone is "used on customer-facing pages and driver contact info."
  3. Add your Website URL if you have one.
  4. Add your Business Tax ID (EIN), optional. It appears in the "Remit To" block on invoice PDFs so your customers' accounts-payable can set you up as a payee.
  5. Click Update Profile (it reads Create Profile the first time).

What the EIN does and doesn't do

The EIN is display-only on invoice PDFs. Your remit address, phone, and email for invoices are set separately under Branding → Contact, not here.

Your profile must be complete before the app works. Until Company Name and Contact Email are filled in, Settings shows a "Complete Your Business Profile Required" banner and the rest of the dashboard will not function properly. This is the first thing to finish on a new account.

Your API key & integration

Find, copy, and regenerate the API key used for custom integrations, and the header it goes in.

When you'd do this: a developer is wiring a custom tool into your account and needs your key, or a key has leaked and you need to rotate it.

Steps

  1. Open Settings and scroll to the API Key card.
  2. Click Copy API Key to put it on the clipboard.
  3. In your integration, send the key in the x-api-key request header for authenticated API requests.
  4. To rotate the key, click Regenerate Key and confirm.

Your storefront URL, subdomain, and QR code

The same Settings page carries three customer-facing identifiers derived from your subdomain: Your Storefront URL (with Copy URL and Open Storefront), the Business Subdomain itself, and the Customer QR Code (your subdomain doubles as the printed Business Code customers can type in the mobile app). Only the account owner can edit the subdomain; staff see it read-only.

Regenerating the key breaks every existing integration the instant you confirm. The old key stops working immediately. The confirm dialog says it "will invalidate your current API key and break existing integrations." Rotate only when you're ready to paste the new key everywhere it's used. The same goes for changing your subdomain: it rewrites your storefront URL and QR code, so previously shared links and printed QR codes stop working.

User management, roles & permissions

The roles, the admin and billing flags, per-feature blocking, and location scope, plus who can change whom.

BulkTrackPro has three roles and two privilege flags layered on top. Owner (one per business) always has full access. Staff start with full access that you narrow by blocking features. Admin is not a separate role. It's a flag on a staff user that grants full, unblockable access, plus the ability to manage other users. Billing & Stripe access is a second flag, on top of admin, that hands over full financial control. Drivers are managed on the Drivers page, not here; a driver only appears in this list once you've granted them office-dashboard access.

User Management lives at User Management and is open to the owner or an admin.

The access model

  • Block features: for plain staff, open the manage-features control and check anything the person should not see (Core, CRM, and Settings & Management groups). Leave everything unchecked for full access. You can also pre-set this when you Add Staff User so their first login is already scoped.
  • Make Admin / Revoke Admin: the shield action promotes a staff user to full access. Admins can't have individual features blocked (the block control is hidden for them).
  • Billing & Stripe access: the credit-card action, offered only for admins and only to the owner. Granting it gives that person control of your Stripe payout account and subscription: "only do this for someone you trust with your money."
  • Location: if you run multiple locations, the per-row location picker hard-scopes a staff user to one site; they "only see this location's orders, customers, and calendar." "All locations" clears the scope.
  • Active / Inactive: the seasonal toggle (staff only) frees the person's seat and blocks login while preserving their account and history. Block is the separate disciplinary action.

Who can change whom (the joint-admin rule)

An admin can promote plain staff to admin, but an admin cannot touch a peer admin. Stripping another admin, editing an admin's name/email, or changing an admin's location is owner-only. The server answers "Only the business owner can change another admin's access." No one can change their own admin status, and the owner's own admin access can't be revoked.

Seats

The header shows "Dashboard accounts available: X of Y" (free accounts read Unlimited). At zero, adding a user is refused with "No dashboard accounts available. Add more from the Billing page." Extra seats are $15/seat/mo from Billing.

Blocking a feature or revoking admin does NOT log the person out. It takes effect on their next login, and logins last up to 24 hours. The save confirmation says so directly: "Changes will take effect when the user logs in again." A location scope change is different. It applies on the user's very next request, no re-login. So if you're cutting off someone's access urgently, changing their features isn't instant; block the whole account (or have them sign out) to end the current session.

Activity log

See and export who on your team created, changed, or deleted orders, invoices, customers, inventory, and users.

When you'd do this: something changed on an order, invoice, or customer and you need to know who did it and when.

Steps

  1. Open Activity Log (owner or admin only).
  2. Narrow the list with the filters: Search descriptions…, the user picker (All Users), the record type (All Types / Orders / Invoices / Customers / Inventory / Users / Staff), the action picker (All Actions), and a date from / to range.
  3. Tick Hide yard load events to drop the high-volume "Yard Load Recorded / Removed" rows.
  4. Click Details on any row to open the event, including its IP address and metadata.
  5. Click Export CSV to download the filtered list.

What it tracks

Each row shows Time, User (with role), Action, Description, and the Record it touched. Tracked actions include order created / status changed / deleted / rescheduled, yard load events, invoice created / sent / paid / deleted, customer created / updated / deleted, inventory setup / adjusted, and staff added / blocked / unblocked / features restricted / removed.

This is a record-change audit, not a security or login log. It shows actions taken on your business data. It won't show failed logins, password resets, or page views. If you're chasing a suspicious sign-in rather than a changed record, this isn't the screen for it.

Cash drawers

Track each cashier's drawer, record cash movements, and settle shifts with over/short reconciliation.

When you'd do this: you take cash at a counter or on deliveries and need to count each cashier in and out and catch any shortfall.

Turn a drawer on

  1. Open Cash Drawers. Every eligible user shows as a card.
  2. Flip the per-card tracking toggle on (or open the gear, Drawer settings), set the Location if you run more than one, and enter the Petty Cash Float, the cash left in the drawer between shifts.

Record cash movements

On a tracked drawer, log Cash Movement by type: Paid Out (COD, fuel, tips, vendor), Cash Drop (to the safe), Bank Run (to the bank), or Add Petty Cash (from the bank). Enter an amount and a Reason.

Settle or hand off a shift

The audit panel shows Expected in Drawer, a Counted field (or a denomination grid when your drawer requires counting by bill), and an over/short line that reads Balanced, Over, or Missing Funds. Pick an action:

  • Settle: deposit sales, keep the float.
  • Add Petty Cash: load cash from a source.
  • Take Over: close out and hand the drawer to another user.
  • Set Exact: accept the count as truth (requires a Reason and an Approver).

The top of the page rolls up Open Drawers, Total Cash on Hand, Net Over / Short, and Unresolved Over / Short.

"Set Exact" writes off the discrepancy. It doesn't find the money. It forces the system balance to match the physical count, erasing that shift's over/short. Use it only after you've truly investigated, which is why it demands an approver name. Reaching for it to clear a red Missing Funds line only hides the shortfall.

Locations (multi-location)

How multiple service locations work: codes that drive order numbers, the default location, and per-site scoping.

Multi-location lets one account run several yards or branches as separate sites: orders and customers can be assigned to a location for filtering and reporting, staff can be scoped to a single site, and each location carries its own code, hours, and delivery zones. It's a paid add-on at $100/month per location (free accounts have it without the add-on), managed at Locations.

How a location is built

Each location has a Location Name and a Code, 2 to 8 letters or numbers (e.g. WST). The code is load-bearing: it drives order numbers like WST-1001. Address, phone, and email are optional. From a location's Manage hub you set its hours and delivery zones; the amber setup chips (Set code, Set hours, Add zones) flag what's still missing.

The default location

Exactly one location is the Default (the starred card). Setting a new default flips every other location's flag in one move, so new orders that don't specify a site land at the default.

Deactivating

Deactivating a location keeps it off your active list but preserves the assignment on existing orders and customers for historical records. It's not a delete. Inactive locations collapse under a disclosure at the bottom of the page.

Creating locations restricts nobody by itself. Scoping does. A staff user left on "All locations" still sees every site's orders, customers, and PII. To limit someone to one branch you have to set their Location in User Management; adding locations alone changes only labels and reporting, not who can see what.

Data, privacy & deleting your account

How to request account and data deletion, what gets erased, and which records are kept and for how long.

When you'd do this: you want your BulkTrackPro account and the personal data tied to it deleted.

Request deletion

  1. Open the Delete Your Account page for the full policy.
  2. Email privacy@bulktrackpro.com with the subject "Delete my account," from the email address (or using the phone number) on your account.
  3. Include the name and phone number used to place orders so the request can be verified.
  4. Verified requests are processed within 30 days, and you get an email confirming when it's complete.

Your legal terms live at Terms of Service and Privacy Policy.

What gets deleted

Your name, phone, and email; saved delivery addresses; login credentials and user ID; saved payment methods (card details held by Stripe are deleted from your profile); location data; and device identifiers.

What's kept, and how long

Order and payment transaction records (amounts, dates, items) are retained for up to 7 years for tax and accounting law, then deleted, de-identified where possible. Records needed to resolve disputes, prevent fraud, or comply with law are kept for as long as that law requires.

Deleting your account does not erase your transaction history. Order and payment records survive deletion for up to 7 years, and any supplier you ordered from keeps their own records under their own policies. "Delete my account" removes your identity data, not the financial paper trail the law requires us to keep.

Troubleshooting & common errors

The error messages BulkTrackPro shows, what each one actually means, and the fix.

Match the message you're seeing to its cause and fix.

Delivery & pricing

  • "This delivery address is outside our service area." The address falls outside your delivery zones. Fix the address, or widen the zone for that location.
  • "Add the city and ZIP, or pick the address from the dropdown, to price this delivery." The address is too incomplete to price. Enter city + ZIP or select the suggested address.
  • "Delivery distance could not be determined for this address." / "We could not verify this delivery address on the map." Geocoding failed. Re-check the address or pick it from the dropdown.

Inventory

  • "Not enough inventory to place this order: &lt;product&gt; (requested X, only Y in stock)." A tracked product is short. Reduce the quantity, restock, or adjust the inventory level.

Payments

  • "Card charge failed." The customer's card was declined by their bank. Have them try another card or contact their bank.
  • "These invoices were just charged by another payment. The card may have been charged — contact support to reconcile." Two charge attempts raced (code CONCURRENT_CHARGE). See the gotcha below.

QuickBooks

  • "Your QuickBooks connection has expired or been revoked. Please reconnect QuickBooks from Settings → Integrations." The stored token is dead. Reconnect from Integrations.
  • A line that won't post with code QB_MISSING_MAPPING means a product, service, fee, or tax line isn't mapped to a QuickBooks item. Map every line in the QuickBooks setup, then re-sync.

Customers & staff

  • A customer merge that fails with code MERGE_CONFLICT means the two records changed underneath the merge. Reload both and retry.
  • "You have used all N seats on the &lt;plan&gt; plan…" You're at your seat limit. Deactivate someone, or buy extra seats ($15/seat/mo) from Billing.
  • "This user has activity tied to their account… and can't be permanently deleted. Set them Inactive instead…" Delete is blocked because the person has history (e.g. orders they assigned). Use Inactive on the User Management row instead.

A CONCURRENT_CHARGE message means the card may already have been charged. Do not retry the payment. It fires when a second charge attempt collides with one that may have succeeded. Retrying can double-charge the customer. Contact support to confirm what actually settled before charging again.

Contact support

How to reach the BulkTrackPro team and what to include so they can find your account fast.

When you'd do this: something's wrong that the troubleshooting list doesn't cover, or you need a human to reconcile a payment.

Steps

  1. Open the Support page.
  2. Describe what happened: the exact on-screen message, the order or invoice number, and what you were doing.
  3. Include your Business Code (your subdomain, shown on Settings) so support can locate your account.

For account-data and privacy requests specifically, email privacy@bulktrackpro.com (see Data, privacy & deleting your account).

For a money issue, say what you saw and stop. Don't retry the charge while you wait. A CONCURRENT_CHARGE or a failed-but-maybe-settled payment can double-charge a customer if you attempt it again. Give support the invoice number and the message so they can check what actually settled first.

Can't find what you're looking for?
Our support team is available to help with anything not covered here. Contact support or email support@bulktrackpro.help.