Skip to main content

Configuring Your Entity

Before you start creating orders, recording payments, or managing inventory through the API, you need to configure your entity’s master data. This guide walks through the essential setup steps in the recommended order.

Step 1: Configure Locations

Every inventory movement, order, and fulfillment is tied to a location. At minimum you need one warehouse location.
name and code are required. The key needs the locations:write scope. Location types: warehouse, virtual, holding, writeoff, amazon, external, marketplace, dropship, overflow. Any other value is refused with a 400 that lists the valid ones. type defaults to warehouse. For warehouse and overflow locations, is_sellable and ships_from default to true; for every other type they default to false. is_receiving defaults to true. Warehouse, overflow and holding locations also get a quarantine bin created for them automatically. You can also add "is_default": true to the create call to make the new location the default in the same step. A location can be reviewed and edited in the app under Settings > Company > Locations.
address.email is required for USPS label purchase. USPS rejects every label transaction when the ship-from address has no email ("Attribute address_from.email must not be empty"). The email is forwarded to the carrier for delivery-status notifications and is never printed on labels.address.phone is recommended. Required for freight LTL pickup scheduling and DHL Express international shipments.If a ship-from location has no email, Arcus falls back to your entity’s support email and then to its accounting email. Set at least one of them, or an email on every ship-from location, to keep label purchase working entity-wide.
After creating your primary warehouse, designate it as the default:
Setting the default demotes the previous default location. When the location has a street address (address.line1), the same call also makes that address the entity’s ship-from origin for shipping rates and labels. Orders, inventory balances, and fulfillment packages are scoped to location_id. Your API key’s entity owns all location rows.

Step 2: Set Up Payment Terms

Payment terms define when invoices are due. They appear on orders and can be assigned per account.
A term can also carry an early-payment discount. This one is 2/10 Net 30, a 2 percent discount if paid within 10 days:
The key needs the payment_terms:write scope. Set one term as the entity default:
The previous default is demoted, and a term you promote is made active if it was not. Delete guard: You cannot delete a payment term that is referenced by orders or accounts. Reassign references first.

Step 3: Configure Tax Rates

Tax rates are your entity’s fallback rates when AvaTax is not configured or unavailable. If AvaTax is active, these rates are bypassed automatically. Rates are stored as decimals (8.25% = 0.0825).
Field reference: Lookup precedence: AvaTax (if connected) > entity tax_rates > 0%. The call needs the tax_rates:write scope.

Step 4: Set Up Currencies and Exchange Rates (Optional)

USD is seeded for every entity at creation, and Arcus books every transaction in a single currency today. Because of that, the calls that create a currency or an exchange rate are switched off by default: until multi-currency is enabled for your entity, each of them returns 501 with the code feature_not_enabled, and nothing is written. Reading currencies and exchange rates is not affected. If you do not sell in more than one currency, skip this step. When multi-currency is enabled for your entity, add a currency like this:
code must be three uppercase letters (an ISO 4217 code), or the call is refused with code_not_iso_4217. The key needs the currencies:write scope. Then record an exchange rate for the day (append-only, one row per date). Currencies can be named by their code or by their id:
from_currency_id and to_currency_id are accepted in place of the codes and win if both are sent, and effective_date is an alias of as_of_date. The key needs the exchange_rates:write scope. An exchange rate is only a recorded snapshot. No order, payment or ledger entry reads it today, so it never changes an amount.

Step 5: Configure Product Categories

Categories organize your product catalog. They also carry default UOM settings.
Only name is required, and the key needs the product_categories:write scope. The other fields you can set are default_length_uom, default_volume_uom, is_active (default true), is_final_sale (default false), and restocking_fee_pct and handling_fee_pct, each a number from 0 to 100.

Step 6: Set Up Pricing Levels

Pricing levels (price books) let you assign different prices to different account types. The defaults_on and show_on fields accept account-type values: individual, lead, business, vendor.
Vocab for defaults_on and show_on: individual, lead, business, vendor. A value outside this list is refused. Only name is required, and the key needs the pricing_levels:write scope. Per-product prices for a level are added separately through the product pricing call.

