tripbier was built to solve a simple problem.
Discovering a craft brewery still requires dozens of scattered searches, dispersed reviews, and outdated information.
Our mission is to organize the world's brewing knowledge into a single open, searchable, AI-assisted platform.
We don't just want to list breweries.
We want to connect people, territories, stories, styles, awards, and experiences.
From a first draft in Gramado to an award-winning brewery in Portland, the journey should be seamless.
Tripbier is a global craft brewery discovery platform for beer itineraries, beer tourism, and geographic intelligence — using artificial intelligence to connect travelers, breweries, and destinations across 16 countries.
system
manual
The complete tripbier guide — a craft brewery itinerary platform built on Cloudflare Workers, D1, KV, and R2. Each section includes direct links to the described feature.
what is tripbier
overviewtripbier is a serverless platform for discovering and routing craft breweries. It combines a georeferenced database with generative AI to create personalized experiences — from an interactive map to a narrated itinerary delivered by a beer concierge.
The entire infrastructure runs on Cloudflare (Workers + D1 + KV + R2), with no dedicated servers, global edge latency, and usage-based costs. The data model uses SQLite via D1, distributed across multiple databases by continent.
The system is made up of 6 independent workers, each with a specific responsibility, communicating via internal fetch calls or sharing state through KV.
system numbers
metrics · jun 2026| metric | value | notes |
|---|---|---|
| Total mapped breweries | 19,905 | Brazil + 15 international countries · tripbeer-map |
| Brazilian breweries (tripbeer-db) | 5,448 | active and operational |
| US breweries (OpenBreweryDB) | 8,353 | imported via pipeline |
| Countries covered | 16 | BR, US, DE, BE, CZ, AT, UK, IE, FR, ES, IT, PT, NL, NO, SE, AR |
| Cities with editorial pages | 130+ | 63 international + 67+ BR |
| Brewery landing pages | award winners | CBC, WBC, WBA — dynamically generated |
| Visitors / day | 625 | jun/2026 metric, organic growth |
| Requests / month | ~40k | US + NL + BR as main origins |
| Supported languages | 15 | pt-BR, en, es, de, fr, it, nl, no, sv, ja and more |
| D1 main database tables | 40+ | tripbeer-db (main) + tripbeer-map (geo) |
| Average Google position | 6.9 | "best craft beers near me" — 131 impressions/day |
infrastructure
cloudflare stack| worker | domain | responsibility |
|---|---|---|
utt-engine | tripbier.com/* · *.tripbier.com/* | main router — serves KV pages, public API, subdomains, LGPD banner |
utt-agentlink | /api/chat (internal) | Maestro pipeline — 6 mini-agents for itinerary generation via GPT-4o-mini |
utt-brewhub | brewhub.html | per-brewery chat widget, slug-specialized AI agent, /api/palpite protection |
utt-analytics | /api/collect (internal) | 1st-party RUM — collects dwell time, recurrence, funnel; daily aggregation cron |
utt-beerfeed | /api/news | beer news radar by city — Monday cron |
utt-static | static assets | serves CSS, JS, images via ASSETS binding |
| database | id | main content |
|---|---|---|
tripbeer-db | main | Brazilian breweries, users, itineraries, passports, awards, styles, hours, social, analytics |
tripbeer-map | geo | global breweries with lat/lon/slug for map search |
DB_AMERICAS | continent | US, CA, AR, CL, MX — map fallback |
DB_EUROPE | continent | DE, BE, CZ, FR, ES, IT, PT, UK, NL, NO, SE… |
utt-analytics | id: 170900e5 | RUM events, sessions, dwell, journey funnel |
| namespace | id | usage |
|---|---|---|
UTT_CACHE | 4b5519d0… | HTML pages (page:{name}.html), sessions (sess:{id}), geo indexes (idx:{city}:{country}), stats |
KV key pattern: page:home.html · page:agm.html · page:copa.html · idx:porto+alegre:br:uuid · sess:abc123 · stats:total_cervejarias
Bucket: tripbeer-assets · Public CDN: pub-b8f8998895a64e77a4fa43f286aa08dd.r2.dev/
Stores brewery logos, hero images (AVIF/WebP/PNG), WhatsApp og:images (JPEG 1200×630 <300KB), and partner campaign assets.
main pages
site pagesradar / interactive map
featureThe radar (tripbier.com/mapa.html) is the heart of the platform — a Leaflet map with 19,900+ pins of breweries across 16 countries, with MarkerCluster for performance and real-time filters.
On load, the map uses the browser's geolocation or the IP (Cloudflare cf.city) to center automatically. Each pin opens a card with rating, address, link to Instagram/site, and a "get directions in Google Maps" button. Award-winning breweries get a distinct marker.
URL parameters accepted by the map:
| parameter | example | effect |
|---|---|---|
?lat=&lng=&zoom= | ?lat=-30.03&lng=-51.21&zoom=11 | centers on specific coordinates (used by subdomains like AGM) |
?cidade=&uf= | ?cidade=Gramado&uf=RS | searches for and centers on the given city |
?roteiro= | ?roteiro=variedade-curitiba-3d | loads and highlights breweries from a saved itinerary |
?proximas=1 | ?proximas=1 | forces a search for the nearest breweries to the user |
AI concierge
maestro pipelineThe tripbier concierge is a pipeline of 6 mini-agents that transforms a text message into a personalized brewery itinerary. Each agent receives a data envelope, enriches it, and passes it to the next.
The concierge is multi-function by design — it is not a menu-driven chatbot. The user writes in natural language and the system automatically detects the intent, without prompting a mode selection:
| the user says | detected intent | what happens |
|---|---|---|
| "Any IPAs in Gramado?" | search | lists breweries with IPA on the menu, with direct links |
| "Explain what a Weizen is" | conversation | the sommelier answers about the style, history, and food pairing |
| "I want to spend 3 days in Curitiba" | generate itinerary | full pipeline: weather → curator → personalized narrative |
| "Where is Dado Bier?" | navigate | opens the map with the brewery pin |
| "poa, weekend, craft" | generate itinerary | normalizes abbreviation → extracts intent → generates a weekend itinerary in POA |
The Validator detects all 4 modes without any LLM call — pure JavaScript logic. It normalizes abbreviations (poa → Porto Alegre, cwb → Curitiba) before the Extractor runs. The Curator queries databases in cascade: DB Brasil → DB_AMERICAS → DB_EUROPE → DB_ASIA → Serper Discovery as a final fallback.
beer passport
gamification · pwaThe tripbier passport is an installable PWA (Progressive Web App) that lets users collect stamps with each visit to partner breweries. It is the platform's gamification and loyalty engine.
User flow: The user visits passaporte.tripbier.com, installs it on their phone (home screen), identifies themselves by name and WhatsApp (no account required), and earns stamps by checking in at breweries on the circuit.
Available circuits: Each partner itinerary has a circuit with N stops. Completing all stops unlocks a reward at the partner brewery (freebie, discount, exclusive experience). The partner dashboard (admin-parceiro) shows in real time who has completed it and allows sending the reward via WhatsApp.
Levels: Curious → Apprentice → Explorer → Master → Sommelier — based on total accumulated stamps.
itineraries
generation & sharingItineraries are generated by the Maestro pipeline and automatically saved to D1 with a permanent, unique URL — no login required. The URL can be shared via WhatsApp, included in an email, or bookmarked.
URL format: tripbier.com/roteiros.html?id={slug} — where the slug is generated by the Curator from the city, profile, and selection hash (e.g., variedade-porto-alegre-3d-a1b2).
Each itinerary stores: brewery list (id, name, curator's note), city, chosen profile, number of days, weather at generation time, and the Presenter's narrative.
16 countries
global coveragetripbier has active coverage in 16 countries, with a database, editorial city pages, and concierge routing. Each country has city pages and integration with the global map.
Country pages are dynamic — they do not exist as static files. They are generated in real time by the worker from D1 data: breweries, cities, awards, and editorial content. This means adding a new country to the database automatically creates all of its pages, with no manual publishing work. It is scalable infrastructure disguised as content.
city pages
geographic editorialEach city with a critical mass of breweries gets a curated editorial page — not auto-generated, but written with local identity. The base template is caxias.html (serif layout with sidebar, hero, pull-quote, and card grid).
Page structure: hero with a local photo → "why visit" editorial → pull-quote → brewery grid with rating/insta/site/agent → events → suggested itinerary. The news section is fed by utt-beerfeed in real time.
All international city pages live under the country subdirectory: /de/berlim.html, /be/bruges.html, /it/roma.html, etc. Like country pages, city pages are dynamically generated — the worker builds the HTML from D1 on each request, with no pre-compiled files. A new city with enough breweries in the database already has its page available.
| highlight | link |
|---|---|
| Caxias do Sul (RS) — reference template | tripbier.com/caxias.html |
| Blumenau (SC) — Santa Catarina capital of craft beer | tripbier.com/blumenau.html |
| Porto Alegre (RS) — AGM hub | tripbier.com/porto-alegre.html |
| Gramado (RS) — tourism + craft | tripbier.com/gramado.html |
| Bruges (Belgium) — world reference | tripbier.com/be/bruges.html |
| Berlin (Germany) | tripbier.com/de/berlin.html |
| Prague (Czech Republic) | tripbier.com/cz/praga.html |
brewery landing pages
virtual landingAward-winning breweries (CBC, WBC, or WBA) automatically receive a dynamic landing page generated from D1 data — no manual intervention required. Access is via subdomain: slug.tripbier.com.
Content displayed: name, city/state, Google rating and reviews, opening hours by day of the week, beers in production (name, style, ABV, IBU), awards with medal and year, related blog posts, embedded map, Instagram/website/WhatsApp buttons, and a chat with an AI agent specialized in that brewery.
Access rule: If the brewery has an award → renders the full landing page. If no award but has Instagram or website → redirects (302) to the social profile. If neither → 404.
Cache: each landing page is stored in Cloudflare's edge cache for 1 hour (stale-while-revalidate=86400) — zero CPU on repeat visits.
competitions & awards
palmarestripbier indexes medals from the leading craft beer competitions and displays them on brewery landing pages and the awards page. Medals are used as a ranking criterion in the Curator agent.
| competition | code | scope | medals |
|---|---|---|---|
| Campeonato Brasileiro de Cerveja | CBC | National — Blumenau/SC | Gran Champion, Gold, Silver, Bronze |
| World Beer Cup | WBC | International — USA | Gold, Silver, Bronze |
| World Beer Awards | WBA | International — UK | Country Winner, Gold, Silver |
| Concurso Gaúcho de Cerveja (AGM) | CGCBA | RS — organized by AGM | Gold, Silver, Bronze |
| Mondial de la Bière | MDB | Brazil + International | Médaille d'Or, d'Argent, de Bronze |
partner dashboard
admin · breweriesThe partner dashboard is the management interface for brewery owners. Accessed via the brewery slug (no login — token-based auth via URL, to be implemented). Direct URL: tripbier.com/admin-parceiro?slug={slug}.
| tab | what it manages | D1 table |
|---|---|---|
| 🗺️ itineraries | Passport circuit participants: progress, check-ins, "award" button via WhatsApp | passaporte_carimbos · passaportes |
| 🍺 beers | Beer catalog: name, style, ABV, IBU, description, photo (URL) | estilos_cervejaria |
| 📋 menu | Menu items: category, name, price, description, photo — visible on the landing page | lp_cardapio |
| 🎯 promos | Campaigns: title, type, discount %, expiry date, active/inactive toggle | lp_campanhas |
| 🕐 hours | Weekly schedule Monday→Sunday: opens, closes, closed, notes | horarios |
agm — associação gaúcha de microcervejarias
subdomain · partnershipagm.tripbier.com is a dedicated subdomain for the tripbier × AGM partnership — an editorial pitch page featuring the 19 member breweries on a map, the history of the Gaúcho craft movement, and a CTA for membership.
Historical content based on verified academic research: Cruz, R.C. (2016). Consumo e Formação de Mercado: um estudo sobre as microcervejarias de Porto Alegre. Dissertação UNISINOS.
Timeline: Dado Bier (1995, first Brazilian microbrewery) → WE Consultoria (1997) → Acerva Gaúcha (2003) → AGM founded by Jorge Gitzler → reduced ICMS in RS → Polo Anchieta (2010) → 50+ member breweries today.
claim your brewery
b2b acquisitionBreweries without a complete profile display a CTA "Is this your brewery?" on the landing page and in the chat widget. When clicked, the owner fills out a simple form (name, email, role, WhatsApp) that creates a lead in D1 (reivindicacoes) and triggers an internal notification.
This is the entry funnel for the B2B model: Starter (R$89/mo) → Professional (R$149/mo) → Premium (R$297/mo), with incremental features in the partner dashboard and map visibility.
api endpoints
technical reference| method | endpoint | description |
|---|---|---|
| GET | /api/proximas | finds breweries by coordinates, city, or text — main engine for the map and concierge |
| GET | /api/suggest?q=&pais= | city autocomplete (search-as-you-type, KV) |
| GET | /api/stats | total active breweries |
| GET | /api/ping | analytics: registers enter/leave/click with geo and device |
| POST | /api/chat | sends a message to the Maestro pipeline and receives a concierge response |
| GET | /api/news?cidade=&limit= | beer news by city (utt-beerfeed) |
| POST | /api/news/collect | forces a manual news collection (normally a Monday cron) |
| GET | /api/estilos?q= | searches beers by style with photo — powers the styles grid |
| GET | /api/parceiro/perfil?slug= | returns full brewery data: beers, menu, promos, hours |
| POST | /api/parceiro/cerveja | creates or updates a beer in the brewery catalog |
| DELETE | /api/parceiro/cerveja/:id | removes a beer from the catalog |
| POST | /api/parceiro/cardapio | creates or updates a menu item |
| DELETE | /api/parceiro/cardapio/:id | deactivates a menu item (soft delete) |
| POST | /api/parceiro/campanha | creates or updates a promotion/campaign |
| PUT | /api/parceiro/campanha/:id/toggle | activates or deactivates a campaign |
| DELETE | /api/parceiro/campanha/:id | permanently removes a campaign |
| POST | /api/parceiro/horario | saves the hours schedule (upsert by day of week) |
| POST | /api/checkin | registers a passport check-in (stamp) |
| GET | /api/meu-passaporte | returns the user's passport (by session) |
| POST | /api/roteiro-salvar | saves a Maestro-generated itinerary to D1 |
| GET | /api/admin/painel?roteiro= | circuit data for the partner dashboard (participants, progress) |
| GET | /sitemap.xml | dynamic sitemap with all breweries + main pages |
analytics
rum 1st-partytripbier uses 1st-party analytics — no Google Analytics, no third-party cookies. The tracker (/a/tracker.js) is loaded by every page and sends events to /collect in utt-analytics.
Data collected: pages visited, dwell time, session recurrence, conversion funnel (home → map → itinerary → passport), country/city (CF headers), device type. No PII — the identifier is a SHA1 hash of IP+UA.
Daily cron: utt-analytics aggregates raw events and writes daily summaries to D1 (id: 170900e5) — unique visitors, pageviews, top-5 countries, bandwidth. The analytics dashboard reads from these summaries.
Tracked clicks: Instagram, website, WhatsApp — per brewery, per geographic origin, per device.
privacy / lgpd
privacy · complianceThe cookie banner is injected by the worker on every page via middleware — no page needs to include the script manually. Consent is stored in localStorage for 365 days.
deploy & operations
infrastructure · wranglerAll deployments are done with Wrangler CLI from the directory G:\Site\tripbier\utt-engine\PRD\js\. Configuration lives in wrangler.toml. API credentials (OpenAI, Serper, Google Places) are stored in G:\Site\tripbier\upg-engine\pipeline\.env.
# Deploy the main worker npx wrangler deploy --config wrangler.toml # Publish a page to KV (HTML → page:name.html) npx wrangler kv key put "page:agm.html" \ --path ../html/agm.html \ --remote --binding UTT_CACHE --config wrangler.toml # Upload an image to R2 npx wrangler r2 object put "tripbeer-assets/agm/foto.png" \ --file ./foto.png --remote --config wrangler.toml # Query D1 npx wrangler d1 execute tripbeer-db \ --command "SELECT COUNT(*) FROM cervejarias" \ --remote --json --config wrangler.toml
Golden rule: changing a worker or HTML file without first listing what changes and who it affects can cause silent regressions. The correct process: (1) list changes and impact, (2) confirm with Marcos, (3) publish.
Important: Tripbier and ClubTour are separate businesses with separate accounts — never cross workers, data, or credentials between them.
social layer
communityThe social layer allows passport users to interact with each other: share itineraries, comment on breweries, follow other travelers, and build a visit history visible on their public profile.
Identity based on phone number + name (no password). Avatars generated automatically by DiceBear. The activity feed shows recent community visits in each city.
Moderation: an automatic regex detects phone numbers, links, and inappropriate content in comments before saving to D1.