Seat CSV and invoice uploads
Import a license seat CSV and upload a named vendor invoice on Add billing data.
Best for: Finance admins loading seat assignments and vendor invoices into the ledger
Seat and license CSV, and named invoice uploads
Open Add billing data from Dashboard quick actions, or go to /meridian/uploads. The title is Add billing data. The line under it is "Invoices and exports feed the ledger".
The amber note at the top is the rule for this page: "If a connector already pulls this vendor, do not upload the same bill. The file is a second copy. Reconciliation does not merge it with the connector. Use one source of record."
Manual Entry opens Manual Spend Entry. Refresh appears only after the history fails to load. A failed history says "Failed to load uploads: {status}", or "Failed to load uploads".
Named invoice upload
Select AI Vendor is required. It starts on OpenAI. The legend under the menu is "🔗 = API Connected | 📤 = Manual Upload Only".
API Connected (Auto-sync available)
| Name on the menu |
|---|
| OpenAI |
| Anthropic |
| OpenRouter |
| Azure OpenAI |
| AWS Bedrock |
| Google Gemini |
Manual Upload Only
| Name on the menu |
|---|
| GCP Vertex AI |
| Together AI |
| Replicate |
| Hugging Face |
| Cohere |
| AI21 |
| Groq |
| Perplexity |
| Mistral AI |
| Other vendor |
Currency starts on Auto-detect. The other choices are USD - US Dollar, EUR - Euro, GBP - British Pound, CAD - Canadian Dollar, AUD - Australian Dollar, JPY - Japanese Yen, CNY - Chinese Yuan, INR - Indian Rupee, BRL - Brazilian Real, and MXN - Mexican Peso. The note is "Auto-detect will scan the file for currency symbols. All amounts will be converted to USD."
Project Label (Optional) holds up to 200 characters. The placeholder is "e.g., Q1-2026-Marketing, R&D, Infrastructure". The note is "Use this to categorize spending by project, department, or initiative for better tracking."
Date Override (Optional) is a date. The note is "Leave blank to auto-detect dates from file. Set a date to assign all amounts to this specific date."
The drop zone says Drag & drop invoice here, "or click to select (PDF, CSV, Excel)", and Max 50MB. While a file is over the zone it says "Drop file here...". While it uploads it says "Uploading and converting currency...". One file at a time. PDF, CSV, and Excel (.xls and .xlsx) are accepted.
A rejected upload shows the server message, or "Upload failed". Dismiss clears it. After a successful upload, Project Label and Date Override are cleared and the file appears in Upload History. Status moves through processing until it is completed or failed.
The note under the drop zone is New Features: "15+ vendors supported" (Including OpenRouter, Together AI, Groq, and more), "Multi-currency support" (Upload EUR, GBP, CAD, etc. All converted to USD automatically), "Project tracking" (Assign labels to categorize spending by initiative), and "Original amounts preserved" (We save both original and converted amounts for reference).
When a connector already covers those dates
The page opens Connector overlap. The message under the title is the one the server sent. Connector names the vendor. Overlapping dates shows the period, or "Unknown until parse".
How should Meridian book this upload?
| Choice | What it does |
|---|---|
| Duplicates what the connector pulls | Marked (default). "Held as a control total — not double-counted on the ledger." |
| Covers spend the connector misses | "Booked on the ledger for spend the connector does not pull (for example Priority Tier)." |
Cancel leaves the file unposted. Confirm and upload sends it. While it sends, the button says Uploading….
Manual Spend Entry
Manual Entry opens Manual Spend Entry. Vendor starts on OpenAI. The menu is the same names as the file upload, except Google Gemini is not on this list.
| Field | What it is |
|---|---|
| Vendor | Required. |
| Date | Required. Opens on today. |
| Amount | Required. Placeholder "0.00". Must be greater than 0. |
| Currency | USD ($), EUR (€), GBP (£), CAD ($), or AUD ($). Starts on USD ($). |
| Notes (Optional) | Up to 1000 characters. Placeholder "e.g., Aggregated from multiple accounts, Estimated pending invoice...". The counter is "{n}/1000 characters". |
Create Entry is disabled until the amount is above zero. While it saves, the button says Creating.... Cancel closes the form.
An amount of zero or less says "Amount must be greater than 0". A missing date says "Date is required". A failed save says the server message, "Manual entry failed", or "Failed to create entry".
The note at the bottom is "Manual entries are marked as completed and appear in your upload history". In the history table the file name is Manual Entry.
The same Connector overlap dialog can open for a manual entry. Choose a booking option and Confirm and upload.
FOCUS billing dataset
On the same page, under the drop zone, FOCUS billing dataset (v1.2+) carries the badge In development. The line under the title is "FOCUS CSV → prebuilt Layer-1 profile → Canonical → Meridian ledger. Extra and x_ columns remain available to attribution rules."
- Select source file accepts a CSV. The note is "The importer detects FOCUS 1.2, 1.3, or forward-tolerant 1.4 columns and validates every row before writing."
- Account → department crosswalk (optional) is a JSON box. The placeholder is
{"billing-account-id": "Engineering"}. The note is "Map BillingAccountId or SubAccountId explicitly. Unmapped rows stay unattributed and flow to suspense; no assignment is inferred." It starts as{}. - Include Tax charges (excluded by default) is unchecked to start. Validate and import stays disabled until a file is chosen. While it runs, the button says Validating and importing…. An empty choice says "Choose a FOCUS Cost and Usage CSV". A failure says "FOCUS import failed", or the server message. Row problems list "Row {n}, {column}: {message}", up to 50 rows.
Import summary · FOCUS {version} then reads "{imported} imported · {duplicates} duplicates ignored · {tax} tax rows excluded · {overlap} overlap rows held". The next line is "Ledger total: USD {amount}", plus any usage quantities. When tags attributed rows, it adds "{n} rows attributed from cost allocation tags". Unattributed rows say "{n} rows unattributed. Reasons are on the attribution inbox", linking to /meridian/ledger?tab=inbox.
When an active connector overlaps the file, the summary says "Active connector overlap was not posted. Review the open reconciliation item before choosing a source of record."
License / seat assignments (CSV)
The heading is License / seat assignments (CSV). The line under it is "Seat products allocate to departments, not agents. Columns: user_email or user_name, product, monthly_cost, department. Use the full product name (for example GitHub Copilot or Microsoft 365 Copilot). A bare Copilot cell is flagged and not booked — fix the name and re-upload."
Period start opens on the first day of the current month. Period end opens on the last day of the current month. Change either date before you import. The file control accepts a CSV.
Import seat CSV stays disabled until a file is chosen. While it runs, the button says Importing…. An empty choice says "Choose a CSV file".
Success says the server message, or "Seat CSV imported". A failure says the server message, "Upload failed ({status})", or "Seat CSV upload failed".
Seat import report reads "{imported} imported · {skipped} skipped · {flagged} flagged (not booked)". When any row is flagged: "Flagged rows never entered the ledger. Change the product cell to GitHub Copilot or Microsoft 365 Copilot, then upload again."
Row problems are a table with Line and Reason. If the list was cut off, the page says "Row list was truncated by the API."
Upload History
The heading is Upload History. Empty history says "No uploads yet. Upload your first invoice or create a manual entry!"
| Column | How to read it |
|---|---|
| File | The file name, or Manual Entry when the row was typed in. |
| Vendor | The name from the vendor menu. |
| Project | The project label, or a dash when there is none. |
| Status | The processing status: completed, failed, processing, or the status text the server sent. |
| Records | Rows created. Zero when none. |
| Total | Currency code and amount, to two decimals. |
| Date | The day the upload was created. |
| Overlap | An em dash when there is no overlap note. Otherwise the server’s overlap notice. |
A held duplicate shows Keep booked. While that update runs, the button says Updating…. A failure says "Could not keep upload booked", or the server message. Keep booked switches that upload to the "covers spend the connector misses" booking so the dollars stay on the ledger instead of sitting as a control total.