Platform Roadmap & Planning Budget

Build the Safe Haven Metal Wholesale Trading Platform

A separate, account-only site where dealers buy from and sell to Safe Haven Metal at live PlatformGold pricing. Scoped lean, built in phases, pricing engine first.

Prepared by MRA
Phased Engagement
Draft v9 · August 18, 2026

Safe Haven Metal's retail store sells to the public. This is a different business: independent coin shops and small dealers trading in both directions, at wholesale spreads, on prices that move through the day. It needs its own site, its own pricing, and a checkout that works more like a trading desk than a shopping cart. This version is scoped as a working minimum, meaning the pieces that genuinely need to be programmed, with the rest handled by hand, by a plugin you already own, or left for later once there is volume to justify it.

The phases below are the work MRA does, and the figures are planning ranges rather than a quote. Everything else the platform needs is listed under The full picture, with who handles each piece, so the number is not hiding anything. It is the programming half of a larger plan. Each phase is re-scoped and confirmed with you before it begins, so ranges narrow to fixed numbers one phase at a time rather than all at once. The target is completion across 2027; phases are sequenced but deliberately undated, since no hard deadline is driving this.

Where the effort goes

Phase 1 is split in two, because the pricing engine and the catalog are separable pieces of work and only the first is well-understood ground. Phases 1a and 2 are prerequisites; 3 and 4 build on them. Phase 3 remains the largest, because the trade ticket is where live pricing, the countdown and the final price check all have to work together under time pressure.

Pricing Engine & Control SheetPhase 1a
$3,995–5,635
Catalog & CategoriesPhase 1b
$2,145–3,390
Site, Accounts & Card on FilePhase 2
$3,525–4,770
Buy Side & Trade TicketPhase 3
$7,840–13,560
BuybacksPhase 4
$3,785–6,670
SmallerLarger

Phase detail

Phase 1a comes first and everything depends on it. Phase 1b follows. Phase 3 depends on 1a and 2. Phase 4 depends on 2 and on the bid side of 1a, but not on Phase 3, so buy and sell can be built in either order. Throughout, ask and bid refer only to prices; the two kinds of orders are buy orders and buybacks.

Phase 1a

Pricing Engine & Control Sheet

$3,995–5,635

Before all other work · Foundation for both sites

  • One sheet controls the pricing. PlatformGold's ask and bid pull into a master sheet, one row per product. Against them sit four columns you control: a wholesale markup and a retail markup for each side of the trade. That is the whole pricing model, four numbers per product in one place, and everything the two sites display is calculated from them.
  • Why four columns and not two. Building the retail markups now costs almost nothing and means the same engine can drive SafeHavenMetal.com when you are ready, without being rebuilt. Nothing is pointed at the retail store in this phase; see the option further down.
  • The calculation moves off your server. Today the site recalculates every product's price itself, on a timer, all day long, and that is the single heaviest thing running on it. In the new model the sheet does the arithmetic and sends finished prices across. Your server stops computing and simply displays. That is the main reason to build it this way, and the benefit grows with the size of the catalog.
  • The markups go across as well as the prices. Finished prices drive the catalog listings. The markups are needed on the site too, because at the trade ticket and again at the final price check the site calls PlatformGold for the live number itself, and it has to be able to turn that raw ask or bid into the dealer's price on the spot.
  • Prices load separately from the page. Product and category pages are built with a space left for the price, filled in by a small call once the page opens. This sounds like a detail and is one of the more valuable things in this phase: the pages themselves become cacheable, because the changing number is no longer baked into them. How often that number refreshes is a setting rather than a fixed promise, and it can be tuned once we see how quickly the sheet keeps up.
  • Freshness where it counts. Catalog prices are indicative. The trade ticket runs live on a countdown. The check at submit confirms against PlatformGold before the order transmits. That is how PlatformGold's own desk behaves, and it keeps the catalog quick without ever committing to a stale number.
  • Availability is tracked per side, not per product. PlatformGold reports its appetite to buy and its stock to sell as separate numbers, so a product they have no bid on can still be bought and one out of stock can still be sold back. One flag for both would take half the catalog off the table for no reason.
  • Weight and metal type come across too. Not for pricing, since the prices come from PlatformGold, but because the processing fee is charged on the weight of an order and that sum cannot be calculated unless each product knows what it weighs and which metal it is. Neither is recorded on your products today, so the sheet supplies both.
  • Turn off the plugin's own pricing. The PlatformGold plugin is what currently recalculates on a timer. It gets disabled, which is where the load reduction comes from. The plugin stays in place for sending orders and importing products.
