Overview
Small businesses that run ads on Instagram or Facebook need a landing page under the traffic — today, not in two weeks. A beauty specialist, a tutor, a psychologist or a one-product seller usually has no budget for a designer and no patience for a drag-and-drop builder, and the leads end up lost in direct messages.
GetLanding (getlanding.online) is our answer to that: a self-serve SaaS where the owner describes the business in plain words, adds a few photos, and gets a complete landing page — copy, design, SEO metadata and a lead form — generated by an LLM in minutes. The page is published on a platform subdomain or the client’s own domain with HTTPS out of the box, and every form submission lands in a built-in CRM with email and Telegram notifications.
Unlike our client work, GetLanding is a product we own and operate: one codebase, real users, real ad traffic, and a direct feedback loop between what we ship in the evening and how campaigns convert the next morning.

What the product does

- Describe. The user fills in a name, a slug and a free-text description, and uploads up to five images (raster files are converted to WebP on the server). The interface is available in Ukrainian and English.
- Generate. A multimodal prompt (text + images) goes to OpenAI; the answer is parsed into one self-contained HTML file with structure, copy, design, SEO metadata and a dynamic lead-form schema. Generation runs asynchronously, the UI polls for status, and the balance is charged only when the result is successful.
- Refine. Three editors work over the same HTML: an AI editor that takes natural-language instructions and changes the page through a tool-calling loop; a visual editor where any text block on the live page becomes editable on click; and a plain code editor. Every overwrite snapshots the previous state into a version history with free rollback.
- Publish. One click makes the page available at
<slug>.getlanding.online, or on the client’s custom domain with a certificate issued automatically. Subdomain mode can be enabled, disabled or redirected to the custom domain. - Collect leads. Submissions go to the built-in CRM with statuses (new / in progress / won / lost), notifications by email and Telegram, CSV/XLSX export, UTM first/last-touch attribution, and delivery to the external SalesDrive CRM.
Monetisation is a pay-as-you-go balance in UAH rather than a fixed subscription: a sign-up bonus covers the first landing, generation and AI edits are charged per action, and each live landing pays a small daily fee. Balance is topped up by card or by a recurring payment through Mono Acquiring; promo codes are supported as well.


Our Role
Beehive Logic designed, built and runs GetLanding end-to-end: product, backend, UI, billing, infrastructure and the marketing site. The first MVP commit is dated April 2026; the platform has been serving real users and paid traffic since spring 2026 and is developed continuously.
The whole product is a single Go monolith — about 14 thousand lines of Go across 54 files plus 34 server-rendered templates — deliberately kept simple: a static binary, html/template for SSR, PostgreSQL as the only datastore, Docker Compose for deployment.
Engineering Highlights

One binary, three kinds of traffic
The same process serves the portal (app.getlanding.online), dozens of published landings on pool subdomains, and arbitrary custom domains owned by clients. A host-based routing middleware runs before every route: the portal host goes to the application; any other host is looked up as an active landing by subdomain or custom domain, and its HTML is served straight from PostgreSQL. Static assets, uploads and form submissions are always passed through regardless of host, otherwise generated pages would break.
HTTPS for domains we do not own
A client points a domain at the platform, and a Let’s Encrypt certificate is issued automatically via ACME (autocert). Certificate state — pending, issued, failed — is scanned every 30 seconds and shown in the UI. Let’s Encrypt rate limits (50 certificates per registered domain per week) are a hard business constraint, so the pool of platform domains is managed explicitly and can be extended by configuration.
Treating the LLM as an unreliable, metered resource
Generation is non-deterministic, billed per token and can fail halfway. The system is built around that:
- every OpenAI call is logged to a token-usage table and a step-by-step generation log, visible to admins;
- jobs stuck in
generating/editingafter a crash or deploy are reaped and recovered on startup; - each AI, visual or manual edit snapshots the previous HTML and form schema into a version history (last 10 states, configurable) with free, reversible rollback;
- money is deducted only for a successful result — a failed generation or a retry costs nothing.
The AI editor is implemented as a tool-calling loop: the model can only change the page through update_html, and it has dedicated tools to read and modify the lead-form schema, the product catalog and the landing’s images, so a “make the form ask for a phone number” request changes the real form config, not just the markup.



Money as a first-class subsystem
All balance changes go through one package (balance.Credit / balance.Debit) and are stored as integer kopecks — no floats anywhere near money. Every change produces a transaction row, so the user’s history, admin adjustments, promo codes and refunds (for example when a landing transfer is cancelled) are all auditable. Mono Acquiring handles one-off top-ups and recurring payments; a reconcile worker compares subscription state with Mono every five minutes and picks up payments that were confirmed while the app was down. In September 2026 the internal “points” currency was migrated to UAH with a single idempotent data migration and no action from users.
Background workers as part of the business model
The daily fee for live landings, subscription reconciliation, the outbox that delivers leads to SalesDrive with retries, the Telegram long-polling bot and the certificate scanner are all goroutine workers inside the same binary. Graceful shutdown cancels running generations, stops workers and drains HTTP connections within 25 seconds, so deploys do not lose leads or leave half-charged jobs.
Guaranteed lead delivery
A lead must not disappear because someone else’s API was down for five minutes. Submissions are written to the database first, then pushed to the external CRM through an outbox with retries; notifications to the owner go by email (SMTP) and Telegram in parallel.
Internationalisation done cheaply
The portal and all emails are bilingual (Ukrainian by default, English), with language chosen at sign-up and stored on the account. Adding a language is one dictionary file; generated landings and the admin panel are not affected.

Technical Stack
| Layer | Technology |
|---|---|
| Language | Go 1.23, single static binary (CGO_ENABLED=0) |
| HTTP framework | Echo v4, host-based routing middleware |
| UI rendering | Server-side html/template, i18n dictionaries (uk / en) |
| Database | PostgreSQL via GORM, AutoMigrate + idempotent data migrations |
| Auth | Email + bcrypt, JWT in cookie, email verification, password reset |
| AI | OpenAI Go SDK (GPT-4o): multimodal generation, tool-calling edits, token accounting |
| Media | Server-side conversion of uploads to WebP (nativewebp), video and SVG pass-through |
| TLS | Let’s Encrypt via ACME autocert, certificate status scanner |
| Payments | Mono Acquiring — one-off top-ups, recurring payments, webhook + reconcile |
| Integrations | SalesDrive CRM (outbox with retries), Telegram Bot API, SMTP, Google Analytics 4 conversion marker |
| Exports | CSV and XLSX generated without external libraries |
| Infrastructure | Docker Compose (app + postgres), graceful shutdown |
| Marketing site | Hugo + Tailwind CSS on Cloudflare Pages, live pricing and stats from public JSON endpoints |
Outcome
- Live in production since spring 2026, serving Ukrainian small businesses and marketing agencies that build landings for their clients.
- Over 140 landing pages generated on the platform as of September 2026 (the number is published live through a public stats endpoint and shown on the marketing site).
- A complete self-serve loop — generation, editing, hosting with HTTPS, lead CRM and billing — runs in one deployable Go binary with no external hosting or form service.
- Recurring payments, a bilingual portal, version history, a visual editor and landing transfer between accounts were all shipped to real users within the first five months.
- GetLanding is also our proving ground for LLM-backed products: token accounting, job recovery, tool-calling editors and charging only for successful results are patterns we now bring to client projects.