Everything you need to set up and run your BulkTrackPro account, from your first product to your first payout.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
Two limits are enforced in the backend, not only printed on the card:
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?
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
.bulktrackpro.com suffix is fixed and shown beside it). It may contain only lowercase letters, numbers, and hyphens, with no leading or trailing hyphen.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.
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.
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.
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.
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.
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.
https://.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.
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.
Toggle each on or off:
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.)
Add up to 3 of your own under Custom Questions:
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.
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.
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.
The wide area across the very top of the store. Pick a Cover Style:
For Banner or Photo, add Overline, Headline, and Subhead text.
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.
Your phone, email, address, website, and social profiles, shown in the storefront nav, contact strip, and footer.
When you'd do this: you want customers to be able to call, email, or find you on social from the storefront.
The controls are under the Contact & Social tab on Consumer Branding.
These show in the nav phone button, the contact strip at the bottom of every page, and the footer.
Add only the platforms you use. Each field is a full URL:
Blank fields are hidden on the storefront, so there's no "empty" social icon.
The Mobile App section on this same tab holds your app-store links and a QR preview. See Your customer QR code.
The Business Address here is the same one the storefront's Store Info card shows when you turn on Show address. There's one address, set in this one place. See Storefront info bar, top cover & store-info card.
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.
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.)
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.
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.
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.
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.
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.
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.
Guest checkout turns on only when both of these are on:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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-ons are optional at checkout. The customer chooses whether to add them.
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.
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.
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 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.
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.
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.
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.
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").
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.
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.
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.
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.
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.
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.
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.
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.
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:
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.
With no depth choice, the app divides the measured area by the 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):
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.
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.
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.
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.
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).
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.
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.
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.
Once on, the product is only visible on the storefront to customers marked as Commercial. Retail shoppers never see it.
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.
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:
When an order is priced, tax is decided in this order:
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.
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.
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.
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 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.
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.
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 (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 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.
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).
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.
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.
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.
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.
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.
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).
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).
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.
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.
Status is computed from the last order date, not set by hand:
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.
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.
Open a customer and click Edit to change any field, then Update Customer.
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.
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.
Opted in, opted out, or never set, and why staff can only ever opt a customer OUT.
A customer's SMS consent is one of three states, not a simple on/off:
In the edit form the SMS control is deliberately one-directional:
There is no way for staff to opt a customer in from this screen. The server enforces it too. A save only ever moves the flag to opted-out, never to opted-in. Opting in has to come from the customer with recorded provenance, which is a TCPA requirement.
"Never set" is not the same as "opted out." A never-set customer still receives transactional order and delivery texts. Only marketing is withheld. Don't read a blank SMS state as "this customer can't be texted at all."
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:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
If no rule applies, the customer pays the catalog retail price.
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.
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.
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:
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.
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.
Every partner has one built-in Tax Exempt system tag (shown in purple). It behaves differently from your own tags:
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.
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.
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 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.
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.
On the profile Notes tab:
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.
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.
On the Sales Reps page:
You then assign a rep to a customer in the edit form (or in bulk, see Bulk pricing & assignment).
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.
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").
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.
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.
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.
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.
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.
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.
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.
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.
A draft intentionally skips inventory, invoicing, and customer notifications until you finalize it.
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.
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.
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:
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
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.
These create the order and immediately take money:
These create the order without collecting:
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.
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.
Until you finalize it, a draft does none of the things a real order does:
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.
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.
A manual order is born Confirmed (or Draft if you save it as one); an online order comes in Confirmed.
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.
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.
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.
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.
Open the order on the Work Orders page and set its status to Completed from the status controls.
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.
In the order detail, click Reschedule to change the delivery date and time.
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.
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.
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.
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:
Click Record Payment (cash/check) and enter the tender and any reference number.
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.
Click Enter card manually to open Collect Card Payment and key the customer's card at the front desk.
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.
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.").
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.
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.
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.
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:
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.
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.
Open Order Map to see the day's deliveries laid out geographically, color-coded by status, alongside depots and live drivers.
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.
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.
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.
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.
In the estimate editor, the No sales tax on this estimate toggle opens three behaviors (stored per estimate):
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.
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.
The date is optional. Leave it blank and the estimate never expires on its own.
An estimate is treated as expired once its valid-until date is strictly before today (in your business's time zone). An expired estimate:
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.
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.
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.
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:
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.
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.
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.
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.
Converting also generates the order's invoice (so it shows under Invoices & AR) and, if you're on QuickBooks sync, exports it.
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.
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.
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.
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.)
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.
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.
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.
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.
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.)
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.
A driver's status reads as one of Available, On Delivery, Returning, On Break, or Off Duty. The list auto-refreshes every 30 seconds.
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.
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.
Drivers sign in to the driver app at /driver/login with that email and password.
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.
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.
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.
A driver also has a Location (or All locations (floater)). A located order prefers that location's drivers plus floaters.
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.
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.
This saves right away, one order at a time, and texts the new driver.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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."
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.
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.
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.
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.
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.
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.
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.
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."
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.
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.
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.
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.
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.
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.
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.
A profile uses one mode at a time, chosen with the Mile bands / Map areas toggle:
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).
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 matched zone with a $0 fee is still deliverable. The address is in range, with no charge. No fee line is added.
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.
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.
In the Delivery Zone Pricing card (Fees & Services tab), band mode shows Reject orders beyond the furthest zone.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 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).
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."
To see everything you've parked, use the Held filter.
While an invoice is held, it:
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.
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.
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.
Two cases leave an order without an invoice:
These show on the Invoices page as Not yet billed rows. To bill one:
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.
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.
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 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.
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.
The email goes to the customer's current primary email. Billing-role contacts on the customer are auto-CC'd.
Click Send Reminder (tooltip: "Send Reminder") on the row. This is disabled once the invoice is paid.
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.
Select invoices with the row checkboxes, then:
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.
Re-sending a paid or committed invoice drops the pay link on purpose, so no one pays twice.
A pay link is attached only when the invoice genuinely still owes money. Re-send a paid invoice as a receipt and the email arrives with no link. That's the anti-double-pay guard, not a bug.
An invoice gets a live pay link in its email only when all of these hold:
Anything else sends the invoice or receipt with no payable link: paid, authorized (a card hold is already committed), partially paid, a payment in progress, or a dead order.
When an invoice is marked paid, or deleted, its stored pay link is deactivated. A customer who clicks an old link from a past email or a bookmark finds it dead, so they can't pay money you've already collected.
That action's only job is to collect, so it refuses outright when there's nothing to collect: "This invoice is not awaiting payment (already paid, authorized, in progress, or cancelled) — no payment link was sent."
One automatic path is not link-safe for held invoices. Holding an invoice blocks the manual Send and pay-link actions, but the daily reminder job does not skip held invoices. A held-but-unpaid invoice with reminders still scheduled can go out with a pay link attached. To be certain nothing collects, mark it paid or delete it rather than relying on hold alone.
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.
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.
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.
The trash button (tooltip: "Delete invoice") soft-deletes the invoice after a confirm dialog ("Delete invoice?"). Deleting:
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.
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.
| Label | What it is |
|---|---|
| Invoice # | The INV-… number |
| Date Billed | The invoice date |
| Order # / Order(s) | The single order id, or a count on a consolidated invoice |
| P.O. # / P.O. #s | Purchase-order reference(s) from the billed order(s), when present |
| Service Date | The delivery/service date, when present |
| Paid | The payment date, shown only on a paid invoice |
| Paid via | The real tender (Card, Cash, Check, Bank transfer…), on a paid invoice |
Three columns under the rule:
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.
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.
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 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.
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."
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.
Outstanding balances bucketed by how far past due they are:
| Bucket | Meaning |
|---|---|
| Current | Not yet due |
| 1-30 Days | Past due |
| 31-60 Days | Past due |
| 61-90 Days | Past due |
| 90+ Days | Seriously 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.
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.
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.
| Section | Where it shows |
|---|---|
| Email Subject | The default subject line when this template emails a customer |
| Opening Line | A short greeting line |
| Cover Letter | Page 1 of the invoice PDF, before the invoice table |
| Payment Terms | A PAYMENT TERMS block on the PDF |
| Footer | The closing line of the invoice/email |
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.
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.
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.
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.
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.
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.").
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.
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.
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.
Refund a customer and understand how it affects your payout.
When you'd do this: a customer needs money back on a paid order.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
ACH is for commercial customers only. Residential customers pay by card.
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.
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.
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.
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.
Email an invoice with a hosted Stripe link the customer uses to pay themselves.
When you'd do this: you want the customer to pay an invoice themselves instead of you keying their card.
When you email several invoices to one customer as a single statement, each line has its own payment link, so they can pay the invoices individually.
A pay link stays live until the invoice is paid. The moment the invoice settles (by the link, by another method, or by a manually recorded payment) BulkTrackPro deactivates the link so it can't collect a second time. A pay-link payment appears as Online payment on receipts.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
If the disputed charge was a combined payment across several invoices, each invoice's share is reversed and those invoices reopen.
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.
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>.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
This default covers orders that mix several materials. When nothing is set, the field reads Not set — uses the item's own income account.
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."
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.
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.
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.
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.
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.
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:
With Automatic Sync off, nothing posts on its own. You export by hand.
The Manual Export to QuickBooks panel lists invoices not yet in QuickBooks, grouped so you can see what each export will do:
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 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.
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.
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.
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.
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.
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.
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.
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."
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.
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.
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.
The day is bucketed by order-created (invoice) date, not delivery or due date.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Use the Portal link at the top-left to return to the driver dashboard.
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.
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.
A report shows only the control it actually consumes:
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.
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.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.
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.
| Report | What it measures |
|---|---|
| Revenue Summary | Booked revenue by order (delivery) date, including tax & fees. Splits into Collected vs Pending; your total booked-sales figure. |
| Revenue by Service Type | Booked revenue grouped by service, with orders and average revenue. |
| Revenue by Customer | Top customers by spend over the range (Rank, Orders, Total Spent, Avg Order Value). |
| Revenue by Ad Source | Revenue + estimate close-ratio by marketing source. See Revenue by Ad Source. |
| Outstanding Payments | Live snapshot of unpaid order balances (Amount, Days Outstanding, Payment Status). No date range. |
| AR Aging | Outstanding 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 Entry | A balancing journal entry for one day, by order-created (invoice) date; debits equal credits. |
| Sales Tax Collected | Sales-tax filing basis, by service (order) date, refund-adjusted. Use this for state filing. |
| Refunds & Net Revenue | Gross charged revenue minus recorded refunds = net revenue, over the range. |
| Revenue Composition | Gross breakdown by delivery date into materials, tax, and fees (add-on / distance / manual / other), reconciled to the Stripe payout. |
| Monthly Invoices | Per-invoice detail by invoice date, including consolidated multi-order invoices. Billed, not booked. |
| Deposit Detail | Cash & payments collected by payment date, scoped to the selected location; optional payment-type filter. |
| Stripe Payouts | Each Stripe payout (Arrival Date, Payout ID, net Deposited) broken down to its invoice line items. |
| Fee Detail / Net Settlement | Per-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 Sales and Drawer Over/Short: the two reports for physical cash handling.
The Cash group has two reports, both Financials-gated.
Cash collected over the range, grouped by period: Gross Cash Sales, Cash Refunds, Net Cash, and Transactions. Net Cash is gross minus cash refunds.
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.
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:
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 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.
| Report | What it shows | Date control |
|---|---|---|
| Customer List | Every customer with contact fields, Type (retail/commercial), Orders, Lifetime Value, and Joined date. | Live snapshot (no range) |
| New Customers Report | Customers acquired in the window: Name, Type, Orders, Total Spent, Joined. | Date range |
| Customer Lifetime Value | Customers ranked by Lifetime Value, with Orders, Avg Order, First/Last Order. | Live snapshot (no range) |
| Repeat Customer Analysis | Customers 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.
Revenue by Sales Rep, Top Reps Leaderboard, New Customers by Rep, and Sales Totals of Jobs Accepted.
The Sales Reps group has four reports.
| Report | What it shows |
|---|---|
| Revenue by Sales Rep | Each rep's Orders, Total Revenue, and Avg Order Value over the range. (Financials.) |
| Top Reps Leaderboard | Reps ranked by Total Revenue (Rank, Sales Rep, Orders). (Financials.) |
| New Customers by Rep | New customers each rep brought in. (Not Financials-gated.) |
| Sales Totals of Jobs Accepted | Accepted 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.
Order Summary by Status, Delivery Performance, Driver Performance, Service Performance, and Product / Material Mix.
The Operations & Delivery group has five reports.
| Report | What it shows | Financials-gated |
|---|---|---|
| Order Summary by Status | Order counts and revenue broken out by order status. | Yes |
| Delivery Performance | Deliveries by status with Count, Avg Time (hrs), On Time, and Late. | No |
| Driver Performance | Each driver's Total Assignments, Completed, In Progress, Pending (ranked). | Yes |
| Service Performance | Per service: Pricing, Price, Orders, Unique Customers, Total Revenue, Avg Order, Last Order. | Yes |
| Product / Material Mix | Per 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.
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.
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 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.
Booked revenue for a single day, by order (delivery) date, including tax & fees. Pick the day with the single-day picker (defaults to today).
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.
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.
Every report has three buttons: Export CSV (raw data table), Print, and Export PDF (both open a formatted PDF preview first).
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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.
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.
Create these on the Coupon Codes card. Redeeming the code adds a fixed dollar amount of store credit to a customer. The fields:
WELCOME25).Each row shows a status of active, expired, or exhausted, and a Print voucher button that generates a printable voucher PDF to hand out.
Create these on the Promo Codes card. Redeeming the code discounts an order at checkout. Pick a Discount type:
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.
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."
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.
A customer's balance is a signed number on a ledger:
Credit lands on the balance three ways:
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.
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.
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:
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.
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.
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.
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.
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.
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."
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.
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.
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.
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.
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.
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.
These send on the money event no matter what the toggles say:
Each arrives as an "Update on Your Order" email.
Bank (ACH) payment events notify you, not the customer, at your business contact email and phone:
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.
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.
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.
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.
A reminder in the ladder is skipped or dropped when:
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.
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.
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.
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.
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.
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.
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.
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.
x-api-key request header for authenticated API requests.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.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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 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.
How carrier registration, customer opt-in, and STOP handling work, and why marketing texts need affirmative consent.
US carriers require every business that texts customers to register under A2P 10DLC before any message is delivered, and the TCPA requires that marketing texts go only to people who affirmatively agreed to receive them. BulkTrackPro enforces both: it registers your brand with the carriers and gates marketing sends on a per-customer opt-in flag. SMS is set up from Integrations.
Activate SMS collects your EIN (Tax ID), Legal Entity Type, business address, and an Authorized Representative: "US carriers require a real contact at your business for A2P 10DLC registration." These details are sent directly to Twilio for registration and are "never stored in BulkTrackPro's database." While the carriers review, the card shows "Carrier registration pending". Budget 24 to 72 hours for the brand and up to 15 days for the campaign. (If you already run Twilio, "Connect your own Twilio account" keeps A2P registration in your own account.)
A customer's SMS consent has three states. When it's never been asked, the customer still receives transactional texts (order updates and driver notifications) but is excluded from marketing. Marketing campaigns send only to customers whose opt-in is affirmatively true; the campaign query filters on sms_opt_in = true. Customers opt in through the consent prompt at checkout.
Reply STOP is always honored and ends messaging to that number regardless of any other setting. The Allow inbound replies toggle decides whether other replies land in your SMS inbox or whether the number is "STOP opt-out only."
Never flip customers to opted-in in bulk to grow a marketing list. That's the TCPA exposure, not a shortcut. Consent has to come from the customer's own action; transactional order and driver texts already send without it. Blasting a marketing campaign to numbers that never opted in is exactly what the sms_opt_in = true gate exists to prevent.
What the auto-renewal checkbox at checkout commits you to, how the free-demo month works, and how to cancel.
Subscribing to BulkTrackPro is a recurring monthly charge, and checkout makes you acknowledge that before it will proceed. The consent sits on the Billing checkout as a checkbox you must tick. Leave it unchecked and the Subscribe button stays disabled, and checkout answers "Please acknowledge the auto-renewal terms to continue."
The checkbox states it plainly: "This is a monthly subscription that renews automatically at $X/month until you cancel." Add-ons (QuickBooks, SMS, extra users, locations) roll into that monthly total, and card processing fees still apply on top. The checkout also links the Terms of Service and Privacy Policy, and reassures that there are "No long-term contracts."
If you claimed a free first month through a demo, your card is charged the monthly total "starting about 30 days after signup unless you cancel before then." The free month delays the first charge; it doesn't remove the auto-renewal.
To cancel you submit a request, and BulkTrackPro ends the subscription "at the close of your current billing period", not immediately.
A free demo month still bills you around day 30 unless you cancel first, and cancelling ends at the period close, with no partial-month refund. The free month is a delayed first charge, not a trial you can walk away from silently. If you don't intend to continue, cancel before the ~30-day mark rather than after the card is charged.
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.
Your legal terms live at Terms of Service and Privacy Policy.
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.
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.
The error messages BulkTrackPro shows, what each one actually means, and the fix.
Match the message you're seeing to its cause and fix.
CONCURRENT_CHARGE). See the gotcha below.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.MERGE_CONFLICT means the two records changed underneath the merge. Reload both and retry.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.
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.
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.