Range breakdown
Sheet structure, markup columns & calculated prices$740–1,110
Apps Script API pull & batched sync$1,110–1,480
Price, markup, availability & weight push$925–1,295
AJAX price feed & template placeholder$740–1,110
Plugin shutdown & testing$480–640
Sandbox credentials are already in hand. Sheet-side work is custom Google Apps Script against the PlatformGold API.
What moves the range Mostly the price feed. The sheet, the markups and the push are well-understood ground and move very little. Less certain is how far the separate price loading goes. The low end applies it to product pages; the high end covers category and search listings as well, which is more places for it to go wrong but also where most of the caching benefit actually lands.
Phase 1b

Catalog & Categories

$2,145–3,390

Follows 1a · Two ways to do it

  • Roughly 820 products. That is what PlatformGold currently lists, and the intention is to carry all of it. For reference, the retail store holds about 2,550 product records tied to PlatformGold, but only around 820 of those are live. The rest are older items no longer traded upstream. The wholesale site starts from the live set.
  • The plugin can create the products. PlatformGold's own plugin imports products with their names, images and descriptions, and stamps each one with its PlatformGold product number. That number is the identifier everything else keys off, on both sites, which is why it matters that the plugin already sets it.
  • Categories have to be built rather than imported. The plugin does not bring them across. PlatformGold does return a category tree per product, such as Gold, then Gold Bar, then 1 oz Bar, but only on the individual product call. So the tree gets assembled product by product and matched by its full path, because a name like "1 oz Bar" appears under every metal and matching on the name alone would file products in the wrong place.
  • Option A, the simpler one. The plugin creates the products. A button in the sheet pulls the category trees and produces a file that WooCommerce imports directly. WooCommerce already understands nested categories in exactly the shape PlatformGold provides, and creates any missing parents itself. Re-run whenever PlatformGold adds products. This is the option priced above.
  • Option B, the automatic one. The sheet holds the catalog and pushes products and categories on a schedule, so new PlatformGold products appear without anyone doing anything. More to build, and more to go wrong, but no recurring manual step.
  • The question that decides it is how often PlatformGold's catalog actually changes. A handful of products a month and Option A never really hurts. Constant churn and the manual re-run becomes the tax.
  • The import run verifies itself. Reviewing the retail product data turned up problems worth not repeating: one PlatformGold product number attached to two different products, three accessories set to calculate off the metal price, and a live product with no markup behind it. So the import confirms each product has one PlatformGold number and lands in a category before it goes live.
Range breakdown · Option A
Plugin import run & ID verification$480–800
Category pull via Apps Script$925–1,480
Category path assembly & import$740–1,110
Product creation uses the PlatformGold plugin's own importer. Option A is the figure carried into the total.
Option B, if chosen instead of Option ARange
Sheet-held catalog & scheduled product creation$1,850–2,775
Category push via API on change$1,295–2,035
Name, image & description sync$1,110–1,665
Testing$640–960
Option B total$4,895–7,435

Option B replaces Option A rather than adding to it. The difference is roughly $2,750 at the low end and $4,050 at the high end. It does not need deciding now: the catalog can start on Option A and move to Option B later if the manual re-runs become a nuisance, and most of Option A's work carries forward.

What moves the range How cleanly PlatformGold's category data behaves across the whole catalog, meaning how deep the trees run and whether any product sits in more than one of them. We have looked at a single product's tree in detail and it was straightforward. The high end assumes some of them are not.
Phase 2

Site, Accounts & Card on File

$3,525–4,770

