RunClawMarketplace
📊

Bookkeeper (Agent Zero) — Manual Install Guide

Agent ZeroIntermediate

Prerequisites

  • ✓A running Agent Zero instance (v0.9.8 or later)
  • ✓SSH access to your VPS
  • ✓Docker installed on your VPS

Estimated time: ~20 minutes

Installation Steps

1

Connect to your VPS

SSH into the server where your Agent Zero instance is running.

Terminal
ssh root@your-vps-ip
2

Create the plugin directory

Create the plugin directory inside the Agent Zero container for the Bookkeeper (Agent Zero) plugin.

Terminal
docker exec agent-zero mkdir -p /a0/usr/plugins/bookkeeper/
3

Create plugins/bookkeeper/plugin.json

Plugin manifest declaring name, version, hooks, and tool registrations

Terminal
docker exec -i agent-zero sh -c 'cat > "/a0/usr/plugins/bookkeeper/plugin.json"' << 'BUNDLEOF'
{
  "name": "bookkeeper",
  "version": "1.0.0",
  "description": "Financial record-keeping and transaction categorization specialist",
  "author": "RunClaw",
  "agent_zero_version": ">=0.9.8",
  "hooks": [
    "agent_init"
  ],
  "tools": [
    "transaction_categorizer",
    "receipt_parser"
  ],
  "dependencies": []
}
BUNDLEOF
View file contents/a0/usr/plugins/bookkeeper/plugin.json
{
  "name": "bookkeeper",
  "version": "1.0.0",
  "description": "Financial record-keeping and transaction categorization specialist",
  "author": "RunClaw",
  "agent_zero_version": ">=0.9.8",
  "hooks": [
    "agent_init"
  ],
  "tools": [
    "transaction_categorizer",
    "receipt_parser"
  ],
  "dependencies": []
}
4

Create plugins/bookkeeper/prompts/system.md

System prompt additions for financial record-keeping methodology

Terminal
docker exec agent-zero mkdir -p "/a0/usr/plugins/bookkeeper/prompts" && docker exec -i agent-zero sh -c 'cat > "/a0/usr/plugins/bookkeeper/prompts/system.md"' << 'BUNDLEOF'
# Bookkeeper Plugin

You have the Bookkeeper plugin active. You are a specialist in financial record-keeping, transaction categorization, and accounting fundamentals.

## Core Principles

1. **Accuracy First** -- Financial data must be precise. Never round unless explicitly asked.
2. **Double-Entry** -- Every transaction has two sides. Debits equal credits.
3. **Consistent Categorization** -- Same vendor/type always maps to the same category.
4. **Audit Trail** -- Always explain categorization decisions, especially unusual ones.

## Standard Chart of Accounts

### Income
- Revenue (product sales, service fees)
- Interest Income
- Other Income (refunds, credits)

### Expenses
- Technology Expenses (SaaS, hosting, domains)
- Contractor Payments
- Payroll & Benefits
- Office & Equipment
- Meals & Entertainment
- Travel
- Marketing & Advertising
- Professional Services (legal, accounting)
- Insurance
- Operating Expenses (misc)

### Assets
- Cash & Bank Accounts
- Accounts Receivable
- Prepaid Expenses

### Liabilities
- Accounts Payable
- Credit Card Balances
- Deferred Revenue

## Output Standards

- Always use consistent currency formatting ($1,234.56)
- Include category and account for every transaction
- Flag ambiguous transactions for human review
- Show totals and percentages for summaries

BUNDLEOF
View file contents/a0/usr/plugins/bookkeeper/prompts/system.md
# Bookkeeper Plugin

You have the Bookkeeper plugin active. You are a specialist in financial record-keeping, transaction categorization, and accounting fundamentals.

## Core Principles

1. **Accuracy First** -- Financial data must be precise. Never round unless explicitly asked.
2. **Double-Entry** -- Every transaction has two sides. Debits equal credits.
3. **Consistent Categorization** -- Same vendor/type always maps to the same category.
4. **Audit Trail** -- Always explain categorization decisions, especially unusual ones.

## Standard Chart of Accounts

### Income
- Revenue (product sales, service fees)
- Interest Income
- Other Income (refunds, credits)

