# Gws Israeli Business Sheets

> Google Sheets financial tracking and automation for Israeli freelancers and small businesses using the Google Workspace CLI (gws). Use when user asks to create income/expense sheets with Shekel formatting, track VAT (18%) calculations, generate tax-period summaries for accountants, backup spreadsheets as CSV, or auto-log payments. Do NOT use for direct bank API integrations, payroll processing, o…

- **Type:** Skill
- **Install:** `agentstack add skill-skills-il-accounting-gws-israeli-business-sheets`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [skills-il](https://agentstack.voostack.com/s/skills-il)
- **Installs:** 0
- **Category:** [Data & Analytics](https://agentstack.voostack.com/c/data-and-analytics)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [skills-il](https://github.com/skills-il)
- **Source:** https://github.com/skills-il/accounting/tree/master/gws-israeli-business-sheets

## Install

```sh
agentstack add skill-skills-il-accounting-gws-israeli-business-sheets
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# GWS Israeli Business Sheets

## Instructions

The Google Workspace CLI (`gws`, package `@googleworkspace/cli`) generates its command surface dynamically from Google's Discovery API. Every Sheets call follows one of two shapes:

- Raw API methods: `gws sheets spreadsheets  --params '' [--json '']`. The `--params` JSON carries path and query parameters (`spreadsheetId`, `range`, `valueInputOption`, etc.). The `--json` flag carries the request body for POST/PUT/PATCH methods.
- Helper shortcuts: `gws sheets +read` and `gws sheets +append` wrap the most common reads and appends with simple flags.

Useful global flags: `--dry-run` (validate locally, no API call), `--format json|table|yaml|csv` (output format, default `json`). When in doubt about a method's exact parameters, run `gws sheets --help`, `gws sheets spreadsheets --help`, or `gws schema sheets.spreadsheets.values.append`.

### Step 1: Verify GWS CLI Installation and Authentication

Before performing any Google Sheets operations, confirm the Google Workspace CLI is installed and authenticated.

```bash
# Check if gws is installed
gws --version

# If not installed, install globally
npm install -g @googleworkspace/cli

# Authenticate with Google OAuth
gws auth login

# Verify authentication status
gws auth status
```

If the user has not configured OAuth credentials, guide them through `gws auth login` with a Google Cloud project that has the Sheets API enabled. See `gws auth --help` for credential options.

### Step 2: Confirm the User's VAT Status

Before building any sheet, ask whether the user is an **osek murshe** (authorized dealer, charges and reclaims VAT) or an **osek patur** (exempt dealer, does not charge or reclaim VAT). This changes the sheet structure:

- **Osek murshe**: include the full VAT columns (net, VAT, total) and compute VAT liability.
- **Osek patur**: an osek patur does not charge VAT on income and cannot reclaim input VAT on expenses. Drop the VAT column entirely (or leave it at 0), record gross amounts only, and skip the VAT-liability calculation. The osek patur still tracks income and expenses for the annual income-tax return.

An osek patur whose annual turnover crosses the ceiling (NIS 120,000 for 2025, NIS 122,833 for 2026) must convert to osek murshe. If a user is near the ceiling, flag it.

**Osek zair (micro-dealer) 2026 reform.** A separate income-tax track for low-turnover self-employed (turnover ceiling CPI-linked, about NIS 122,833 for 2026) grants an automatic 30% expense deduction off turnover with no need to itemize receipts, plus a simplified annual report and no advance payments. If the user is a low-turnover freelancer, mention that this track may suit them and tell them to confirm eligibility with their accountant or the Tax Authority before opting in.

### Step 3: Create a New Financial Tracking Spreadsheet

When the user wants to set up a new income/expense tracking sheet, create it with proper Israeli financial structure.

**Sheet structure for an osek murshe:**

| Column | Header (EN) | Header (HE) | Format | Purpose |
|--------|------------|-------------|--------|---------|
| A | Date | תאריך | DD/MM/YYYY | Transaction date |
| B | Description | תיאור | Text | What the transaction is |
| C | Category | קטגוריה | Text | Tax-deductible category |
| D | Amount (excl. VAT) | סכום (ללא מע"מ) | ILS currency | Net amount |
| E | VAT (18%) | מע"מ (18%) | ILS currency | Calculated VAT |
| F | Total (incl. VAT) | סכום כולל מע"מ | ILS currency | Gross amount |
| G | Type | סוג | Income/Expense | Direction of money |
| H | Invoice # | מספר חשבונית | Text | Invoice reference |
| I | Payment Method | אמצעי תשלום | Text | Bank/PayPal/Cash |
| J | Notes | הערות | Text | Additional details |
| K | Allocation # | מספר הקצאה | Text | Israel Invoice allocation number for invoices at/above the threshold |
| L | Withholding | ניכוי במקור | ILS currency | Tax withheld at source by the payer, if any |

Column K records the **allocation number (מספר הקצאה)** the seller obtains from the Tax Authority's Israel Invoice platform. From January 1, 2026 every invoice of NIS 10,000 or more (before VAT) needs one, and from June 1, 2026 the threshold drops to NIS 5,000 or more (before VAT). Without it the buyer cannot deduct input VAT on the invoice, so capture it whenever it applies.

Column L records **withholding tax at source (ניכוי במקור)**. Some clients are required to withhold income tax and pay the business net of that amount, so log the withheld sum here. The business needs its own אישור ניכוי מס במקור (withholding rate certificate) and this column feeds the annual Form 856 the payer files.

For an **osek patur**, drop columns D and E and rename column F to `Amount` / `סכום` (gross only), since no VAT applies. Keep columns K and L if relevant (an osek patur can still be subject to withholding and, above the threshold, to allocation numbers).

**Tax-deductible categories for Israeli businesses:**

| Category (EN) | Category (HE) | Deduction Rate |
|---------------|---------------|----------------|
| Office Rent | שכירות משרד | 100% |
| Equipment | ציוד | Depreciable (פחת) - capitalize and depreciate, not 100% in year 1 |
| Phone & Internet | טלפון ואינטרנט | 100% (if business-only) |
| Professional Services | שירותים מקצועיים | 100% |
| Car Expenses | הוצאות רכב | Limited (45% or fixed) |
| Meals & Entertainment | ארוחות ואירוח | 80% |
| Travel | נסיעות | 100% |
| Software & Subscriptions | תוכנה ומנויים | 100% |
| Marketing | שיווק | 100% |
| Insurance | ביטוח | 100% |

To create the spreadsheet and write the header row:

```bash
# Create a new spreadsheet (the response JSON includes "spreadsheetId")
gws sheets spreadsheets create --json '{"properties":{"title":"Business Tracker 2026"}}'

# Write the header row into the first row (use the spreadsheetId from the create response)
gws sheets spreadsheets values update \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"Sheet1!A1:L1","valueInputOption":"RAW"}' \
  --json '{"values":[["Date","Description","Category","Amount (excl. VAT)","VAT (18%)","Total (incl. VAT)","Type","Invoice #","Payment Method","Notes","Allocation #","Withholding"]]}'
```

### Step 4: Append Income and Expense Entries

When the user wants to log a transaction, calculate the VAT automatically (osek murshe only) and append the row.

**For income entries (user received payment):**

```bash
# Calculate: if user received 5,900 ILS total, the breakdown is:
# Amount excl. VAT = Total / 1.18 = 5,000 ILS
# VAT = Amount * 0.18 = 900 ILS
gws sheets spreadsheets values append \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"Sheet1!A:L","valueInputOption":"USER_ENTERED"}' \
  --json '{"values":[["15/01/2026","Web Development Project","Professional Services","5000","900","5900","Income","INV-2026-001","Bank Transfer","","HK-2026-0001","0"]]}'