Sequential with Phase 1a · Prerequisite for buy and sell

  • You supply the site, we build the dealer views. The base install is your existing site with the pages you do not need stripped out.
  • The template work is deliberately minimal to start. The bid price goes onto the product template and onto the category listing, next to the ask. Nothing else changes. Filtering, search and category browsing stay exactly as WooCommerce already does them. If the listing needs to do more than that later, it is priced separately below.
  • The application is a Gravity Forms form that lands unapproved. A dealer applies, the account is created in a not-approved state, and nothing is visible or tradeable until you switch it over. You vet them by phone or email the way every wholesaler already does, then approve, and fill in anything else you need directly in the WordPress user editor. No automated approval workflow, no status machinery beyond the flag.
  • The card goes on the account, not on the order. Nothing is charged when it is stored. There is no subscription and no recurring billing set up. The card sits on the dealer's account for one reason: if an order is placed and the payment never arrives, there is a way to recover rather than an argument. Storing it is a one time step, and it is the only thing standing behind the gap between a trade going live at PlatformGold and the wire landing.
  • Stored at the processor, never on the site. The card field is handled separately from the rest of the form and converted to a token in the browser, so only the token reaches us. We then create the stored profile at the processor. The site never sees or holds a card number, and no off-the-shelf form add-on does it this way, which is why this piece has to be built.
  • Two ways to get a card on file. Through the application form, or added by you while you are on the phone with a dealer. When you add one directly at the processor it has to be linked to their account on the site, or checkout will not know it exists, so there is an admin field for that.
  • Cards go stale, so something has to check. Expiration dates pass and cards get reissued. A scheduled task runs across active accounts and confirms each stored card still works, checking the expiry date locally first so it only calls the processor for cards that plausibly still do. That is the difference between finding out now and finding out at the moment you are trying to recover money.
  • Built so a bank account can sit there too. The processor can hold bank details on the same profile. Nothing is charged by ACH today, but treating it as a payment method on file rather than as a card means adding that later is configuration rather than a rebuild.
  • No sales tax, and no certificates in the system. These accounts are resale-exempt. The certificates live in your own files rather than being tracked in the platform.
Range breakdown
Bid price in product & category templates$555–740
Gravity Forms application & pending state$640–800
Card capture & stored profile on the account$1,110–1,480
Manual profile link on the user record$370–555
Scheduled card validity check$370–555
Theme setup & testing$480–640
Assumes the base site, the wholesale login plugin and Gravity Forms are supplied on your side. Hosting is handled there as well. Catalog and categories come from Phase 1b.
Optional, if the listing needs to do moreRange
Act on either side from the listing, order by SKU$1,110–1,850
Advanced filtering & saved lists$740–1,295
Optional total$1,850–3,145

These are the things that make a dealer's second visit faster than their first: acting on either side of the trade without leaving the listing, ordering by SKU, saved lists, and filtering built for someone who already knows what they want. Not included in the total, and better judged once dealers have used the plain version for a while.

What moves the range Very little, which is the point of scoping it this way. The card work is a fixed piece of plumbing and the template change is small and well-defined. The spread is mostly testing, and how much back and forth the application form needs before it collects everything you want.
Phase 3

Buy Side & Trade Ticket

$7,840–13,560

Depends on Phases 1a and 2 · The largest single piece

  • A live trade ticket. Running total, a countdown, and prices that refresh on a timer, so the number a dealer executes on is the number they have been watching rather than a surprise at the end. This mirrors how PlatformGold's own desk works, which is what these customers already expect.
  • Final price check at execution. The site calls PlatformGold at the moment the order is placed and confirms the live number before the order is committed. This mechanism already works on the retail store and carries over.
  • The trade transmits at submit, ahead of the money. Buy orders are standard WooCommerce orders and go straight to PlatformGold as sales orders, created directly rather than through the quote-and-execute path that expires in thirty seconds. Payment follows. That gap is why the card sits on the account from Phase 2.
  • The $29 processing fee applies by the rule below, using the conditional fee plugin already on your site rather than new code. It mirrors PlatformGold's own $24 handling charge with a small margin over it, and it depends on the weight and metal type that Phase 1a supplies.
Range breakdown
Trade ticket design$960–1,440
Ticket build & live refresh$2,405–4,070
Final price check at submit$1,295–2,220
Order transmission & tracking$1,480–2,405
Failed-transmission queue & retry$370–1,110
Processing fee & quantity rules$370–555
Testing against sandbox$960–1,760
Buy-side fee thresholds are configured in the conditional fee plugin you already own. Card storage is covered in Phase 2.
SideFee applies whenFee
BuyingOrder falls under 15 oz gold or 500 oz silver$29
Selling backOrder value falls under $20,000$29

These are starting settings, not fixed rules. The fee and both thresholds are adjustable once the site is running, so they can be tuned as you see how dealers actually trade. Two thresholds because the two sides are measured differently: weight is what PlatformGold charges against on the way out, value is the sensible test on the way back. Platinum and palladium thresholds still need setting, and they do matter, because there are roughly fifty platinum and palladium products in the catalog. Note that the buyback side needs a custom hook rather than plugin configuration, because the plugin does not see the second order type, and that sits in Phase 4.

What moves the range How much of the ticket runs live, and how much visibility there is when something fails. The low end refreshes on a timer and logs a failed transmission for you to find. The high end keeps the whole ticket live against PlatformGold and gives you an admin queue with one-click retry, worth having the first time an order silently does not land.
Phase 4

Buybacks

$3,785–6,670