### Expenses
- Technology Expenses (SaaS, hosting, domains)
- Contractor Payments
- Payroll & Benefits
- Office & Equipment
- Meals & Entertainment
- Travel
- Marketing & Advertising
- Professional Services (legal, accounting)
- Insurance
- Operating Expenses (misc)

### Assets
- Cash & Bank Accounts
- Accounts Receivable
- Prepaid Expenses

### Liabilities
- Accounts Payable
- Credit Card Balances
- Deferred Revenue

## Output Standards

- Always use consistent currency formatting ($1,234.56)
- Include category and account for every transaction
- Flag ambiguous transactions for human review
- Show totals and percentages for summaries
5

Create plugins/bookkeeper/prompts/instructions.md

Detailed categorization rules, chart of accounts, and output format specifications

Terminal
docker exec agent-zero mkdir -p "/a0/usr/plugins/bookkeeper/prompts" && docker exec -i agent-zero sh -c 'cat > "/a0/usr/plugins/bookkeeper/prompts/instructions.md"' << 'BUNDLEOF'
# Bookkeeper -- Behavioral Instructions

## Transaction Categorization Workflow

1. **Read the transaction** -- Extract vendor name, amount, date, description
2. **Match to category** -- Use the chart of accounts. Match by vendor name first, then description keywords
3. **Flag unknowns** -- If a transaction doesn't clearly fit, mark it as "NEEDS REVIEW" with your best guess
4. **Calculate totals** -- Always provide category subtotals and overall summary

## Common Vendor Mappings

| Vendor Pattern | Category | Notes |
|---------------|----------|-------|
| AWS, GCP, Azure, DigitalOcean | Cloud Infrastructure | Technology Expenses |
| GitHub, GitLab, Bitbucket | Developer Tools | Technology Expenses |
| Figma, Canva, Adobe | Design Software | Technology Expenses |
| Slack, Notion, Linear | Productivity SaaS | Technology Expenses |
| Stripe, PayPal (fees) | Payment Processing | Operating Expenses |
| Stripe, PayPal (payouts) | Revenue | Income |
| Uber, Lyft | Travel/Transport | Travel or Meals (context-dependent) |

## Financial Report Formats

### Monthly P&L
- Revenue section (all income sources)
- Expenses section (grouped by category, sorted by amount descending)
- Bottom line (gross profit, net profit, net margin %)
- Comparison to previous month if data available

### Transaction Log
- Table format: Date | Description | Amount | Category | Account
- Sorted by date ascending
- Running balance if single account

### Cash Flow Summary
- Opening balance
- Inflows (grouped)
- Outflows (grouped)
- Closing balance
- Net change

## Red Flags to Watch For

- Duplicate transactions (same amount, same vendor, same day)
- Unusually large transactions (>3x average for that category)
- Missing regular subscriptions (expected monthly charge absent)
- Negative balances where they shouldn't exist
- Foreign currency transactions that may need conversion

BUNDLEOF
View file contents/a0/usr/plugins/bookkeeper/prompts/instructions.md
# Bookkeeper -- Behavioral Instructions

## Transaction Categorization Workflow

1. **Read the transaction** -- Extract vendor name, amount, date, description
2. **Match to category** -- Use the chart of accounts. Match by vendor name first, then description keywords
3. **Flag unknowns** -- If a transaction doesn't clearly fit, mark it as "NEEDS REVIEW" with your best guess
4. **Calculate totals** -- Always provide category subtotals and overall summary

## Common Vendor Mappings

| Vendor Pattern | Category | Notes |
|---------------|----------|-------|
| AWS, GCP, Azure, DigitalOcean | Cloud Infrastructure | Technology Expenses |
| GitHub, GitLab, Bitbucket | Developer Tools | Technology Expenses |
| Figma, Canva, Adobe | Design Software | Technology Expenses |
| Slack, Notion, Linear | Productivity SaaS | Technology Expenses |
| Stripe, PayPal (fees) | Payment Processing | Operating Expenses |
| Stripe, PayPal (payouts) | Revenue | Income |
| Uber, Lyft | Travel/Transport | Travel or Meals (context-dependent) |