```

The `+append` helper is a shorter equivalent for a single simple row:

```bash
gws sheets +append --spreadsheet SPREADSHEET_ID \
  --json-values '[["15/01/2026","Web Development Project","Professional Services","5000","900","5900","Income","INV-2026-001","Bank Transfer","","HK-2026-0001","0"]]'
```

**For expense entries:**

```bash
# Example: Office internet bill of 236 ILS (200 + 36 VAT)
gws sheets spreadsheets values append \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"Sheet1!A:L","valueInputOption":"USER_ENTERED"}' \
  --json '{"values":[["20/01/2026","Bezeq Internet","Phone & Internet","200","36","236","Expense","","Direct Debit","","",""]]}'
```

**VAT calculation formulas (osek murshe only):**

| Scenario | Formula | Example |
|----------|---------|---------|
| Have total (incl. VAT), need breakdown | Amount = Total / 1.18, VAT = Total - Amount | 1180 / 1.18 = 1000, VAT = 180 |
| Have net amount, need total | VAT = Amount * 0.18, Total = Amount + VAT | 1000 * 0.18 = 180, Total = 1180 |
| Meal expense (80% deductible) | Deductible = Amount * 0.80 | 500 * 0.80 = 400 |

### Step 5: Read and Summarize Financial Data

When the user needs a financial overview, read the data and compute summaries.

```bash
# Read all entries from the sheet using the helper (returns the raw values array)
gws sheets +read --spreadsheet SPREADSHEET_ID --range "Sheet1!A:L"

