A Chrome extension for the Amazon Relay load board
Amazon Relay is where carriers find and book freight loads for Amazon's network. Its load board lists work opportunities with origin, destination, distance, stops, pickup times and payout, and those listings change constantly. For a carrier working the US load board, we built automation tools that watch the board, surface the loads that fit the operator's rules and, when told to, book them: first a Chrome extension, then a headless Node.js client.
The work ran through three iterations between April and June 2022.
Key features
- Reads the board's own data — a script injected before the page loads wraps
window.fetch, clones the load-board API responses and hands the JSON to the extension. Filters work on structured fields (payout, total distance, stop count, first pickup time, and every stop's state, ZIP code and facility) rather than on text scraped from cards. - Three operating modes — Simple alert watches for newly posted loads and for payout increases above a dollar threshold. Search finds and highlights loads that pass the filters. Auto book books matching loads until a maximum quantity is reached.
- Operator-defined filters — minimum and maximum distance, a buffer in minutes before the first pickup, a latest departure date and time, and a location filter by US state, five-digit ZIP code or facility code, used either as a whitelist or as an exclusion list. Full state names are normalized to two-letter codes, so "Illinois" and "IL" match the same loads.
- A controlled refresh loop — the extension pauses the board's built-in auto-refresh, triggers refreshes itself at a configurable speed plus a random delay, and waits for the load cards to render with a
MutationObserverbefore evaluating them. - Visual and sound cues — new loads are highlighted and moved to the top, loads whose payout went up get a badge showing the increase, and the best-paying new match is scrolled into view and expanded. Separate sounds play for a new load, a price change and a successful booking.
- Fast Book — an optional mode that relabels the Book button and confirms the booking dialog in the same action, removing a step when speed matters.
- Hotkey and tab safety — a single key starts and stops the loop, and the background script marks tabs as non-discardable so Chrome does not freeze a load board left running in the background.
Architecture and tech stack
Browser extension
The extension is a Manifest V2 Chrome extension written in JavaScript. A content script injects the control panel above the available-work list, built with jQuery, Bootstrap and a Moment.js date-time picker. A second script is injected at document_start as a web-accessible resource and runs in the page's own context, the only place where the load board's fetch calls can be observed. It passes each load-board response to the content script with window.postMessage.
The content script keeps the latest list of work opportunities in memory, compares it with the previous snapshot to detect new loads and payout changes, and applies the filters on every loop iteration.
Iterations
The first build, in April 2022, used Russian-language labels for the operators and included a mobile-view toggle saved in Chrome sync storage. The May 2022 build reworked the panel, moved the mode labels to English and added tab-discard protection in the background script.
Headless Node.js client
In June 2022 we added a Node.js client that talks to the same load-board API without a browser window. It replays the operator's saved search, with parameters such as origin radius, equipment types, minimum rate per mile and maximum stops, on an interval with random jitter. When a result appears, it checks the stops against a list of excluded facility codes, sends the booking request and stops polling.
Each search profile is a pair of files, an environment config and a request body, passed on the command line, so several profiles can run as separate processes. The client uses node-fetch and dotenv, is bundled with Webpack, and authenticates with the operator's own Relay session supplied through local config.
Automation design choices
Working from intercepted API responses meant the filters did not depend on card markup, and payouts could be compared as numbers instead of parsed from currency strings. The randomized interval, the quantity cap and explicit Start and Stop controls kept the operator in charge of how aggressively the tool ran. The Node.js client removed the need for a visible browser window, which the extension relied on: its panel reminds operators to keep the load board on screen.
Our role
We built and iterated all three tools over about two months: the first extension, its rework and the headless client, including the request-replay format and the multi-profile setup.
Related work
This project is part of our AI integration and automation work. For more tooling built on top of Amazon, see Amazon seller tools and the Amazon order and shipping widgets extension. For internal tools built from scratch, see web app development.



