Part-number search works
Searching FI-TE-04LLMK-W3-MS returns exactly one hit with price and Add to Cart, and the results page is noindex with a canonical to the search root — the right handling for buyers who type manufacturer codes.
An independent review of federalfp.com for the E-Commerce Developer & Content Editor role. I read three of the nine sitemap files (54,496 URLs), five category pages, 19 product pages and eight content pages, plus five pages on the sister store patriothyd.com — no logins, no carts. Search by part number works and the structured data is better than most distributors ship. The catalog behind it shows the marks of a bulk ERP import nobody has mapped yet: 20,242 product URLs with no URL key, specs trapped inside title strings, prices printed on parts you can only request a quote for, and supplier logos standing in for photos on 69% of the catalog. Six findings, six working fixes — each one is the job.
| Attribute | Value |
|---|---|
| Product Name | BV3-04-NPT |
| SKU | BV3-04-NPT-dnp |
| Weight | 5.000000 |
| Brand | DNP Americas |
| thread size · port · pressure · material | — (inside the name only) |
Why this review
The posting is a catalog job first: product listings, attributes, images, the ERP-to-Magento sync. A 52,000-SKU distributor's storefront shows exactly how that sync is doing, so I read it before applying.
Everything here comes from public pages: served HTML, the sitemaps, robots.txt and JSON-LD. I did not log in, add to cart or submit a quote request. Numbers marked sitemap-wide come from the three sitemap files I fetched, not all nine. I'm in Warren — Plymouth is 35 minutes away.
First, what works
On the same public-page rubric I run on the ShelfMark Michigan index, federalfp.com scores 61 of 100 — it would rank 19th of 21. The technical bones are better than that number: the gaps are in the data.
Searching FI-TE-04LLMK-W3-MS returns exactly one hit with price and Add to Cart, and the results page is noindex with a canonical to the search root — the right handling for buyers who type manufacturer codes.
Every sampled product page carries Product + Offer with price, currency and availability, shippingDetails (2–5 business days, $9.99, US), a merchant return policy and a BreadcrumbList; category pages add an OfferCatalog. 19 of 19.
/engineering-toolbox/ is a 2,570-word in-browser calculator suite — cylinder force, speed and flow, rod buckling, pumps, HPUs, pneumatics, conversions — with Shop Cylinders links back into the catalog, alongside a hose configurator and a product configurator.
Six findings
Each finding names the page, the count, the duty in the posting it maps to, and the fix inside Magento. Evidence chips name the captured file behind the number.
20,242 of 54,496 URLs (37.1%) across the three sitemap files fetched · 3 of 3 sampled pages return 200 with a robots-blocked canonical
robots.txt disallows /catalog/product/view/, yet sitemap_005.xml lists 10,879 URLs and sitemap_009.xml 9,363 of the form /catalog/product/view/id/93633/ — products imported without a url_key. Fetching three of them returns 200, and each page's own canonical points at another blocked URL (/catalog/product/view/_ignore_category/1/id/101454/s/804500106/). Google receives twenty thousand URLs it is told not to crawl.
The role owns ERP-to-Magento product data, and a missing url_key on ~20,000 SKUs is exactly the kind of import-mapping gap that silently removes products from search.
Filter the product grid for URL Key = empty, bulk-update (or re-import a CSV) with url_key = slugified name + SKU, reindex catalog_url_rewrite, regenerate the sitemap and verify no /catalog/product/view/ URLs remain. Keep the Disallow so the numeric duplicates never index.
18 of 19 PDPs with only Name / SKU / Weight / Brand · 0 of 19 with a thread, port, material or pressure attribute · Cylinders: 6 of 17 Bore values are inch-mark twins, 72 of 142 Bore×Stroke values are x/X twins, 2 values are Excel date serials
The More Information table on 18 of 19 sampled PDPs is Product Name, SKU, Weight and Brand; thread size, port, material and pressure appear only inside the name, e.g. “BV3-04-NPT 1/4″ Three way selector Ball valve w/ 1/4″ NPT Threads (5,800 PSI).” Where spec attributes exist (Cylinders, 953 items) the filter values are unnormalized: Bore lists 2.5 and 2.5″, Stroke 8 and 8″, Bore×Stroke 2 1/2 x 10 and 2 1/2 X 10, Rod Diameter 1 1/4″ and 1.25, Column Load mixes 11520 lbs with a bare 11. Two values are date serials — Ports (NPTF) = 44628 and Rod Diameter = 44624 — the sign of a fraction like 3/8 converted to a date in a spreadsheet before import. Weights are round defaults (a $3.40 stud coupling weighs 10.000000).
“Keep product data accurate” and “build listings with attributes” is the core of this role; these are the errors a buyer hits when filtering.
Define thread_size, port_size, material, pressure_rating, pack_qty and mfr_part_number in an attribute set per product line; parse them out of existing names with a one-off script (the parser below is that script); normalize option values — strip inch marks, lowercase x, one unit convention — under Manage Options; re-export the cylinder CSV with text-formatted columns so 3/8 never becomes 44628 again.
9 of 19 PDPs are Request-Pricing-only, and 8 of those 9 declare InStock in schema · 1 of 19 prints $0.00 · Chairs & Creepers page 1: 20 of 20 unpriced · a $40,000–$50,000 price bucket on couplings
Unavailable items swap Add to Cart for a Request Pricing and Availability button but still print a price on the PDP ($3.40 on a stud coupling whose listing card hides the price), and their JSON-LD still declares availability InStock. Product 804500106 shows $0.00. No PDP shows a stock quantity or in/out-of-stock text; only the three Patriot-brand valves show a lead time (“Usually Ships Within 1–3 Days”). Whole leaf categories are unpriced, and the Couplings price facet offers a $40,000–$50,000 bucket, so at least one coupling is priced above $40,000.
The posting names the Magento-ERP integration and inventory accuracy; these are what a buyer, and Google, see when quantity and price fields do not map cleanly.
Map ERP quantity and price into qty, is_in_stock and price on every sync run and key the RFQ module off is_salable; render Magento's stock-status block on PDPs; set Offer availability to OutOfStock or BackOrder (or drop the Offer) when the button is RFQ; add a sync alert for price = 0 or price > $10,000 on fittings.
10 of 19 sampled PDPs show a supplier logo as the only image · sitemap-wide, 35,744 of 51,918 products (69%) share a generic first image · 512 have no image at all
Five Yuken items show alaindustries.jpg, others show dnpamerica.jpg, stucchi.jpg, poclain.jpg or Damanlogo.jpg as the product picture; the two Stauff couplings share one family drawing. In the sitemaps the first image is a file shared by 100 or more products for 35,744 of 51,918 products, and one of six logo files for 14,732. Homepage category tiles carry mismatched alt text (Fittings.png alt=“Hydraulic Oil”).
The role writes copy, attributes and images for the store; a logo where the part should be is the single most visible content gap for a buyer comparing fittings.
Pull supplier line-drawing and CAD sets (Stauff, Tompkins and Poclain publish them) and import by SKU via Import → Products with base_image, small_image and thumbnail; use a per-family drawing as the fallback instead of the logo; set a Magento image placeholder so the 512 image-less SKUs stop rendering blank; fix the tile alts.
19 of 19 PDPs + 7 of 7 content pages share one description · 11 of 19 titles are the bare part code · 12 of 17 sitemap product URLs return 200 with a different canonical · 2,368 of 2,515 category URLs (94%) end in -1/-2/-3 · 58 homepage links into an alias category tree
Every product and content page fetched carries the same description (“Discover a trusted online destination for all your hydraulic requirements…”); product titles are the bare part code with no brand or site suffix (“BV3-04-NPT”). The URL layer is duplicated three ways: sitemap product URLs that canonical elsewhere (one to another SKU's key), category-path product links on listings whose canonical is the root URL, and a /hydraulics-1/ alias tree the homepage links into 58 times. Each page emits two BreadcrumbList blocks.
“Content editor” for a 52,000-SKU catalog means templates, not hand edits, and the crawl budget is currently spent on duplicates of the same part.
Set product meta templates under Product Fields Auto-Generation ({{name}} | {{brand}} hydraulic {{category}} | Federal Fluid Power, and a description from name + brand + first spec); set Use Categories Path for Product URLs to No with permanent redirects on key change; run a URL-rewrite cleanup so old keys 301 instead of 200; relink the homepage grid to canonical category URLs; remove the second breadcrumb block from the Hyvä template.
2 wrong-brand strings on every page · Shipping and Return Policy both link to /terms/ · 2 “#” footer links · 6 test/junk pages in the sitemap · the same typo on 19 of 19 PDPs · 2 of 2 SKUs duplicated across both domains
federalfp.com's footer reads “© 2023 Patriot Hydraulics” and the header says Call Us 734-479-9641 — Patriot's number (Federal's is 734-455-1722). Shipping Policy and Return Policy both open the 2,320-word terms page, and a second copy of it exists at /ffp-terms-conditions-of-sale/. Order History and Order Tracking link to #. The sitemap lists /test/, /webkul/, /webkul-seller/, /pictures/ and /privacy-patriothyd/; the 404 page is a clone of the homepage with the homepage title; every PDP prints “ask about our leads times?” Both sampled SKUs exist on patriothyd.com with identical content and self-referencing canonicals on each domain.
These are the first things a customer sees, and each is a ten-minute fix inside Content → Blocks and Pages for someone who owns the multi-store setup.
Scope the footer and header blocks to the Federal store view (copyright, phone); create real Shipping and Returns pages and relink the footer; disable the test pages and drop them from the sitemap; assign a proper no-route page; fix the typo in the PDP template; choose one canonical domain per SKU or noindex the Patriot copies.
Also counted
Working fixes
Everything below runs on what federalfp.com served on Sep 28, 2026 — the real product names, the real filter values, the real footer. Each one is the Magento change described in the finding, and two of them are the scripts I would run in week one.
The three keyless products I fetched, plus the sample set, run through the rule Magento's import needs: url_key = slug(name) + "-" + slug(sku), unique, lowercase, no inch marks. The output is the CSV column the bulk import takes; the blocked /catalog/product/view/id/N/ URLs leave the sitemap once the keys exist and the URL rewrites reindex.
| SKU | Name as imported | Today's URL | url_key (generated) |
|---|
Paste any product name from the catalog and watch thread size, port, pressure, material, dimensions and flow fall into structured attributes. This is the one-off script that populates the attribute set — and the reason the More Information table would stop reading Name / SKU / Weight / Brand.
Rules shown next to each value. Anything the parser can't place stays in the name and is flagged for a human — the script writes a review column, never a guess.
The Cylinders filter values exactly as the category page serves them, and the same values after one normalization pass: inch marks stripped, x lowercased, fractions restored from Excel date serials, units made consistent. Fractions and decimals meet in one convention (2 1/2 → 2.5, the way Bore already reads). Red = a twin of another value; orange = a date serial.
The nine sampled products whose button says Request Pricing, with the price the page prints and the availability the JSON-LD declares — then the Offer each should emit once the RFQ module keys off is_salable and the sync maps quantity.
| SKU | Brand | Button | Price shown | Offer.availability | Consistent? |
|---|
The 19 sampled products run through one title and one description template from Stores → Configuration → Catalog → Product Fields Auto-Generation. Every page unique, every title under 60 and every description under 155 characters — and the same sitewide description retired.
| SKU | Title today | Title (template) | Chars | Description (template) | Chars |
|---|
Today (every product)
With the template
The footer and header strings as federalfp.com renders them today, and the same blocks scoped to the Federal store view in Content → Blocks — the ten-minute fix a customer notices first.
The scorecard
The same rubric I run on ShelfMark, the Michigan Storefront Benchmark: findability, catalog, buy path, trust and content, scored 2 / 1 / 0 from what a public page shows. Open a pillar to read the evidence behind every score.
ShelfMark score · federalfp.com
Same 29 public-page checks as ShelfMark, the Michigan Storefront Benchmark. 2 = meets, 1 = partly, 0 = fails, U = not observable.
| F1 | 2 | HTTPS All 40 fetched pages served on https; canonical https://federalfp.com; no http redirects seen (captures/index.txt) |
| F2 | 1 | robots.txt robots.txt has 2 Sitemap: lines but 'Disallow: /catalog/product/view/' blocks 20,242 of 54,496 product URLs in the 3 sitemap files fetched |
| F3 | 2 | XML sitemap sitemap.xml = index of 9 files; sitemap_001.xml holds 19,921 URLs (2,484 categories + 17,437 products with image tags), lastmod 2026-09-18 |
| F4 | 1 | Title tags Homepage title descriptive; PDP <title> is the bare part code ('FI-TE-04LLMk-W3-MS - 6010000456'); 11/19 sampled titles code-only |
| F5 | 1 | Meta descriptions Homepage has a specific description; 19/19 sampled PDPs + 7 CMS pages share one boilerplate 'Discover a trusted online destination…' |
| F6 | 2 | Canonical tags Canonical on homepage (https://federalfp.com) and PDP (/fi-te-04llmk-w3-ms-6010000456.html); 3/3 unrewritten PDPs canonical to a blocked URL |
| F7 | 2 | Structured data PDP ld+json Product+Offer (price 22.9, InStock, shippingDetails) + BreadcrumbList; caveat: 2 BreadcrumbList blocks, InStock on 8/9 RFQ items |
| F8 | 1 | Clean URLs Rewritten URLs hyphenated (/fi-te-04llmk-w3-ms-6010000456.html) but 37% of sitemap products are /catalog/product/view/id/N/; 95% cats end -1 |
| C1 | 1 | Product titles Names are vendor part codes; 11/19 sampled have no descriptor ('BV3-04-NPT', '804500106'), 8/19 add one ('KS-A37-05-32 - Seal Kit for A37…') |
| C2 | 1 | Descriptions Both sampled couplings: 'DIN-Stud Couplings mild steel' (4 words); 17/19 sampled PDPs under 50 words, 7 just repeat the title |
| C3 | 1 | Imagery 1 gallery image on 14/19 PDPs; 10/19 show a manufacturer logo (alaindustries.jpg, dnpamerica.jpg, stucchi.jpg) as product photo; alt = code |
| C4 | 1 | Price & availability Price shown ($22.90) but no stock state/qty; 9/19 PDPs swap Add to Cart for 'Request Pricing and Availability' yet print a price ($3.40) |
| C5 | 1 | Variants & specs 'More Information' = Product Name, SKU, Weight, Brand only on 18/19 PDPs; thread/port/material live only in title/description; no variants |
| C6 | 2 | Taxonomy & breadcrumbs Tree up to 7 levels (2,484 category URLs in sitemap_001); breadcrumb nav + BreadcrumbList on PDP: Home / Adapters & Fittings / Couplings / … |
| C7 | 1 | Filters & sort Amasty filters (couplings: Category/Brand/Price; cylinders: Bore, Stroke, Rod Dia.) but no sort control; toolbar only 'Show 20 40 80' |
| C8 | 2 | Site search Header search; /catalogsearch/result/?q=FI-TE-04LLMK-W3-MS returns the exact item ('1 Item'); results noindex; page 1.74 MB, 528 facets |
| B1 | 1 | Primary CTA 'Add to Cart' on PDP and listing cards; homepage is a category-tile grid ('Click a category below') with no buy/quote CTA or featured items |
| B2 | 1 | Shipping & returns Footer 'Shipping Policy' and 'Return Policy' both link to /terms/ (legal T&C): returns 30 days, no restocking fee if new; no shipping rates |
| B3 | 1 | Checkout access 'Create an Account' (/customer/account/create/) + 'Checkout as a new customer' popup; guest checkout is a runtime flag, unverifiable |
| B4 | 1 | Merchandising Homepage = static category tiles + one banner (HPUBannerFFP.jpg); no new/best-seller/seasonal blocks; indexed /brand/patriot-hydraulics 404s |
| B5 | 0 | Trust signals No product/store reviews or ratings, no guarantee/award/secure badges on homepage or PDP; footer has only a theme 'cdz-footer-payment' strip |
| T1 | 2 | Contact Footer: 14940 Cleat St, Plymouth MI 48170 + Vestaburg + Gaylord addresses, phones (1-734-455-1722), sales@federalfp.com, hours; contact form |
| T2 | 1 | About /ffp-federal-fluid-power-info/ is a 126-word 'Services/About Us' block; same text reused on /career-at-federal-fluid-power-inc/ |
| T3 | 2 | Policies Privacy /ffp-privacy-policy/ (693 words) and Terms /terms/ (+ duplicate /ffp-terms-conditions-of-sale/, 2,315 words); no accessibility page |
| T4 | 0 | Social No facebook/linkedin/instagram/youtube links anywhere in homepage or footer HTML (grep on captures/homepage.html returned none) |
| T5 | 2 | Accessibility basics 'Skip to Content' link (#contentarea) on every page; listing/gallery images alt = product name (server-rendered gallery img alt="" until JS) |
| N1 | 0 | Blog / news freshness No blog/news link in nav, footer or the 63 CMS URLs in sitemap_009; no dated articles anywhere fetched |
| N2 | 1 | Guides / FAQ Engineering Toolbox (/engineering-toolbox/, in-browser calculators, 2,570 words) + Hose/Product Configurators; no FAQ page |
| N3 | 2 | Locations / where to buy Footer 'Locations' lists 3 branches with street address, phone and 'Mon-Fri / 8:00 am - 5:00 pm EST' (Plymouth, Vestaburg, Gaylord) |
If I joined
Keys and templates first, because they unlock the catalog for everything after.
About the reviewer
Seven years running wholesale and retail storefronts in Metro Detroit: catalogs of 14,000+ SKUs maintained by bulk CSV, platform migrations with redirects intact, product data mapped between an inventory system and the store, and the QA sheets that keep prices and product pages honest. WordPress, WooCommerce, Shopify; HTML, CSS and JavaScript; Python for the scripts above. Magento's admin and import model are the same shape as the catalogs I have run.
Warren, Michigan — 35 minutes from Plymouth · hireme@mousabatarseh.com · mousabatarseh.com · LinkedIn