## Financial Report Formats

### Monthly P&L
- Revenue section (all income sources)
- Expenses section (grouped by category, sorted by amount descending)
- Bottom line (gross profit, net profit, net margin %)
- Comparison to previous month if data available

### Transaction Log
- Table format: Date | Description | Amount | Category | Account
- Sorted by date ascending
- Running balance if single account

### Cash Flow Summary
- Opening balance
- Inflows (grouped)
- Outflows (grouped)
- Closing balance
- Net change

## Red Flags to Watch For

- Duplicate transactions (same amount, same vendor, same day)
- Unusually large transactions (>3x average for that category)
- Missing regular subscriptions (expected monthly charge absent)
- Negative balances where they shouldn't exist
- Foreign currency transactions that may need conversion
6

Create plugins/bookkeeper/tools/transaction_categorizer.py

Tool for categorizing transactions against chart of accounts

Terminal
docker exec agent-zero mkdir -p "/a0/usr/plugins/bookkeeper/tools" && docker exec -i agent-zero sh -c 'cat > "/a0/usr/plugins/bookkeeper/tools/transaction_categorizer.py"' << 'BUNDLEOF'
"""
Tool: TransactionCategorizer
Description: Categorize financial transactions against a chart of accounts
Plugin: bookkeeper

Takes raw transaction data (description, amount) and maps it to the
appropriate accounting category using vendor matching and keyword analysis.
"""

from python.helpers.tool import Tool, Response


class TransactionCategorizer(Tool):
    """Categorize a financial transaction.

    Use this tool to classify transactions by vendor name and description
    against the standard chart of accounts.
    """

    VENDOR_CATEGORIES = {
        "aws": ("Cloud Infrastructure", "Technology Expenses"),
        "gcp": ("Cloud Infrastructure", "Technology Expenses"),
        "azure": ("Cloud Infrastructure", "Technology Expenses"),
        "digitalocean": ("Cloud Infrastructure", "Technology Expenses"),
        "hetzner": ("Cloud Infrastructure", "Technology Expenses"),
        "github": ("Developer Tools", "Technology Expenses"),
        "figma": ("Design Software", "Technology Expenses"),
        "adobe": ("Design Software", "Technology Expenses"),
        "canva": ("Design Software", "Technology Expenses"),
        "slack": ("Productivity SaaS", "Technology Expenses"),
        "notion": ("Productivity SaaS", "Technology Expenses"),
        "linear": ("Productivity SaaS", "Technology Expenses"),
        "spotify": ("Software Subscriptions", "Technology Expenses"),
        "stripe": ("Payment Processing", "Operating Expenses"),
        "paypal": ("Payment Processing", "Operating Expenses"),
    }

    async def execute(
        self,
        description: str = "",
        amount: str = "",
        is_income: bool = False,
        **kwargs,
    ):
        """Categorize a transaction.

        Args:
            description: Transaction description or vendor name
            amount: Transaction amount as string (e.g., "$49.99")
            is_income: Whether this is an income transaction (default: False)
        """
        if not description:
            return Response(
                message="Please provide a transaction description.",
                break_loop=False,
            )

        desc_lower = description.lower()
        category = None
        account = None

        # Try vendor matching
        for vendor, (cat, acct) in self.VENDOR_CATEGORIES.items():
            if vendor in desc_lower:
                category = cat
                account = acct
                break

        if is_income:
            category = "Revenue"
            account = "Income"

        if category:
            return Response(
                message=(
                    f"**Categorized:** {description}\n"
                    f"- Amount: {amount}\n"
                    f"- Category: {category}\n"
                    f"- Account: {account}"
                ),
                break_loop=False,
            )

        return Response(
            message=(
                f"**NEEDS REVIEW:** {description}\n"
                f"- Amount: {amount}\n"
                f"- Category: Unknown (no vendor match)\n"
                f"- Suggestion: Review and manually categorize"
            ),
            break_loop=False,
        )

BUNDLEOF
View file contents/a0/usr/plugins/bookkeeper/tools/transaction_categorizer.py
"""
Tool: TransactionCategorizer
Description: Categorize financial transactions against a chart of accounts
Plugin: bookkeeper

Takes raw transaction data (description, amount) and maps it to the
appropriate accounting category using vendor matching and keyword analysis.
"""