# Equivalent raw API call (response is a ValueRange with a "values" array of arrays)
gws sheets spreadsheets values get --params '{"spreadsheetId":"SPREADSHEET_ID","range":"Sheet1!A:L"}'
```

Both forms return JSON with a `values` field: an array of rows, each row an array of cell strings. The first row is the header. After reading the data, calculate and present:
- Total income for the period
- Total expenses for the period
- Net profit (income minus expenses)
- Total VAT collected (on income) - osek murshe only
- Total VAT paid (on expenses, input VAT) - osek murshe only
- VAT liability (collected minus paid, amount to report to tax authority) - osek murshe only

For an osek patur, present income, expenses, and net profit only.

**Bi-monthly VAT reporting periods (Israel):**

| Period | Months | Report Due By |
|--------|--------|---------------|
| 1 | January-February | March 15 |
| 2 | March-April | May 15 |
| 3 | May-June | July 15 |
| 4 | July-August | September 15 |
| 5 | September-October | November 15 |
| 6 | November-December | January 15 |

Limitation: businesses above the monthly-VAT turnover threshold (annual turnover over NIS 1,520,000) file VAT **monthly**, not bi-monthly; at or below it they file bi-monthly. This threshold updates on January 1 each year, so confirm the current figure on the Tax Authority site. (Do not confuse this filing-frequency threshold with the separate detailed-reporting (דיווח מפורט) obligation, which kicks in at a different, higher turnover level.) `scripts/vat-summary.py` and Steps 5-6 assume the 6 bi-monthly periods only. For a monthly filer, run the summary per calendar month instead of per bi-monthly period and confirm the reporting cadence with the accountant.

### Step 6: Generate Tax-Period Summary Reports

When the user needs to prepare data for their accountant or for VAT reporting, create a summary sheet.

```bash
# Read all data
gws sheets +read --spreadsheet SPREADSHEET_ID --range "Sheet1!A:L"
```

After reading, use Python (via `scripts/vat-summary.py`) to:
1. Filter transactions by the bi-monthly period
2. Group by income vs. expenses
3. Calculate total VAT collected and input VAT (osek murshe only)
4. Generate a summary suitable for the accountant

Then write the summary into a new tab. First add the tab with a `batchUpdate`, then write the rows:

```bash
# Add a new sheet tab named "VAT-Period-1"
gws sheets spreadsheets batchUpdate \
  --params '{"spreadsheetId":"SPREADSHEET_ID"}' \
  --json '{"requests":[{"addSheet":{"properties":{"title":"VAT-Period-1"}}}]}'

# Write summary headers and rows
gws sheets spreadsheets values update \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"VAT-Period-1!A1:D1","valueInputOption":"RAW"}' \
  --json '{"values":[["Category","Total Amount","Total VAT","Transaction Count"]]}'

gws sheets spreadsheets values append \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"VAT-Period-1!A:D","valueInputOption":"USER_ENTERED"}' \
  --json '{"values":[["Total Income","50000","9000","15"],["Total Expenses","20000","3600","25"],["VAT Liability","","5400",""],["Net Profit","30000","",""]]}'
```

### Step 7: Backup Sheets as CSV

When the user wants local backups or wants to share data with their accountant, export to CSV using the `--format csv` flag.

```bash
# Export the main tracking sheet as CSV
gws sheets spreadsheets values get \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"Sheet1!A:L"}' --format csv > business-tracker-2026.csv

