Pricing App File Import

How to import a vendor price list CSV through the pricing app, including the gotchas that aren't obvious from tool signatures.

The canonical workflow for getting a vendor price list into the SuperHiTech pricing app. Used for Aqua Systems, TEXUB, HubX, D&H, and any other vendor that sends a CSV.

The short version

1. Get the CSV onto the pricing-app server at /tmp/<vendor>.csv
2. Call pricing_app_create_file_import with use_generic_parser=True
3. Monitor with pricing_app_get_import_status (or pricing_app_monitor_import)

Three steps. The traps are all in step 1 — read the rest of the page before you write any code.

Path rules

The pricing app reads files from the pricing-app server (nvrbackup, 10.10.0.14). Local Leif paths don’t work.

PathWorks?Why
/home/claude/file.csvThis is on the Leif host, not nvrbackup
/tmp/file.csv (via write_file)write_file writes to the Leif workspace dir, not /tmp/
/tmp/file.csv (via local_execute_command with heredoc)Same — local_* targets Leif
/tmp/file.csv on nvrbackup (via remote_execute_command heredoc)Correct — file lives on the right host
/tmp/file.csv (via pricing_app_parse_price_list with output_path)Server-side generation, lands in the right place

Bulk import (multi-row CSV)

Use this when a vendor has sent a real price list — dozens to thousands of SKUs.

Step 1: Write the CSV onto nvrbackup

remote_execute_command(
    command="""cat > /tmp/aqua-systems-2026-04.csv <<'EOF'
SKU,Manufacturer,Description,Price,Qty
AQS-1234,Aqua,Whole house filter,289.50,100
AQS-1235,Aqua,Replacement cartridge,42.00,500
...
EOF"""
)

The <<'EOF' heredoc with quoted EOF prevents shell expansion of any $-signs or backticks inside the CSV — important for product descriptions with prices like $299 or vendor codes containing backticks.

Step 2: Kick off the import

pricing_app_create_file_import(
    file_path="/tmp/aqua-systems-2026-04.csv",
    vendor_name="Aqua Systems",
    use_generic_parser=True,
)

The use_generic_parser=True flag is what makes this Just Work for arbitrary CSV layouts. Without it, the import will look for a vendor-specific parser and likely fail.

Step 3: Monitor

pricing_app_monitor_import(import_id=<id from step 2>)

This blocks until completion or timeout. For large imports use pricing_app_get_import_status in a poll instead.

Single-SKU import (one product, ad hoc)

Use this when you just need to drop in one item — a quote line, a one-off product, a quick test.

# Step 1: Server-side file generation via the parse tool
pricing_app_parse_price_list(
    raw_text="SKU,Manufacturer,Description,Price,Qty\nFOO-123,FooCo,Widget,49.99,10",
    vendor_name="FooCo",
    output_path="/tmp/foo-single.csv",
)

# Step 2: Import the generated file
pricing_app_create_file_import(
    file_path="/tmp/foo-single.csv",
    vendor_name="FooCo",
    use_generic_parser=True,
)

The pricing_app_parse_price_list tool is doing double duty here — it generates the file on the server, which sidesteps the path problem entirely.

::: callout Gotcha: pricing_app_parse_price_list is currently broken for CSV input (passing a CSV to its raw_text and trying to parse it directly). The workflow above is the only way the parse tool currently works for CSV: use it to write a file, then pass that file path to pricing_app_create_file_import. Don’t try to use it as a one-shot. :::

Vendor-specific notes

D&H

The D&H category importer requires the dandh-tenant header on every API call. The D&H API does not support server-side category filtering, so the importer pulls everything and post-filters client-side. ASIN enrichment coverage is currently ~79% — Lenovo SKUs in particular have a gap (~21% missing ASINs).

TEXUB / HubX

Standard generic-parser flow works as documented above. No special headers or post-processing.

Aqua Systems

Vendor sends prices as monthly emails with the CSV attached. Pipeline is: download attachment → save to nvrbackup → run import. The gmail_get_attachment tool handles the download.

When things go wrong

Import returns “success” but no products land

Almost always a path issue. The file isn’t where the importer is looking. Run:

remote_execute_command(command="ls -la /tmp/<filename>")

If the file isn’t there, you wrote it to the wrong host. See the path table above.

Import status stuck “pending”

The pricing app worker may have died. Check service health:

remote_execute_command(command="sudo systemctl status pricing-app-worker")

“models module not found” warning in cron logs

This is benign. It comes from the RS ticket sync cron job, not the pricing import. Ignore it. (Documented separately on the RS ticket sync pattern page when that gets written.)

  • Hostsnvrbackup access details
  • Tools — full signatures for pricing_app_* and remote_execute_command