from python.helpers.tool import Tool, Response


class TransactionCategorizer(Tool):
    """Categorize a financial transaction.

    Use this tool to classify transactions by vendor name and description
    against the standard chart of accounts.
    """

    VENDOR_CATEGORIES = {
        "aws": ("Cloud Infrastructure", "Technology Expenses"),
        "gcp": ("Cloud Infrastructure", "Technology Expenses"),
        "azure": ("Cloud Infrastructure", "Technology Expenses"),
        "digitalocean": ("Cloud Infrastructure", "Technology Expenses"),
        "hetzner": ("Cloud Infrastructure", "Technology Expenses"),
        "github": ("Developer Tools", "Technology Expenses"),
        "figma": ("Design Software", "Technology Expenses"),
        "adobe": ("Design Software", "Technology Expenses"),
        "canva": ("Design Software", "Technology Expenses"),
        "slack": ("Productivity SaaS", "Technology Expenses"),
        "notion": ("Productivity SaaS", "Technology Expenses"),
        "linear": ("Productivity SaaS", "Technology Expenses"),
        "spotify": ("Software Subscriptions", "Technology Expenses"),
        "stripe": ("Payment Processing", "Operating Expenses"),
        "paypal": ("Payment Processing", "Operating Expenses"),
    }

    async def execute(
        self,
        description: str = "",
        amount: str = "",
        is_income: bool = False,
        **kwargs,
    ):
        """Categorize a transaction.

        Args:
            description: Transaction description or vendor name
            amount: Transaction amount as string (e.g., "$49.99")
            is_income: Whether this is an income transaction (default: False)
        """
        if not description:
            return Response(
                message="Please provide a transaction description.",
                break_loop=False,
            )

        desc_lower = description.lower()
        category = None
        account = None

        # Try vendor matching
        for vendor, (cat, acct) in self.VENDOR_CATEGORIES.items():
            if vendor in desc_lower:
                category = cat
                account = acct
                break

        if is_income:
            category = "Revenue"
            account = "Income"

        if category:
            return Response(
                message=(
                    f"**Categorized:** {description}\n"
                    f"- Amount: {amount}\n"
                    f"- Category: {category}\n"
                    f"- Account: {account}"
                ),
                break_loop=False,
            )

        return Response(
            message=(
                f"**NEEDS REVIEW:** {description}\n"
                f"- Amount: {amount}\n"
                f"- Category: Unknown (no vendor match)\n"
                f"- Suggestion: Review and manually categorize"
            ),
            break_loop=False,
        )
7

Create plugins/bookkeeper/tools/receipt_parser.py

Tool for extracting structured data from receipt descriptions

Terminal
docker exec agent-zero mkdir -p "/a0/usr/plugins/bookkeeper/tools" && docker exec -i agent-zero sh -c 'cat > "/a0/usr/plugins/bookkeeper/tools/receipt_parser.py"' << 'BUNDLEOF'
"""
Tool: ReceiptParser
Description: Extract structured data from receipt text or descriptions
Plugin: bookkeeper

Parses receipt information to extract vendor, amount, date, line items,
tax, and total for structured bookkeeping entry.
"""

from python.helpers.tool import Tool, Response


class ReceiptParser(Tool):
    """Parse receipt text into structured transaction data.

    Use this tool when you have raw receipt text and need to extract
    vendor, amount, date, line items, and tax information.
    """

    async def execute(self, receipt_text: str = "", **kwargs):
        """Parse receipt text into structured data.

        Args:
            receipt_text: Raw receipt text or description to parse
        """
        if not receipt_text:
            return Response(
                message="Please provide receipt text to parse.",
                break_loop=False,
            )

        lines = receipt_text.strip().split("\n")
        line_count = len(lines)

        return Response(
            message=(
                f"## Receipt Analysis\n\n"
                f"- **Lines to parse:** {line_count}\n"
                f"- **Raw text length:** {len(receipt_text)} chars\n\n"
                f"Extracting structured data: vendor name, date, line items, "
                f"subtotal, tax, total, and payment method. "
                f"Results will be formatted for bookkeeping entry."
            ),
            break_loop=False,
        )

