Inwall

Two-sided ad marketplace: advertisers fund a budget and set a price per share, per social network; Inwallers browse a vertical feed and get paid the moment they share. MVP specs — a living document, updated as we work through the Figma design.

Overview

Inwall connects advertisers who want reach on social networks with everyday people who already share things on those networks. Instead of buying impressions from a platform, an advertiser pays per confirmed share, directly to the person who shared.

PlatformsiOS + Android
Mobile stackFlutter (single codebase)
Two sidesAdvertiser (campaign console) / Inwaller (vertical feed)
Design sourceFigma, file "Inwallsept2025", canvas "MVP Flows TO BE USED FOR MVP ONLY"

Core loop

The whole product is this cycle running on repeat, one ad view at a time.

01

Fund & split

Advertiser sets a global budget, splits it per social network, sets targeting zones.

02

Price the share

Fixed payout set per network — e.g. €3 on Facebook, €5 on Instagram.

03

Scroll & share

Inwaller browses the vertical feed and shares an ad to one of the priced networks.

04

Get paid

Payout lands, deducted from that network's sub-budget, then the global one.

Campaign setup Advertiser

"Create an ad" is a 3-step flow (Figma frames Budget add budget, ad settings, Your social accounts popularity), tracked by a segmented progress bar at the top of each screen.

1
Budget & price per share. Set the total budget, then pay-per-share (PPS) for each network individually (steppers, e.g. Instagram $5, Facebook $3, Snapchat $0 to disable it)
2
Ad settings. Upload the creative, set targeting (gender, location, age, interests) and payment
3
Social accounts popularity. Advertiser enters their own Instagram / Facebook / Snapchat username and follower count
4
Confirmation. "Your ad is now live" — success screen, links straight to the performance dashboard
Open question: step 3 (advertiser's own follower count) isn't obviously payout logic — is it used to estimate reach, to gate eligibility, or just informational? Not resolved in the Figma flow, needs a decision.

Console states to cover: draft campaign, live campaign, paused (a network's sub-budget exhausted), ended.

Budget mechanics

A share deducts from its network's sub-budget first, then from the global budget. When a network's sub-budget hits zero, sharing to that network stops paying out — the ad can still appear, but shares to that network earn nothing until the advertiser tops it up.

€1,000.00Example: global campaign budget
Instagram · €450
Facebook · €350
Snapchat · €200
NetworkSub-budgetPrice per share
Instagram€450€5.00
Facebook€350€3.00
Snapchat€200€2.00
Open question: what happens to a share confirmed in the same instant a sub-budget hits zero — first-confirmed-wins, or a small reserved buffer per network? Needs a decision before payout logic is built.

Matches the fields on the ad's "Details" tab in Figma: Status (Live, green check), Date, Ad name, Remaining budget ("$300 / $1,000"), Target (gender, location, age, interests), and the price-per-share per network.

Feed & sharing Inwaller

Vertical, full-screen, TikTok-style (Figma frame explore / infinite scroll). Creative fills the screen edge to edge; chrome floats on top of it, same dark tab bar as the rest of the app.

ElementBehavior
Bottom-left pillAdvertiser identity (logo mark + name) over the creative
Bottom-right circular buttonShare action — reuses the Inwall logomark itself as the share icon
Eye iconView counter for the ad
Swipe up/downNext / previous ad in the feed
Tap shareChoose a network, confirm the share, see the payout amount before confirming
Network exhaustedThat network's payout option is disabled on this ad, others stay active

Feed states to cover: loading (skeleton), empty feed (no funded ads left for this user's targeting), network error.

Payouts

1
Inwaller shares an ad to a chosen network
2
Share is confirmed (see verification, open risk)
3
Payout amount is credited to the Inwaller's in-app wallet
4
Inwaller cashes out from the wallet (KYC required, see roadmap)

Earnings and payout history are visible in-app at all times.

Data model (first pass)

To refine with the developer, this is a starting point based on the flows above.

EntityKey fields
Advertiserid, name, email, kyc_status, created_at
Inwallerid, handle, email, wallet_balance, trust_score, created_at
Campaignid, advertiser_id, creative_url, global_budget, global_spent, status, zone, created_at
NetworkAllocationid, campaign_id, network (facebook/instagram/snapchat/tiktok), sub_budget, sub_spent, price_per_share
Shareid, inwaller_id, network_allocation_id, network, status (pending/confirmed/rejected), payout_amount, shared_at, verified_at
WalletTransactionid, inwaller_id, share_id, amount, type (payout/cashout), created_at

Screen inventory (Figma)

11 top-level frames on the "MVP Flows TO BE USED FOR MVP ONLY" canvas (node 2413:46122):

  • logo inwall — app icon / splash mark
  • explore / infinite scroll ×3 — the vertical feed (splash/onboarding variant + two feed states)
  • Budget add budget — campaign step 1, budget + price per share
  • ad settings — campaign step 2, creative + targeting + payment
  • Your social accounts popularity — campaign step 3, advertiser's own follower counts
  • success — "Your ad is now live" confirmation
  • Full ad — advertiser dashboard, all campaigns, budget used, impressions, reach, shares by network
  • Ad performance — single-campaign detail, "Ad performance" / "Details" tabs
  • Startup profile / Documents — leftover frame from another project's template, not part of Inwall's flow, hidden in Figma
To do with Laura: confirm whether the multiple "explore / infinite scroll" variants map to distinct states (empty, loading, populated) or are duplicates to clean up, same pass as HugeOne's screen cleanup.

Design system

Extracted from the real Figma variables on 2026-08-19 (session with the file shared to laura@inwall.app). See the full design system page for colors, type, and components pulled directly from the file, not a provisional palette.

Risks & open questions unresolved

Share verification

No reliable way yet to confirm a share happened and stayed visible. Biggest single point of failure in the model — needs prototyping before the rest of the app.

Third-party API dependency

Facebook, Instagram, Snapchat, and TikTok can restrict or ban this usage pattern at any time. No fallback currently defined if one network cuts access.

Fraud / farming

A flat payout per share is a direct incentive to fake accounts and disposable posts. Needs a trust score gating payout eligibility (see roadmap).

Payout compliance

Paying individuals for posting ad content sits in a legal grey zone (disclosure rules, KYC/AML, tax withholding), and varies by country.

Out of scope for MVP

  • Automated real-time reach/engagement measurement beyond confirming the share exists
  • Multi-currency payouts (single currency, EUR, at launch)
  • Advertiser self-service billing beyond a prepaid budget top-up
  • Any network outside Facebook, Instagram, Snapchat, TikTok

V1 roadmap future

  • Delayed verification + quality score: confirm a share survives 24–48h before paying the full amount
  • Trust score per Inwaller (account age, share survival rate) gating payout rate
  • Wallet, KYC, and payout compliance built on Stripe Connect or equivalent from day one
  • Native in-feed value (views, interactions, ranking) so Inwall isn't 100% dependent on external share APIs

Decisions made & open questions

Decisions

  • Mobile stack: Flutter
  • Repo holds specs first, app scaffold to follow once the Flutter SDK is installed locally
  • Payout is per confirmed share, priced per network, set by the advertiser
  • A network's sub-budget hitting zero disables payouts on that network only, not the whole campaign
  • Share verification and third-party API dependency are treated as the top two risks, prototyped first

Open

  • Share verification method: which signal counts as "confirmed"?
  • Sub-budget race condition at zero: first-confirmed-wins or reserved buffer?
  • KYC/payout compliance approach per launch country