Step 7: Configure Units of Measure

System UOMs (EA, LB, OZ, IN, CS, etc.) are pre-seeded and cannot be modified. You can add custom UOMs for your industry.
Convert takes unit codes, and both units must be of the same type; otherwise the call returns a 400 that says why. Add a custom unit with POST /v1/units-of-measure:
uom_code, label, uom_type, base_code and to_base_factor are all required. uom_type is one of quantity, weight, length, volume or time. base_code must be an existing unit of that same type, and to_base_factor is how many of the base unit one of the new unit equals (a positive number). Codes are stored in uppercase. Creating needs the units_of_measure:write scope; listing and converting need units_of_measure:read. System UOMs (is_system: true) cannot be modified or deleted via the API; the call returns 403 system_row_locked. They are shared across all entities.

Step 8: Tags (Optional)

Tags let you label orders, accounts, and products for operational workflows. System tags (is_system: true) are pre-seeded and control fulfillment behavior (Hold Shipment, Block New Orders, etc.).
name is required, and the tag’s slug is built from it (or from a slug you send); a slug that is already taken returns 409, and slugs that match a status word such as paid or draft are refused. applies_to must list at least one resource type from order, account, product, return and package. A tag with "is_actionable": true must also name an action_key that Arcus recognizes. The key needs the tags:write scope. The attach call returns the tags it applied in data.applied; a tag already on the resource is left alone. It is refused with 400 when a tag does not apply to that resource type or is not found in your entity, and with 403 when the resource is not in your entity. Attaching a tag to an order that came from a connected Shopify store also adds the tag to that store’s order. Dual-scope requirement: Attaching a tag to a resource requires BOTH tags:write AND the resource’s write scope (e.g. orders:write for orders, accounts:write for accounts).

Step 9: Invite Your Team

Master data without people to act on it does not run an entity. Before going live, invite the operations, accounting, fulfillment, and support team members who will use Arcus. User management is currently a UI workflow. It is intentionally not exposed in the public v1 API surface because invitations, role assignment, MFA enrollment, and entity membership are organization-level concerns that span beyond a single entity’s API key scope. Send your ops admin to the in-app Organization Users page to send invitations. Where to invite users:
  1. Sign in to https://app.arcuserp.com.
  2. Open Organization.
  3. Choose Users (the page is Organization > Users).
  4. Select Invite User.
  5. Enter the email, choose the starting role, select the target entities, and optionally restrict location access.
  6. Send the invitation. The invited user receives an email, sets a password, completes MFA, and lands in the entity you assigned.
What to verify after inviting your first admin:
  • The user appears in Organization Users with a Pending status until the invitation is accepted.
  • After acceptance, the user appears in Settings > Team & Roles > Entity Team for the entity you chose.
  • The user can sign in and see the modules their role allows.
For the full UI walkthrough including roles, custom permissions, location restriction (Layer 4 isolation), MFA enrollment, and offboarding, read the support article: https://arcuserp.mintlify.app/support/settings/users. For role design, custom roles, and the Role Coverage Report, read: https://arcuserp.mintlify.app/support/settings/roles-permissions.
When user management is exposed in a future API release, this guide will gain curl examples for invite, role assignment, location restriction, and deactivation. Until then, treat user invite as a one-time bootstrap step done in the UI before your API integration starts shipping real orders.

For a new entity, configure in this sequence:
  1. Locations (warehouse + receiving dock)
  2. Payment Terms (Net 30, COD, CIA)
  3. Tax Rates (if not using AvaTax)
  4. Currencies + Exchange Rates (optional; only once multi-currency is enabled for your entity)
  5. Product Categories
  6. Pricing Levels
  7. Units of Measure (custom only; system UOMs already exist)
  8. Tags (optional, system tags pre-seeded)
  9. Integrations (Stripe, Shippo, AvaTax via Settings > Integrations in the app, then poll via API)
  10. Invite team members (Organization > Users, in the app)
After this setup, you are ready to create accounts, products, and orders.