Invoice Calculation
Monthly invoice for a single customer email. Aggregates TCV and License Fee per product group.
Document Signing
Send PDF documents for e-signature via DocuSeal and track signing status.
Orders
Browse and search direct orders or reseller orders.
| Enter a search term above and click Search. |
Formula columns
cols AL–BC of the Excel "Raw Data" sheet
Import CSV
Upload a
.csv file or an archive containing one
(.zip, .gz, .tar.gz, .bz2, .xz).
Columns should match the Excel Raw Data sheet (cols A–AK);
headers are matched case-insensitively. Derived columns (AL–BC) are
regenerated automatically after every import. Refund rows (negative
Order value) are stored alongside their sale row, sharing the same
Sales order number.
Fetch from Metabase
Import history
| When | File | Total | Inserted | Updated | Skipped | Failures | Notes |
|---|
Import Scheduler
Automate recurring Metabase fetches. At most one import runs at a time — extras queue behind the active one.
Schedules
| Name | Job / Report | Interval | Next run | Enabled | Actions |
|---|
Queue
Add Schedule
Backfill Jobs
New Backfill Job
| Name | Report | Progress | Status | Recur | Chunk | Delay | Last chunk | Rows | Actions |
|---|---|---|---|---|---|---|---|---|---|
| No backfill jobs. | |||||||||
Execution log
| Schedule | Report | Queued at | Status | Fetched | Imported | Fetch time | Import time | Error |
|---|
Lookup Tables
Edits trigger a recompute of the derived columns on all orders.
▸ Product List All products with their group, customer type, and bundle component groups (if any).
| Product | Group | Customer Type | Company | Bundle Groups |
|---|
▸ Product Groups Maps product name → product group / customer type / company.
| Product | Group | Customer Type | Company |
|---|
▸ Product Bundle Components Maps a bundle product name to the product groups it counts toward in the Product Penetration report.
| Bundle Product | Component Group |
|---|
▸ Product Owner Companies Maps product group → owning company / customer type.
| Group | Company | Customer Type |
|---|
▸ Countries Maps country → continent. Used by region rollups in reports.
| Country | Region |
|---|
▸ Excluded Account / vTiger IDs Account / vTiger IDs excluded from Same vTiger ID and Same Account ID expansion in License Timeline.
| Account / vTiger ID | Note | Added |
|---|
Users
Add users by their Microsoft email. They can sign in via SSO once added.
▶
awaiting approval
| Name | Microsoft Email | Joined | Assign role |
|---|
Active users
| Name | Microsoft Email (SSO) | Type | Role | Created | Last login | Manager |
|---|
API Keys
Issue API keys for external applications to access the CAM REST API (v1).
API Reference & Usage Guide
Authentication — include your key on every request via header or query param:
All responses return
X-Api-Key: cam_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
or
?api_key=cam_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{"ok": true, ...} on success or {"ok": false, "error": "..."} on failure.
GET
/api/v1/products
List all product groups and their products
include_hidden=1 optional — include hidden product groups (default: excluded)curl -H "X-Api-Key: cam_..." https://<host>/api/v1/products
# Response
{
"ok": true,
"product_groups": [
{
"id": 90,
"name": "Endpoint Security",
"category": "Security",
"sort_order": 20,
"products": [
{"id": 5, "name": "Xcitium Advanced Endpoint Protection", "sort_order": 0}
]
}
]
}
GET
/api/v1/partners
List reseller partners with aggregate stats
q=<text> optional — partial match on org name or emailcountry=<code> optional — filter by country code (e.g. US, TR)curl -H "X-Api-Key: cam_..." "https://<host>/api/v1/partners?q=SHI&country=US"
# Response
{
"ok": true,
"total": 12,
"partners": [
{
"organization": "SHI",
"email": "partner@shi.com",
"country": "US",
"order_count": 150,
"total_tcv": 125000.00,
"total_acv": 98000.00,
"first_order_date": "2022-03-01",
"last_order_date": "2026-01-15"
}
]
}
GET
/api/v1/partners/orders
Get orders for a specific reseller partner
partner=<email or org> required — matched against reseller email or organization namefrom=YYYY-MM-DD optional — earliest sale date (inclusive)to=YYYY-MM-DD optional — latest sale date (inclusive)page=1 optional — page number, 1-based (default: 1)per_page=100 optional — rows per page, max 500 (default: 100)curl -H "X-Api-Key: cam_..." \
"https://<host>/api/v1/partners/orders?partner=partner@shi.com&from=2026-01-01&per_page=50"
# Response
{
"ok": true,
"partner": {"organization": "SHI", "email": "partner@shi.com"},
"total": 150,
"page": 1,
"per_page": 50,
"orders": [
{
"sales_order_number": "SO-12345",
"customer_order_number": "PO-99887",
"sale_date": "2026-01-15",
"end_user_organization": "Acme Corp",
"end_user_email": "it@acme.com",
"end_user_country": "US",
"product_name": "AEP",
"product_family": "AEP",
"term": "1 Year",
"endpoints": 50,
"tcv": 1500.00,
"acv": 1500.00,
"order_value": 1500.00,
"global_order_state": "Active"
}
]
}
GET
/api/v1/partners/end_customer/usage
Active device count for a reseller's end customer
partner=<email or org> required — your reseller identifier (same as /api/v1/partners/orders)end_customer=<email> required — end-user email exactly as it appears in your partner ordersas_of=YYYY-MM-DD optional — snapshot date (default: latest available)
Ownership check: the end customer must appear in at least one order under your
partner identifier. Requests for customers outside your portfolio return 404.
curl -H "X-Api-Key: cam_..." \
"https://<host>/api/v1/partners/end_customer/usage?partner=partner@shi.com&end_customer=it@acme.com"
# Response — data available
{
"ok": true,
"partner": {"organization": "SHI", "email": "partner@shi.com"},
"end_customer": "it@acme.com",
"as_of": "2026-06-28",
"device_online": 42,
"data_available": true
}
# Response — no usage data synced yet
{
"ok": true,
"partner": {"organization": "SHI", "email": "partner@shi.com"},
"end_customer": "it@acme.com",
"as_of": null,
"device_online": null,
"data_available": false
}
GET
/api/v1/partners/end_customer/direct_orders
Direct postpaid orders placed by a reseller's end customer
partner=<email or org> required — your reseller identifierend_customer=<email> required — end-user email as it appears in your partner ordersfrom=YYYY-MM-DD optional — earliest create date (inclusive)to=YYYY-MM-DD optional — latest create date (inclusive)include_refunds=1 optional — include refund rows (default: excluded)page=1 optional — page number, 1-based (default: 1)per_page=100 optional — rows per page, max 500 (default: 100)
Ownership check: the end customer must appear in at least one order under your
partner identifier. Only Postpaid direct orders are returned — prepaid orders are excluded. These are orders the customer placed directly with Xcitium, separate from orders routed through you.
curl -H "X-Api-Key: cam_..." \
"https://<host>/api/v1/partners/end_customer/direct_orders?partner=partner@shi.com&end_customer=it@acme.com&from=2026-01-01"
# Response
{
"ok": true,
"partner": {"organization": "SHI", "email": "partner@shi.com"},
"end_customer": "it@acme.com",
"total": 2,
"page": 1,
"per_page": 100,
"orders": [
{
"sales_order_number": "SO-99001",
"create_date": "2026-03-10",
"order_value": 2400.00,
"payment_status": "Fully Paid",
"payment_method": "Credit Card",
"product_name": "Xcitium Advanced Endpoint Protection",
"product_family": "AEP",
"term": "1 Year",
"endpoints": 100,
"subscription_expiration_date": "2027-03-10",
"global_order_state": "Active",
"is_refund": false
}
]
}
| Name | Prefix | Created | Expires | Last used | Status |
|---|
No API keys yet.
NeXcitium API Keys
Credentials used for all CAM API calls (v1 and v2). Stored server-side; the secret is never sent back to the browser.
NeXcitium APIs
CAM v1 & v2 — shared credentials
New note
Expiry
Reminder
Add a task
Tasks
| # | Task | Status | Updated | Actions |
|---|
No tasks yet.