Use when user asks to upload, analyze, or extract data from a financial statement (PDF, Excel, or image). Handles brokerage statements, 401k statements, and account documents. Validates files, monitors processing, and formats results as human-readable tables.
From Powdernpx claudepluginhub powder-finance/claude-code-powder-plugin --plugin powder-pluginThis skill uses the workspace's default tool permissions.
examples/brokerage-statement.mdexamples/error-recovery.mdreference/error-codes.mdreference/output-formatting.mdreference/statement-types.mdreference/supported-formats.mdProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Automates the complete workflow of uploading financial statements (brokerage, bank, credit card) to the Powder API and extracting structured data. Handles validation, status monitoring, error recovery, and formatting of results.
powder CLI is installed and API token is configuredpowder --json upload <path> [--portfolio <id>]powder --json status <id> --watch --timeout 600Before starting, verify the environment:
# Check powder CLI is available
which powder
# Verify auth token is set (checks both plugin config and env var)
test -n "${POWDER_API_TOKEN:-$CLAUDE_PLUGIN_OPTION_POWDER_API_TOKEN}" && echo "set" || echo "not set"
Decision Tree:
powder not found → Suggest running /Powder:setup to install the CLI/Powder:setup to configure authenticationImportant: Token Passthrough — Always prefix powder commands with:
POWDER_API_TOKEN="${POWDER_API_TOKEN:-$CLAUDE_PLUGIN_OPTION_POWDER_API_TOKEN}" powder ...
Before uploading, check the file meets requirements:
# Check file exists and get size
ls -lh "$FILE_PATH"
# Verify extension
file "$FILE_PATH"
Validation Checklist:
.pdf, .xlsx, .png, .jpg, .jpegDecision Tree:
.csv and .xls (convert to .xlsx), .doc/.docx (export to PDF), .html (save as PDF)Execute the upload command with JSON output:
powder --json upload "$FILE_PATH"
Optional Flags:
--type brokerage - Statement type (default, currently the only supported type — can be omitted)--portfolio <id> - Associate with existing portfolio IDExpected Response:
{
"id": 12345,
"status": "processing",
"portfolio_id": 67890
}
Capture:
id - Document ID for status trackingportfolio_id - Portfolio this data belongs toError Handling:
Monitor the document processing with automatic polling:
powder --json status 12345 --watch --timeout 600
Flags:
--watch - Poll every 2 seconds until terminal status--timeout 600 - Wait up to 10 minutes (recommended for complex statements)Terminal Statuses:
done → Success, proceed to Step 4failed → Extraction failed, see error detailserror → Processing error, see error detailsclosed → Document was closed or cancelledNon-Terminal Statuses:
pending → Upload is queued for processingprocessing → OCR/extraction in progressin_review → Manual review required (rare)Decision Tree:
done → Proceed to Step 5 (fetch data)powder status <id> to check laterfailed, error, or closed → Go to Step 4 (error recovery)When processing fails, extract error details:
powder --json status 12345
Common Error Scenarios:
| Error Code | Meaning | Fix |
|---|---|---|
PASSWORD_PROTECTED_PDF | PDF requires password | Remove password protection and re-upload |
CORRUPT_PDF / INVALID_PDF_HEADER | File is damaged | Re-download or re-export the PDF |
UNSUPPORTED_FILE_TYPE | Wrong file format | Convert to supported format (.pdf, .xlsx, .png, .jpg) |
EMPTY_PDF / EMPTY_EXCEL | No extractable content | Check source file has visible content |
See reference/error-codes.md for the full error code reference.
Next Steps:
Once status is done, retrieve the extracted data:
powder --json data 12345
Response Structure:
{
"id": 12345,
"status": "done",
"data": {
"portfolio_id": 67890,
"ownerships": [...]
},
"count": 1,
"page": 1
}
Formatting Rules (see reference/output-formatting.md):
Found {count} holdings in portfolio {portfolio_id}Example Output:
Found 1 holdings in portfolio 67890
Holdings:
┌──────────────────────────────────────┬────────┬──────────────────────────┬───────────┬─────────────────┐
│ Name │ Ticker │ Account │ Quantity │ Statement Value │
├──────────────────────────────────────┼────────┼──────────────────────────┼───────────┼─────────────────┤
│ Example Target Date Fund │ EXMPL │ Brokerage Account *** │ 1,000.00 │ $50,000.00 │
└──────────────────────────────────────┴────────┴──────────────────────────┴───────────┴─────────────────┘
Totals:
- Statement Value: $50,000.00
- Current EOD Value: $114,992.97
- Holdings: 1
⚠️ Anomalies Detected:
- Large valuation gap (66.5% difference) between statement and current EOD price
See reference/output-formatting.md for the full API response shape, field definitions, and formatted output example.