Switch Model
Manage AI models. Add OpenRouter models and assign them to Vision, Text, or Image tasks.
Add OpenRouter Model
Vision (Image Analysis)
Text (Ad Copy Generation)
Image (Creative Generation)
Property Extraction
Select an advertiser
Julia to Advertiser Conversations
View advertiser chat logs here and manually type messages on behalf of Julia from Otomkt.Send WhatsApp template
Sends via your Meta Cloud API using templates linked to this app's phone number ID. Use for contacts outside the usual messaging session window.
Advanced: raw components JSON
Link Your WhatsApp Number
Enter your WhatsApp phone number to link your account and view your conversation with Julia from Otomkt. To send messages, use your WhatsApp mobile app.
Admin Setup
Configure Meta WhatsApp, Meta Pixel, Meta Ads API, Twilio, PostHog, Airwallex, Discord, Google Sheets, and other integrations.
Twilio SMS Verification
Used for phone number verification during user registration. Sign up at twilio.com, create a Verify Service, then paste the credentials below.
PostHog (product analytics)
Same Project API key powers app.otomkt.com (via /api/analytics/public-config) and should match the marketing reels build. In PostHog Cloud: open your project → Project settings → Project API key (starts with phc_). This key is intentionally public in the browser; do not use a Personal API key here.
Precedence: if POSTHOG_PUBLIC_KEY or NEXT_PUBLIC_POSTHOG_KEY is set in the server environment, that value wins and this form is ignored for the app. Leave env unset to use Admin Setup only.
Reels on otomkt.com/reels: Next.js bakes the key at image build time. After saving here, copy the same key into GitHub → repository → Settings → Secrets and variables → Actions as secret NEXT_PUBLIC_POSTHOG_KEY (and optionally NEXT_PUBLIC_POSTHOG_HOST), then redeploy or run workflow with “rebuild all images” so the reels container rebuilds.
Meta Pixel & Conversions API
Powers PageView on app.otomkt.com and server-side DownloadVideo when a reel MP4 is saved. In Meta Events Manager → your pixel → Settings → Conversions API → Generate access token.
Precedence: if META_PIXEL_ID or META_CONVERSIONS_API_TOKEN is set in the server environment, that value wins and this form is ignored for that field. Leave env unset to use Admin Setup only.
Clear this field and save to disable test mode. Env META_TEST_EVENT_CODE overrides Admin Setup when set on the server.
WhatsApp Configuration
Meta Ads API Settings
Use a System User Access Token from Business Settings → System Users. The system user must be assigned to the ad account with Manage campaigns role, then generate a token with ads_management scope. Test Connection verifies access.
App ID & App Secret (from developers.facebook.com → your app → App settings → Basic): App Secret is used to verify X-Hub-Signature-256 on the Lead Gen Instant Form webhook. Leave App Secret blank when saving to keep the stored value.
Singapore + housing: Meta requires regional_regulation_identities on the ad set. Paste your verified IDs below (often the same value for both).
Meta help
Meta Lead Gen webhook (Instant Form)
In Meta Developers → your app → Webhooks → Page: add callback URL below and subscribe to the leadgen field. Use the same Verify token as in WhatsApp Configuration unless you set an override below.
Environment variables still override Admin Setup when set: META_LEADGEN_VERIFY_TOKEN (verify), META_APP_SECRET / FACEBOOK_APP_SECRET (signature).
Instant Form (API): To create forms from Otomkt (Lead Gen ads → Create form in Meta), Meta requires a public privacy policy https URL. The thank-you “View website” button must be a normal https page (Meta rejects WhatsApp URLs); Otomkt defaults to your listing landing /l/….
Only for GET /webhooks/meta-leadgen. Must match what you enter in Meta when adding the webhook.
Airwallex (payments)
Used for resale web QR checkout, Julia WhatsApp payment links, and reel credit top-ups. Package amounts follow the same tiers as Create Ads and the marketing site (configurable under resalePackages in settings if you add admin UI later). Get API keys from Airwallex Settings → Developer. Register webhook URL … with event payment_intent.succeeded (and optionally payment_link.paid). Sandbox: leave “Use sandbox” on; production: turn off and use live keys.
Card acceptance / “no external redirect”: Reel credit card payments use embedded checkout on app.otomkt.com. Create Ads and Lead Gen campaign fees still use Airwallex Payment Links (browser redirect to Airwallex). If your acquirer or Airwallex onboarding requires all card checkouts to stay on your domain, confirm with them whether hosted Payment Link pages qualify; if not, plan to extend the embedded payment-intent flow to campaign checkouts.
Payment Links (card + PayNow): Shoppers usually see every payment method enabled for your Airwallex merchant account and currency (e.g. SGD cards and PayNow). If PayNow or cards are missing on the hosted checkout page, open the Airwallex dashboard → Settings → Payment methods (or your account’s equivalent) and enable the methods for SGD. The Payment Links REST API does not always expose a per-link method allowlist; prefer dashboard configuration.
Apple Pay (embedded checkout on app.otomkt.com): Enabling Apple Pay in Airwallex is not enough — Apple must verify your domain. The hostname you type in Airwallex must exactly match where checkout runs: use app.otomkt.com (recommended). If you already added otomkt.com, either remove it and add app.otomkt.com, or keep apex — Caddy proxies https://otomkt.com/.well-known/apple-developer-merchantid-domain-association to the app so verification can succeed for both. Download apple-developer-merchantid-domain-association from Airwallex, save as public/.well-known/apple-developer-merchantid-domain-association (no extension), redeploy; or set APPLE_PAY_DOMAIN_ASSOCIATION_PATH to an absolute file path. The app serves it as application/octet-stream. Before clicking Verify, open the exact URL for your registered domain in a private window — you must see JSON starting with {"pspId": (not HTML). If verification still fails, check Cloudflare (disable Bot Fight / a WAF rule blocking Apple’s fetch for /.well-known/*).
Google Pay: Enable in Airwallex under payment methods and accept terms. For Drop-in on your own domain, add app.otomkt.com in Airwallex if the dashboard asks for allowed / website domains. If Google Pay still fails, check Airwallex’s Google Pay troubleshooting (production access in Google Pay Business Console is mainly for direct / native API integrations).
Required for PDF invoices if your Airwallex organisation has more than one legal entity. Single-entity accounts can leave this blank.
Email & Invoicing (SMTP)
Sends branded PDF receipts to advertisers after PayNow payment, CC'd to [email protected]. Use your Google Workspace account — create an App Password and paste it below.
Google Sheets Integration
Auto-log every campaign to a Google Sheet. Requires a Google Cloud service account with Sheets API enabled.
Discord Notifications
Track all link and button clicks from otomkt.com (including /reels) and app.otomkt.com. Create a Discord server with 3 channels (#homepage, #app-page, #live-visit), then paste each channel's webhook URL below.
Discord QC (Julia mirror)
One-way mirror to four Discord text channels (Option A: admin, agents, leads, prospects). Optional fifth channel receives Julia WhatsApp out-of-scope / product feedback summaries. See docs/discord-julia-qc-setup.md. Env vars override these fields when set (DISCORD_BOT_TOKEN, DISCORD_QC_GUILD_ID, DISCORD_QC_CHANNEL_*, DISCORD_QC_CHANNEL_FEEDBACK_WHATSAPP). Legacy DISCORD_QC_DEFAULT_LEADS_CHANNEL_ID fills agents + leads if those are empty.
Parent text channels (create e.g. #qc-admin, #qc-agents, #qc-leads, #qc-prospects under one category; paste each channel ID):
Users & roles
Read-only list (SQLite users.role). admin sees admin-only sidebar items. Role changes are disabled here to avoid accidents; manage via DB or a future admin tool if needed.
| Name | Phone | Role | |
|---|---|---|---|
| Loading… | |||
Property Search
Search for property listings using natural language.
Search for Singapore property listings in natural language.
Try: "Find 5 freehold condos under $2M near Orchard" or "New launch condos in Tampines with 3 bedrooms"
SME ads
Extract a listing, generate a 1:1 creative, refresh overlay copy, then upload a paused traffic campaign to Meta (Singapore, $50 lifetime / 10 days, starts tomorrow).
Saved drafts
Save URL, ad copy, base image, and current overlaid creative. If Meta upload fails, load the draft and retry without regenerating.
Listing
Ask Julia
Ask campaign questions as an advertiser, or simulate a Click-to-WhatsApp lead to test qualification and handoff.
Julia uses your Otomkt and Meta data. If Meta API is not configured, counts and delivery come from Otomkt only.
Ask how many campaigns you have, delivery status, impressions, WhatsApp clicks, or anything about your resale ads.
Starts with the same pre-filled message as your Click-to-WhatsApp ad. Julia answers listing facts from your campaign and Project Database (when the URL matches), guides the chat toward a viewing or a clear outcome, and only hands off when the conversation is finished (see Customer handoff rules under About Julia). A handoff summary and pop-up appear then.
Select a campaign and click Start simulation. You will play the customer; Julia qualifies you like a real lead.
Lead handoff summary
Interest level: —
Simulation
Play the customer in a Click-to-WhatsApp conversation: the chat starts with the same Meta pre-filled message as your live ad, then Julia’s opening reply. Continue as the lead to see qualification and handoff.
Same flow as a real Click-to-WhatsApp lead: the first bubble is the Meta ad’s pre-filled customer message, then Julia’s standard opening reply. Listing facts use your campaign and Project Database when the URL matches.
Select a campaign and click Start simulation. You are the customer; Julia qualifies you like a real lead.
Lead handoff summary
Interest level: —
Demo lead (fixed): John (demo) · +65 8021 0299 — “Message Lead” prefills the same agent→lead opener as Lead handover links: Hi …, I received your enquiry from Otomkt regarding your campaign’s listing phrase (e.g. 3BR unit at Regent Heights), not viewing notes.
New Launch
Extract and manage new launch property listings for ad campaigns.
New Launch Condos
| Project Name | Property Type | Project URL | Completion Year | Developer | Total Units | Images | |
|---|---|---|---|---|---|---|---|
| No new launches added yet. | |||||||
Add New Launch
Extraction Results
Text Overlay
Ad Creatives
Ad Copy
Meta Ads Campaign
Error
Landing page mkt
Publish an alternate sales-focused landing page on otomkt.com/l/… from a PropertyGuru or 99.co listing URL. Use this URL in Meta ads to A/B against the standard landing page.
Enter property website
Supports PropertyGuru and 99.co listings. An agent name must be present on the listing.
Error
Published pages
| Landing URL | Source listing | Updated | |
|---|---|---|---|
| Loading… | |||
Project Database
All extracted property listings are saved here. Repeated extractions of the same URL use cached data to save tokens.
Saved Projects
| Project Name | URL | Agent | Date Listed | Date Extracted | User | Images | Ad Images | Time | Preview |
|---|---|---|---|---|---|---|---|---|---|
| No projects yet. Extract a property listing to see it here. | |||||||||
Project Images
API Logs
Track API consumption across all providers and models.
Request Log
| Timestamp | User | Provider | Model | Task | Tokens | Cost | Speed |
|---|---|---|---|---|---|---|---|
| No logs yet. Generate an ad to see API usage. | |||||||
Version History
Track updates and changes to the platform.
Updates
| Version | Timestamp | Updates |
|---|---|---|
| Loading... | ||
Analytics
Real-time funnel overview and KPIs powered by your database and PostHog. Live events and session replays are also available in your PostHog dashboard.
Open your PostHog project: Activity → Live / Recordings, Product analytics → Funnels, Data management → Events.
Funnel
Step drop-off
| Step | Users | Conv. | Drop |
|---|
Recent events
| Event | Time | User |
|---|
CRM
Registered customers and Admin first, then WhatsApp-only leads. Resale Campaigns shows uploaded count / Meta live delivery (needs token in Admin Setup → Meta Ads API). Clicks counts signed-in activity on the marketing site vs the app. Seen is last authenticated session (SGT).
Users & WhatsApp leads
| Select | Phone | User | Agency | CEA | Campaigns ↑ / live | Msgs | Clicks mkt · app | Seen SGT | Reel credits | Log in as |
|---|---|---|---|---|---|---|---|---|---|---|
| Loading... | ||||||||||
Lead CRM
Qualified Click-to-WhatsApp leads: handover links, agent notify status, and first click (response time). Public link format: https://otomkt.com/r/…
Handover leads
| lead_id | Customer | Phone | Viewing | Additional | Created | Assigned agent | First click | Response time | Notify |
|---|---|---|---|---|---|---|---|---|---|
| Loading… | |||||||||
Leads-unqualified
Raw leads from Meta Instant Form: live leadgen webhook (/webhooks/meta-leadgen) and Graph back-sync (all lead-gen forms linked in Resale campaigns). Timestamp shows Meta lead time when known, else when we stored the row.
Meta Instant Form leads
| Name | Phone | Campaign Name | Time (Meta / stored) | Page visit | Ask full details | Actions |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Webhook delivery log
Recent POSTs to the leadgen webhook (signature-verified payloads).
| ID | Received | Object | Entries | Changes | Note |
|---|---|---|---|---|---|
| Open this page to load. | |||||
Delete from CRM?
Feedback
Bug reports and suggestions from the Submit Feedback page (newest first).
Submissions
| Submitted | User | Message | Attachments |
|---|---|---|---|
| Loading... | |||
About Julia
Define how Julia should behave on WhatsApp and in-app for advertisers and leads. Purpose, guidelines, and guardrails document intent; the Customer handoff (CTWA) section is injected into the customer qualification prompt (simulator today). Save when you are done editing.
Purpose
What Julia is for: advertisers vs customers (CTWA leads), in plain language.
Guidelines (Do's)
How Julia should answer — e.g. ground answers in Project Database / scraped facts; use exact distances and names from stored data.
Guardrails
Hard limits: no web search, no hallucinated property facts, no guessing as certainty.
Customer handoff (CTWA qualification)
Rules appended to Julia’s system prompt for the in-app customer simulator (Click-to-WhatsApp style). Controls when the conversation is “finished” and handoff to the listing agent is allowed — add or edit points as your process evolves.
Airwallex test
Real S$1 PayNow checkout to verify QR creation, webhook handling, and in-app notification. Nothing is linked to Meta campaigns or ad accounts.
airwallex_admin_test_paid to this session.
Reels
Generate a PropertyGuru listing reel and download the MP4. First-time download of each reel uses 1 credit. Each user gets 1 credit for free to try our product; after that you can buy more.
New reel
Your reels
Create Ads
Enter your listing URL, review and edit your ad, then publish to Meta.
Enter Property Website
Supports PropertyGuru and 99.co. We pick the best hero image (e.g. living room) and render one 1080×1080 (1:1) feed creative with text overlay.
Campaign settings
We take 30% of your selected package price as a service fee and allocate 70% as ad spend on Meta. The service fee covers ad generation, campaign management, and lead qualification.
*Number of leads are estimated and vary between projects. We do not guarantee the number of leads. You can track the campaign progress live.
Meta ads preview
Review your campaign summary below, then the feed preview after Meta upload.
Campaign summary
Pay & go live
Your campaign is on Meta in paused status. Pay Now opens Airwallex secure checkout (card or PayNow). When payment confirms, we set delivery to live automatically. Meta may still review creatives before impressions start.
You are paying Aetheria Solutions (UEN 53520810C). Payment is processed by Airwallex on our behalf. Fees and refunds: Payments and fees in our Terms.
Payment successful
Thank you — your payment was received. We set your campaign to deliver in Meta. Ads usually go live after Meta finishes review; timing is controlled by Meta.
Your invoice will appear on Payments & Invoices when ready. Current Ads shows delivery after payment.
Change picture
Pick a photo from this listing. The 1:1 creative re-renders with the same text overlay and Lead Gen—style layout.
Error
Lead Gen ads
Objective on Meta is Lead generation with an Instant Form. Only qualified leads will be passed to agents. The qualification process is available on request.
Enter listing URL
Supports PropertyGuru and 99.co. We render one 1080×1080 (1:1) image creative with text overlay for Meta Lead ads.
Campaign settings
Launched
Pay & go live
Your campaign is on Meta in paused status. Pay Now opens Airwallex secure checkout (card or PayNow). When payment confirms, we set delivery to live automatically. Meta may still review creatives before impressions start.
You are paying Aetheria Solutions (UEN 53520810C). Payment is processed by Airwallex on our behalf. Fees and refunds: Payments and fees in our Terms.
Payment successful
Thank you — your payment was received. We set your campaign to deliver in Meta. Ads usually go live after Meta finishes review; timing is controlled by Meta.
Your invoice will appear on Payments & Invoices when ready. Current Ads shows delivery after payment.
Error
Submit Feedback
Report a bug or share suggestions. You can attach screenshots (JPEG, PNG, or WebP).
Up to 5 images, 10MB each.
Account
Complete your advertiser profile. This is required before you can generate and launch ads.
Advertiser Profile
IncompleteNew Marketing ads
Paste a listing URL — we generate a deal-style overlay (1:1 + 4:5) and 4 ad copy angles you can copy into your own campaigns.
Enter Property Website
Supports PropertyGuru and 99.co listings
Property
Ad Variants — 4 Angles
Each variant leads with a different USP. Tap Copy on any text field to grab it; tap Download under any image to save it.
Current Ads
Resale campaigns you launched from Otomkt. Delivery and stats from Meta.
Your campaigns
Payments & Invoices
PayNow payments and Airwallex PDF invoices.