Depends on Phase 2 · Independent of Phase 3

  • A buyback is not a sale, and is not recorded as one. No payment collected, no sales tax, and buybacks never appear in Safe Haven Metal's sales figures. It gets its own order type in its own admin tab, sitting alongside Orders rather than mixed into them. High-performance order storage is already switched on, which is what makes a custom type practical here.
  • The purchase order goes out by direct API. The PlatformGold plugin only knows how to send sales orders, so the purchase side is written against the API directly rather than extending the plugin. This is the piece with the least prior art behind it, since neither the plugin nor we have sent one before.
  • Both legs lock at commitment. The dealer's payout, PlatformGold's bid less your markdown, is fixed the moment they commit, and the purchase order goes to PlatformGold in the same instant. Both sides locked together means the spread is the margin, no matter what the market does while the metal is in transit. This is the difference between a predictable business and an accidental bet.
  • The metal ships straight to the warehouse. Safe Haven Metal never handles it. The label comes back from PlatformGold with the purchase order and the site hands it to the dealer, and because those labels carry Safe Haven Metal's own contact details there is nothing to work around. A dealer who would rather ship on their own carrier account can do that instead.
  • Fees and quantity rules need their own hooks here. Your conditional fee and quantity plugins do not see this order type, so the $20,000 threshold and any multiples have to be enforced in code on the buyback side.
  • You work the middle by hand. An admin list shows what is committed, what has shipped, what has landed and what is owed. You move each one along: shipped, received, dealer paid. At the volumes expected at the start that is faster and far cheaper than automating it, and the automation is easy to add later once buybacks are routine.
Range breakdown
Custom order type & data model$1,110–1,850
Bid lock & purchase order API$1,110–2,035
Fee & quantity hooks for the buyback type$555–925
Label read-back & shipping instructions$370–740
Flow design, admin view & testing$640–1,120
Labels come from PlatformGold. Status changes and dealer payouts are handled on your side. Buy and sell are not netted against each other.
What moves the range How much the purchase order side fights back. The API is documented but unproven from our end, and the low end assumes it behaves. The high end covers the sandbox work to find out where it does not, plus a fuller admin view with filtering once there are enough buybacks open at once to need it.

Total investment

Planning range · MRA programming
Phase 1a, pricing engine Prerequisite for everything$3,995–5,635
Phase 1b, catalog and categories Option A · Option B would replace it, see the phase$2,145–3,390
Phase 2, site, accounts and card on file Prerequisite for buy and sell$3,525–4,770
Phase 3, buy side and trade ticket Depends on Phases 1a and 2$7,840–13,560
Phase 4, buybacks Depends on Phase 2$3,785–6,670
All phases$21,290–34,025

An option for the retail store

A plugin that moves SafeHavenMetal.com onto the same sheet

Phase 1a builds retail markup columns into the sheet from the start, so once you are comfortable with how the pricing is being handled, we could build you a plugin that switches the retail store over to it.

The plugin does three things. It turns off the PlatformGold price updates, connects pricing to the sheet instead, and puts the price into the AJAX layer so that everywhere a product appears the price is pulled in live rather than being written into the page.

The gain is an immense amount of daily processing power. Right now the retail store recalculates every product price on your own server, continuously, and that is the heaviest thing running on it. Handing that arithmetic to the sheet takes it off the machine entirely. Loading the price separately also allows for far better caching and noticeably faster pages, which is the part your customers actually feel.

One thing to build in: the retail store feeds Google Shopping, and that feed reads the price from the product record rather than from the page. So a price still needs to be written there for the feed to pick up, even though what a visitor sees arrives live. Small addition, and worth catching up front.

Not included in the figures above, and it does not need deciding now.

The full picture

Everything the platform needs in order to run, and who handles each piece. Only the items marked MRA are in the figures above.

