---
title: Shopping Log Bot
url: https://rone.dev/projects/shopping-log-bot
description: A Telegram bot that reads receipt photos with Gemini and files them into a spreadsheet.
language: en-US
updated: 2026-09-27
translations:
  id: https://rone.dev/id/projects/shopping-log-bot
---

# Shopping Log Bot

A Telegram bot that reads receipt photos with Gemini and files them into a spreadsheet.

[Projects](https://rone.dev/projects) / [AI](https://rone.dev/projects/category/ai)

Live · Started 2025 · 4 GitHub stars · 0 Forks

A twenty-node n8n workflow for logging personal spending. Photograph a receipt and a vision model extracts the store, total, items and date; type a sentence and an agent files it as an expense; send the report command and a second agent queries the sheet and answers in prose. Everything lands in Google Sheets — there is no application server and no database.

## Project facts

|          |                                                                 |
| -------- | --------------------------------------------------------------- |
| Status   | Live                                                            |
| Category | AI                                                              |
| Started  | 2025                                                            |
| Role     | Design and build                                                |
| Stack    | n8n, Google Gemini, Google Sheets, Telegram                     |
| Licence  | MIT                                                             |
| Links    | [Source](https://github.com/ridwaanhall/n8n-pendataan-shopping) |

## Overview

The friction in tracking spending is not the arithmetic, it is the typing. This removes it: the input is a photo taken at the till, and the interface is a chat app that is already open.

A switch at the front of the workflow reads the incoming message and picks one of three paths — a photo, the report command, or free text. Each ends in the same spreadsheet, so there is one place the data lives regardless of how it arrived.

## Constraining the model instead of parsing it

Receipt images are sent to the vision model with a prompt that specifies the exact four-line output format, gives a filled-in example, and defines a single error line for an unreadable receipt. The response is then read positionally.

That is the trade being made deliberately: a rigid prompt and a dumb parser, rather than a loose prompt and a parser that has to interpret prose. When the model cannot read a receipt it says so in the one shape the workflow expects, which is a far better failure than a confident wrong total appearing in the spreadsheet.

The two conversational paths work the other way round — they get an agent with the spreadsheet attached as a tool, because "how much did I spend on groceries last week" is a question, not a form.

<CardGroup cols={2}>
  <Card title="Previous: Rone Arena Python SDK" href="https://rone.dev/projects/rone-arena-python">
    pip install rone-arena — the whole API surface behind four sub-clients.
  </Card>

  <Card title="Next: Gold Price Forecasting" href="https://rone.dev/projects/gold-price-forecasting">
    PyTorch LSTM forecasts for Indonesian gold, from one month to five years out.
  </Card>
</CardGroup>
