Product submissions¶
Let a customer propose a new product for the catalog, then review it, approve it into a real product, or reject it with a reason.
A customer submits the product through the customer portal. Staff review it from the Product Submissions queue: approving creates a real Product record and links it back to the submission; rejecting sends the customer a reason and nothing further happens on its own. This gives customers a self-service way to expand the catalog without giving them direct write access, and gives staff a checkpoint to enforce SKU, dimensional, and handling-class standards before a product enters the system.
Before you begin
To submit a product, you need a portal account linked to a customer, plus the submit:products permission — staff without a customer link can't submit, only review.
To review the queue, you need view:products. To see the Approve and Reject buttons, you need manage:products.
Workflow at a glance¶
graph LR
A[Customer fills<br/>Submit Product form] --> B[SKU availability<br/>check]
B --> C[Submission<br/>PENDING]
C --> D{Staff<br/>review}
D -->|Approve| E[Catalog Product<br/>created]
D -->|Reject| F[Rejection reason<br/>captured]
E --> G[Customer notified<br/>APPROVED]
F --> H[Customer notified<br/>REJECTED]
style A fill:#e3f2fd
style C fill:#fff3e0
style D fill:#fff3e0
style E fill:#e8f5e9
style F fill:#ffebee
style G fill:#e8f5e9
style H fill:#ffebee Customer workflow¶
This section is for customer-portal users submitting products for catalog inclusion.
Opening the submission form¶
You submit a product while raising a delivery request — there's no separate Products page in the portal.
- Sign in to the portal. You land on Delivery Requests.
- Choose New Request.
-
When you reach a line whose product isn't in the catalog yet, use the submit-product shortcut in the form.
The submission form opens, and the new submission is linked to the request you're building.
Once staff approve it, the delivery request line is re-pointed at the real catalog product automatically. You don't need to come back and fix it.
Required and optional fields¶
| Field | Required | Notes |
|---|---|---|
| Product Name | Yes | Up to 255 characters. Example: Heavy Duty Widget |
| SKU | Yes | Up to 100 characters. Letters, numbers, and hyphens only. Checked live for availability. |
| Unit of Measure | Yes | One of: EACH, CASE, PALLET, LB, KG, OZ, G |
| Description | No | Up to 2,000 characters. Free-form product description. |
| Weight | No | In pounds. Decimal allowed. |
| Length / Width / Height | No | In inches. Decimal allowed. |
| Cases per Pallet | No | Whole number, 1 – 9,999. |
| Notes | No | Up to 2,000 characters. Special handling, compliance, or any info for the reviewer. |
Provide dimensions and weight when possible
Reviewers use weight and dimensional data to assign storage and freight classes during approval. Submissions missing this data are approvable but may be sent back for revision if your operations team needs it upfront.
SKU availability¶
As you type the SKU, the form checks it against the catalog and shows one of three states:
| State | Means |
|---|---|
| Available | Safe to proceed |
| Already in the catalog | The SKU belongs to an existing approved product |
| Pending approval | Another submission — possibly your own — is already using this SKU |
If the SKU is taken, change it before you submit.
Submitting¶
- Review all fields.
-
Choose Submit for Review.
A confirmation appears and the form closes. The submission is created with status Pending, and both staff reviewers and your own customer account get an in-app notification.
Checking submission status¶
The My Products section on the Delivery Requests page lists everything you've submitted, scoped to your own customer account. Each card shows the product name, its SKU, the date, a status badge, and — if it was turned down — the reason.
| Badge | Meaning |
|---|---|
| Pending | Waiting for staff review |
| Approved | Accepted — a catalog product has been created |
| Rejected | Declined. The reason is shown on the card |
The cards are a read-only summary; there's nothing to click into. If a submission was rejected, read the reason on the card and submit a corrected one.
Staff (admin) workflow¶
This section is for internal staff with the manage:products permission reviewing the submission queue.
Reviewing the submission queue¶
Open Catalog → Products. Pending submissions appear in a collapsible Product Submissions panel on that page — there's no separate entry in the sidebar.
| Column | Shows |
|---|---|
| Product | The submitted product name and its proposed SKU |
| Customer | The submitting customer's company name |
| UOM | The unit of measure submitted |
| Status | Status badge |
| Submitted | When it came in |
Click a row to open the review dialog.
The panel only ever shows pending submissions
It's hardcoded to the pending queue, and it disappears entirely when nothing is pending — so an empty Products page means there's nothing waiting, not that the feature is missing.
There's no search box and no status filter here, which also means approved and rejected submissions can't be reviewed from this screen. To look those up, use the API — see the API reference below.
Opening a submission for review¶
Choose any row to open the Review dialog. It shows every field the customer entered — name, SKU, and status badge; unit of measure, weight, dimensions, and cases per pallet; description and notes, if provided; and the customer, submitting user, and submission timestamp.
For a submission that's already been reviewed, it also shows who reviewed it and when, plus the Rejection Reason on a rejected submission or the Linked Product on an approved one.
Approving a submission¶
Approving a submission creates a real Product in the catalog and links back to the submission.
- Open the submission in the Review dialog.
-
Optionally, expand Show Overrides to adjust any of the following before creating the product:
Override Purpose SKU Normalize the SKU to your internal scheme Name Tidy up the display name Storage Class Assign a storage class (e.g., AMBIENT,REFRIGERATED)Freight Class Assign a freight class for rating NMFC Code National Motor Freight Classification code Lot Tracked Enable lot tracking on the new product Serial Tracked Enable serial-number tracking Reorder Point / Reorder Quantity / Max Stock Inventory planning defaults Cost / Price Financial defaults
SKU conflicts at approval time
If another product takes the same SKU between submission and approval, approving fails with a conflict error. Use the SKU override field to assign a different SKU and try again.
-
Choose Approve.
The platform creates the product using the submission's fields plus any overrides, marks the submission Approved with who approved it and when, and re-points any pending delivery-request lines that referenced this submission to the real product. The customer gets an in-app notification, and the change is written to the activity history.
Rejecting a submission¶
- Open the submission in the Review dialog.
- Scroll to the Reject section.
- Enter a Rejection Reason — required.
-
Choose Reject.
The platform marks the submission Rejected, records who reviewed it and when, and sends the customer an in-app notification with your rejection reason. Any delivery-request lines that referenced the submission stay blocked.
Write useful rejection reasons
The rejection reason is shown verbatim to the customer. Be specific and actionable — for example, "Weight and pallet dimensions required for LTL rating — please resubmit with weight and L/W/H" is far more useful than "Missing info". The customer can resubmit with the same SKU once the original submission is rejected.
Reason-code guidance¶
There are no hard-coded reason codes — the field is free-form. Common patterns most operations teams use:
| Pattern | Example reason text |
|---|---|
| Missing data | "Dimensions required for pallet calculation — please add L/W/H and cases per pallet." |
| Duplicate | "Equivalent product already exists in the catalog as SKU WIDGET-001. Please use that SKU on your delivery request." |
| Non-compliant SKU | "SKU does not follow XXX-000 format required for this customer. Please resubmit as HDW-100." |
| Needs classification review | "Hazmat classification required before onboarding. Please email compliance@… with the SDS and resubmit." |
| Out of scope | "This product falls outside the categories in your current MSA. Contact your account manager." |
Once reviewed, a submission is locked¶
Approve and Reject only work on a submission that's still Pending. If you made a mistake:
- Rejected by mistake — the customer resubmits. You can't "un-reject" from the interface.
- Approved by mistake — deactivate the resulting catalog product through the normal Products admin flow. The submission record itself stays approved, for the audit trail.
API reference¶
This section is for developers integrating with product submissions directly, not for day-to-day use of the screens above. All endpoints are prefixed with the platform API base URL and require a Bearer token.
| Method | Path | Permission | Purpose |
|---|---|---|---|
POST | /product-submissions | submit:products | Customer creates a submission |
GET | /product-submissions | view:products | List submissions (auto-scoped to customer for portal users) |
GET | /product-submissions/check-sku/:sku | submit:products | Live SKU-availability check |
GET | /product-submissions/:id | view:products | Submission details with reviewer and product relations |
PATCH | /product-submissions/:id/approve | manage:products | Approve and create catalog product |
PATCH | /product-submissions/:id/reject | manage:products | Reject with a required rejectionReason |
List filters supported on GET /product-submissions:
status[eq]—PENDING,APPROVED, orREJECTEDstatus[in]— comma-separated listcustomerId[eq]— staff-only scoping (portal users are always scoped to their own customer)search— matches name or SKUpage,pageSize,sortBy,sortOrder— standard pagination and sort (sortBy:createdAt,name,sku,status)
Response shapes follow the standard { data, meta } envelope used elsewhere in the API. Error responses use standard HTTP status codes: 400 for validation, 404 for not-found, 409 for SKU conflict.
Notifications¶
The platform sends an in-app notification on three events:
| Event | Recipients | Content |
|---|---|---|
| Submission created | Staff with manage:products for the submission's warehouse | "New product submission — Name (SKU) from Customer" |
| Submission approved | The submitting portal user and their customer organization | "Your product submission Name (SKU) was approved" |
| Submission rejected | The submitting portal user and their customer organization | "Your product submission Name (SKU) was rejected — reason" |
Choosing a notification opens the submission directly. In the staff UI that's the Review dialog; in the customer portal it's the status view, with the submission highlighted.
Audit trail¶
Every state change on a submission is recorded in activity history: creation; approval, with the status change from Pending to Approved and the new product it created; and rejection, with the status change from Pending to Rejected and the reason given. Each entry carries the acting user and the timestamp.
Troubleshooting¶
| Problem | Cause | What to do |
|---|---|---|
"User has no customers they can submit products for." (PS_NO_SUBMIT_ACCESS) | The signed-in user has no customer set on their profile. | An administrator edits the user in Users and sets a default customer, or the user signs in with a portal account that belongs to a customer. |
| "No warehouse assigned. Please contact your warehouse representative." | The submitting user has neither a preferred default warehouse nor a warehouse data filter. | Set a default warehouse on the user's profile preferences, or add a warehouse data filter assignment. |
| "SKU already exists in the product catalog" | An active, approved product already uses this SKU. | Use the existing catalog SKU on your delivery request instead — no submission needed. If the existing product is genuinely different, pick a unique SKU. |
| "SKU is already pending approval" | Another submission — possibly your own, from earlier — is already sitting in the queue with this SKU. | Check My Submissions; you may already have one open. Wait for it to be reviewed, or pick a different SKU. |
| Approve fails with "SKU was just taken" | Between opening the Review dialog and choosing Approve, another product grabbed the same SKU. | Expand Show Overrides, enter a different SKU in the SKU override field, and choose Approve again. |
| "Cannot approve/reject a submission in APPROVED status" | The submission has already been reviewed. Approve and Reject only work on Pending submissions. | See Once reviewed, a submission is locked. |
Related guides¶
- Order processing — how approved products flow into orders and delivery requests
- Customers — managing the customer accounts that portal submitters belong to
- Users — managing the
submit:products,view:products, andmanage:productspermissions - Bulk Upload — alternate path for importing large product catalogs (staff-only)
- Activity history — the audit trail behind every submission
Support¶
For product-submission assistance:
- Email: support@zoratech.io
- FAQ: Frequently Asked Questions
- Troubleshooting: Common Issues