MRA Programmed by us SHM Handled on your side Plugin Already owned or built into WooCommerce Later Deferred, not priced
Pricing
PlatformGold ask and bid pulled into the control sheetMRA
Four markup columns, set and kept currentSHM
Wholesale and retail prices calculated for both sidesMRA
Prices and markups pushed to the siteMRA
Price loaded separately from the page, so pages can be cachedMRA
Availability tracked separately for each sideMRA
Weight and metal type supplied per productMRA
PlatformGold plugin's own pricing engine switched offMRA
Retail store moved onto the same engineLater
Catalog
Product creation, names, images and descriptionsPlugin
Category tree assembled from PlatformGold and appliedMRA
Re-running the category import when the catalog changesSHM
Fully automatic catalog and category syncLater
Standing checking tool across both sitesLater
Site
Base site, with the pages you do not need removedSHM
Bid price added to the product and category templatesMRA
Filtering, search and category browsingPlugin
Advanced listing, ordering by SKU, saved listsLater
Content and page copySHM
Accounts
Application form and pending-approval statePlugin
Application wiring and welcome emailMRA
Vetting applicants by phone or emailSHM
Creating and enabling the accountSHM
Password gating, so nothing is visible without a loginPlugin
Resale and exemption certificates on fileSHM
Multiple wholesale pricing tiersLater
Payments
Card captured at registration, tokenised, stored at the processorMRA
Card added by phone, linked to the account by handSHM
Scheduled check that stored cards still workMRA
Card as a payment method, with markupPlugin
Wire, check and ACH orders held until funds arriveMRA
Pulling the ACH debit in Wells FargoSHM
Bank details, held outside the platformSHM
Terms and conditions documentSHM
Terms acceptance at checkoutPlugin
Charging the stored card when payment does not arriveSHM
ACH as a live, self-service payment methodLater
Buy side
Trade ticket with live refresh and countdownMRA
Final price check at submitMRA
Order sent to PlatformGold as a sales orderMRA
Failed transmission log and retryMRA
Quantity and multiple rulesPlugin
Processing fee thresholds on buy ordersPlugin
Platinum and palladium fee thresholds, still to be setSHM
Moving orders to processing once paidSHM
Buybacks
Separate order type and admin tabMRA
Bid locked at commitmentMRA
Purchase order sent to PlatformGold by direct APIMRA
Fee and quantity hooks for the buyback order typeMRA
Marking shipped, received and paidSHM
Paying the dealerSHM
Automated settlement tracking and payout queueLater
Netting a buy against a buyback on one ticketLater
Rolls and multiples priced off a single PlatformGold productLater
Shipping
PlatformGold label read back and handed to the dealerMRA
Dealer ships on their own carrier accountPlugin
Insurance, through PlatformGold's coverage on the labelSHM
Beyond version one
Merchant API connection from the sheetLater
Opening the platform to other coin shopsLater
Ongoing maintenance and supportLater

The SHM items are the manual steps this version depends on. They are cheaper than automating them at today's volumes, but they are real work and they are written here so nothing is assumed. The Later items are not priced; each one can be scoped when it is worth doing.

Settled

Decided

  • Pricing lives in the sheet. Ask and bid from PlatformGold, four markup columns, wholesale and retail prices out for both sides of the trade.
  • The price calculation moves off your server and onto the sheet, which is the main performance gain in the project.
  • Prices load separately from the page, so pages can be cached and the displayed price stays current.
  • Lean first, automate later. Manual steps are preferred over automation anywhere volume does not yet justify the build.
  • Accounts are created by hand after you vet the dealer yourself. No automated approval.
  • The card sits on the account, not the transaction. Nothing is charged when it is stored, and there is no authorization hold per trade, since a hold could not be sized sensibly against a dealer who might trade a million dollars.
  • Market loss is recovered under the terms, by charging the stored card. Nothing calculates it in software.
  • Orders go directly to PlatformGold, not through the quote-and-execute path that expires in 30 seconds.
  • Buybacks get their own order type in their own tab, sent to PlatformGold as purchase orders by direct API.
  • Buyback labels come from PlatformGold. Their labels carry Safe Haven Metal's contact details, so nothing needs building around it.
  • Weight and metal type come from PlatformGold rather than being maintained by hand.
  • No licensing obstacle. Minnesota is the only state requiring dealers to be licensed and bonded, and that does not apply here.

Not included

  • A market loss calculation engine. Handled in the terms and, if it ever happens, by hand.
  • An authorization hold on each trade. Dropped deliberately, not deferred.
  • A standing catalog checking tool. The import run includes its own checks; a permanent monitor across both sites is worth doing later.
  • E-check or third-party ACH. At 75 basis points it costs more than the margin on a trade. ACH is a manual bank pull instead.
  • Netting a buy against a buyback on a single ticket. PlatformGold does this, but it extends credit against goods not yet received, which is a different kind of risk than trading.
  • Rolls, tubes and multiples built off a single PlatformGold product with a quantity multiplier. Worth doing if dealers ask for it, and the groundwork is already in the data.
  • Automated payouts and settlement tracking. Worked by hand in this version.
  • A Safe Haven Metal branded shipping label. Not needed, since PlatformGold's label already carries your details.
  • Migrating history. The wholesale site starts clean, with no customers and no orders.
  • A separate brand identity. This works within Safe Haven Metal's existing look.
  • Ongoing maintenance. This is project work. Keeping it current is better handled as a standing arrangement.