# Export a specific VAT period
gws sheets spreadsheets values get \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"VAT-Period-1!A:D"}' --format csv > vat-period-1-2026.csv
```

Use the `scripts/backup-sheets.py` script for automated multi-tab backup:

```bash
python scripts/backup-sheets.py --spreadsheet-id SPREADSHEET_ID --output-dir ./backups/2026-01 --tabs "Sheet1,VAT-Period-1"
```

**Document retention.** Israeli bookkeeping rules require the business to keep its books and all supporting documents (invoices, receipts, bank records) for at least 7 years from the end of the tax year (or 6 years from the date the annual return was filed, whichever is later). A CSV backup is a convenience copy, not a substitute for retaining the original documents. Tell the user to archive backups in dated folders and keep the source invoices/receipts for the full retention period.

### Step 8: Auto-Log Payments from Structured Input

When the user provides transaction data in bulk (from a bank statement or invoice list), parse and append multiple rows in one call.

```bash
# Append multiple rows in one call
gws sheets spreadsheets values append \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"Sheet1!A:L","valueInputOption":"USER_ENTERED"}' \
  --json '{"values":[
    ["01/02/2026","Client A - Monthly Retainer","Professional Services","10000","1800","11800","Income","INV-2026-010","Bank Transfer","","HK-2026-0010","0"],
    ["03/02/2026","AWS Hosting","Software & Subscriptions","450","81","531","Expense","","Credit Card","","",""],
    ["05/02/2026","Business Lunch - Client B","Meals & Entertainment","300","54","354","Expense","","Credit Card","80% deductible","",""]
  ]}'
```

### Step 9: Use Dry-Run Mode for Validation

Before making changes, offer the user a dry-run preview. The `--dry-run` flag validates the request locally without sending it to the API.

```bash
# Preview what would be appended without writing
gws sheets spreadsheets values append \
  --params '{"spreadsheetId":"SPREADSHEET_ID","range":"Sheet1!A:L","valueInputOption":"USER_ENTERED"}' \
  --json '{"values":[["15/03/2026","Test Entry","Office Rent","5000","900","5900","Expense","","Bank Transfer","","",""]]}' \
  --dry-run
```

### Step 10: Issue a Compliant Tax Invoice

When the user needs to issue a tax invoice (חשבונית מס) to a customer, the sheet is the tracking record, not the legal invoice. The legal invoice itself is produced by an invoicing service (Morning, iCount, Rivhit and similar) or an approved template. A compliant Israeli tax invoice must include:

- The header "חשבונית מס" and a running invoice number
- The seller's business name and VAT/business ID (osek murshe number, or business ID for an osek patur issuing a "חשבונית עסקה" / receipt)
- The customer's name (and ID for invoices above the threshold)
- Invoice date
- Description, quantity, and unit price of goods or services
- Amount before VAT, the VAT amount, and the total including VAT (osek murshe). An osek patur issues a receipt or "חשבונית עסקה" with no VAT line.

**Allocation number (מספר הקצאה) e-invoice mandate.** Israel's continuous-transaction-control model requires an allocation number from the Tax Authority's platform for tax invoices at or above a threshold, before the buyer can deduct input VAT. As of 2026 the threshold steps down: invoices of NIS 10,000 or more (before VAT) from January 1, 2026, and NIS 5,000 or more (before VAT) from June 1, 2026. When logging a large invoice, remind the user to obtain the allocation number through their invoicing software and record it alongside the invoice number.

## Examples

### Example 1: Israeli Freelancer Sets Up Monthly Tracking

User says: "Create a Google Sheet to track my freelance income and expenses with VAT"

Actions:
1. Ask whether the user is an osek murshe or an osek patur (this decides whether VAT columns are included)
2. Run `gws sheets spreadsheets create --json '{"properties":{"title":"Freelance Tracker 2026"}}'` and read the `spreadsheetId` from the response
3. Write the header row with `gws sheets spreadsheets values update` (12 columns for an osek murshe, fewer for an osek patur)
4. Show the user the spreadsheet ID and link, and explain the column struc

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [skills-il](https://github.com/skills-il)
- **Source:** [skills-il/accounting](https://github.com/skills-il/accounting)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-skills-il-accounting-gws-israeli-business-sheets
- Seller: https://agentstack.voostack.com/s/skills-il
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
