



brands in production · my own product
In production at SanLuna · 9 customer brands
Kickoff to first customer: 1 month
Luna Analytics Agent: Ask Your Store Data in Plain English
Customers: E-commerce brands going from 0 to 1, with no data team of their own
My part: Founder of SanLuna; built Luna solo: product, data integrations, agent, rollout
More projects
The customer’s problem
Young e-commerce brands run on data spread across Shopify, GA4 and their ad platforms, but they have no analyst. Every “how did last week go?” or “which campaign is actually paying off?” became a request to a data analyst and a wait for a report.
What I built
- An agent that takes the question in plain English, works out which data it needs, queries it and answers with the number and a chart made for that question.
- Connectors for Shopify, GA4, Meta Ads and Google Ads, plus BigQuery and Snowflake for brands that already keep a warehouse.
- Built for non-technical people: founders and marketers ask directly, without waiting for an analyst to build the report.
How it got into production
- Built solo in one month, from the first line of code to the first customer brand using it.
- Each brand connects its own stores and ad accounts; the agent only reads through read-only, allow-listed views.
- Nine customer brands use it in production today.
Integrated with
How I keep the numbers right
- The model writes the query, never the number: every figure in an answer comes from a query result, and the model only reads the question, writes SQL and explains what came back.
- One semantic layer: revenue, repeat rate and ROAS are each defined once (refunds, order date or payment date), and the agent can only use those definitions, never invent its own formula.
- Guarded queries: SELECT only, on allow-listed views, with a dry run first and row and time limits.
- Reconciled with the source: totals are checked against what Shopify itself reports, and a gap past the threshold raises a flag instead of a quietly wrong number.
- Freshness checks: if a source has not synced (say, GA4 is missing yesterday), the answer says so instead of pretending the data is complete.
- Every answer is traceable: the sources, the time range and the SQL sit next to it, readable for a founder and checkable for an analyst.
- An eval set of questions with known correct answers runs after every prompt or model change.
- When a question is ambiguous (gross or net sales? which channel?) it asks first, and when the data cannot answer, it says so.
Results
| Metric | Value |
|---|---|
| Customer brands in production | 9 |
| Data sources connected | 6 |
| Kickoff to first customer | 1 month |
| Built by | one person |