BUNDLEOF
View file contents/a0/usr/plugins/bookkeeper/tools/receipt_parser.py
"""
Tool: ReceiptParser
Description: Extract structured data from receipt text or descriptions
Plugin: bookkeeper

Parses receipt information to extract vendor, amount, date, line items,
tax, and total for structured bookkeeping entry.
"""

from python.helpers.tool import Tool, Response


class ReceiptParser(Tool):
    """Parse receipt text into structured transaction data.

    Use this tool when you have raw receipt text and need to extract
    vendor, amount, date, line items, and tax information.
    """

    async def execute(self, receipt_text: str = "", **kwargs):
        """Parse receipt text into structured data.

        Args:
            receipt_text: Raw receipt text or description to parse
        """
        if not receipt_text:
            return Response(
                message="Please provide receipt text to parse.",
                break_loop=False,
            )

        lines = receipt_text.strip().split("\n")
        line_count = len(lines)

        return Response(
            message=(
                f"## Receipt Analysis\n\n"
                f"- **Lines to parse:** {line_count}\n"
                f"- **Raw text length:** {len(receipt_text)} chars\n\n"
                f"Extracting structured data: vendor name, date, line items, "
                f"subtotal, tax, total, and payment method. "
                f"Results will be formatted for bookkeeping entry."
            ),
            break_loop=False,
        )
8

Create plugins/bookkeeper/extensions/agent_init/setup.py

Initialization extension that logs plugin activation on agent start

Terminal
docker exec agent-zero mkdir -p "/a0/usr/plugins/bookkeeper/extensions/agent_init" && docker exec -i agent-zero sh -c 'cat > "/a0/usr/plugins/bookkeeper/extensions/agent_init/setup.py"' << 'BUNDLEOF'
"""
Extension: agent_init
Plugin: bookkeeper

Runs when the agent initializes. Logs activation of the Bookkeeper plugin
and sets up runtime state including default chart of accounts.
"""

from python.helpers.log import Log


async def execute(agent, **kwargs):
    """Initialize the Bookkeeper plugin."""
    Log.info("Bookkeeper plugin activated", head="plugin")
    Log.info(
        "Transaction categorization and financial record-keeping enabled",
        head="plugin",
    )

    if not hasattr(agent, "plugin_state"):
        agent.plugin_state = {}
    agent.plugin_state["bookkeeper"] = {
        "active": True,
        "version": "1.0.0",
        "chart_of_accounts": [
            "Revenue",
            "Technology Expenses",
            "Contractor Payments",
            "Operating Expenses",
            "Travel",
            "Marketing",
        ],
    }

BUNDLEOF
View file contents/a0/usr/plugins/bookkeeper/extensions/agent_init/setup.py
"""
Extension: agent_init
Plugin: bookkeeper

Runs when the agent initializes. Logs activation of the Bookkeeper plugin
and sets up runtime state including default chart of accounts.
"""

from python.helpers.log import Log


async def execute(agent, **kwargs):
    """Initialize the Bookkeeper plugin."""
    Log.info("Bookkeeper plugin activated", head="plugin")
    Log.info(
        "Transaction categorization and financial record-keeping enabled",
        head="plugin",
    )

    if not hasattr(agent, "plugin_state"):
        agent.plugin_state = {}
    agent.plugin_state["bookkeeper"] = {
        "active": True,
        "version": "1.0.0",
        "chart_of_accounts": [
            "Revenue",
            "Technology Expenses",
            "Contractor Payments",
            "Operating Expenses",
            "Travel",
            "Marketing",
        ],
    }
9

Restart Agent Zero

Restart the Agent Zero container to load the new plugin.

Terminal
docker restart agent-zero
10

Verify installation

Open your Agent Zero interface and verify the plugin loads correctly.

Note:Look for "Bookkeeper (Agent Zero)" in the available plugins or extensions.

That was 10 steps.

With RunClaw, it's just one click.

Install with RunClaw

Done reading?

RunClaw handles all of this automatically. Create your first agent in minutes.

Try RunClaw Free

No credit card required