BUSINESS GROWTH

The Business Growth / Growth Tools module is Leaseora's paid visibility and campaign advertising system. It allows a landlord or real estate company to purchase controlled promotional placements for properties, lease listings, projects, land parcels, mortgages, limited-time offers or the company brand, and to distribute those campaigns across Leaseora web and mobile experiences.

L
Leaseora
Jul 31, 2026 50 min read 15 views

LEASEORA

BUSINESS GROWTH

End-to-End User and Technical Operations Guide

Visibility Packages • Campaign Applications • Payments • Placements • Targeting • Tracking • Analytics • Renewal

For real estate companies, corporate landlords, property managers, marketing teams, leasing teams, sales teams, finance teams and authorised platform administrators

Version 1.0 | July 2026

 

Purpose of this guide

This guide explains how a real estate company uses Leaseora Business Growth / Growth Tools to select paid visibility packages, prepare campaign creative, pay through wallet, gateway or bank transfer, obtain approval, appear in targeted platform placements, measure impressions, clicks and inquiries, manage campaign status and renew expired promotions. It also provides a technical reference for the supplied routes, middleware, models, controllers, services, payments, scheduler logic and notification flows.

 

 

 

Document Control

Item

Details

Document title

Leaseora Business Growth Module - User and Technical Operations Guide

Version

1.0

Date

July 2026

Owner

Leaseora

Primary audience

Real estate companies, corporate and private landlords, portfolio managers, marketing teams, leasing/CRM teams, finance teams and authorised administrators.

Client audience

Clients, tenants, buyers, prospects, investors and mobile users who see or click active visibility campaigns.

Technical audience

Product, engineering, QA, mobile, payment, security, data and platform-operations teams.

Basis

The supplied end-to-end Business Growth scenario, routes, validation rules, data models, services, scheduler queries, payment flows and placement logic.

Support

support@leaseora.com | leaseora.com

 

How to Use This Guide

Reader

Recommended sections

Company director / operations lead

Purpose, roles, lifecycle, governance, KPIs, worked examples, go-live validation and operational review cadence.

Marketing / growth team

Package selection, campaign creative, placement selection, targeting, dates, performance analytics and renewal.

Leasing / CRM / sales team

Promotable asset quality, CTA, inquiry handling, attribution, redirect destinations and conversion tracking.

Finance team

Currency pricing, wallet deduction, gateway verification, bank-transfer proof, reconciliation and total spend.

Property / project team

Property, lease, project, land and mortgage record eligibility and content accuracy.

Technical / QA team

Middleware, routes, model fields, service methods, callbacks, scheduler behaviour, event tracking and UAT.

 

 

Terminology rule

This guide uses Client or Prospect in user-facing instructions. Backend and route names may use Tenant, Landlord, Listing or Promotable; those technical names are preserved exactly where relevant.

 

 

 

1 Purpose, Scope and Terminology

The Business Growth / Growth Tools module is Leaseora's paid visibility and campaign advertising system. It allows a landlord or real estate company to purchase controlled promotional placements for properties, lease listings, projects, land parcels, mortgages, limited-time offers or the company brand, and to distribute those campaigns across Leaseora web and mobile experiences.

Item

Description

Primary business objective

Turn approved property and company content into measurable visibility, clicks and inquiries inside the Leaseora ecosystem.

Core records

VisibilityPackage, VisibilityCampaign, VisibilityPayment and VisibilityImpression.

Promotable assets

Sale listings, lease listings, WeBuild or development projects, land parcels, mortgages, company profiles and limited offers.

Available placements

Featured Projects, Sponsored Properties, Company Spotlight, Limited-Time Offer Banner, Search Priority, Category Promotion and Homepage Campaign.

Payment methods

Landlord wallet, bank transfer and country-supported gateways such as Flutterwave, Paystack or Stripe.

Approval model

Campaign submission and payment do not automatically guarantee publication; Super Admin review and valid dates are also required.

Measurement

Impression, click and inquiry events are logged by campaign and placement, with aggregate counters and daily performance views.

Technical scope

Routes, middleware, package pricing, polymorphic campaign links, payment verification, scheduler activation/expiry and notification logic.

 

Important module boundary

 

Paid visibility is not the underlying listing record

A visibility campaign promotes an existing Leaseora asset or company. It does not replace the Property, Listing, WeBuild Project, LandParcel or Mortgage record. The promoted record must remain accurate, accessible and eligible throughout the campaign.

 

Key terminology

Term

Meaning

Visibility Package

A platform-defined advertising product containing placements, duration, price, features and eligibility rules.

Visibility Campaign

A landlord application and active promotion connected to one package.

Promotable

The linked property, lease listing, project, land parcel, mortgage or company context.

Placement

The platform location where the campaign may appear.

Campaign creative

Title, description, resized image, badge, CTA and targeting information shown to prospects.

Live campaign

An active campaign with paid payment, valid dates and a package containing the requested placement.

Impression

A recorded display of a campaign card or banner.

Click

A recorded user action that redirects to the linked asset or landlord showcase.

Inquiry

A tracked prospect action attributed to the campaign where implemented.

CTR

Click-through rate: clicks divided by impressions multiplied by 100.

 

2 Roles and Responsibilities

Role

Main responsibilities

Key controls

Corporate Landlord / Real Estate Company

Approves promotion strategy, budget, assets, campaign claims and final CTA.

Ensures ownership or management authority, truthful content and approved spend.

Private Landlord

Selects eligible package, submits campaign, pays and reviews outcomes.

Promotes only owned or authorised assets and uses current listing information.

Marketing / Growth Team

Prepares title, description, image, offer badge, targeting and campaign dates.

Uses approved branding, image rights, accurate claims and measurable CTA.

Leasing / CRM / Sales Team

Confirms asset availability, handles clicks/inquiries and records conversion.

Responds promptly and preserves campaign attribution.

Finance Team

Checks local-currency price, wallet balance, gateway status, bank proof and spend.

A gateway redirect or uploaded proof is not payment confirmation until verified.

Property / Project Manager

Validates the promoted asset, status, media, price, dates and customer readiness.

Updates or removes campaigns when underlying availability materially changes.

Staff User

Uses Growth Tools only where staff permission allows.

Requires manage visibility growth or view growth tools according to assigned duties.

Super Admin

Defines packages, reviews campaigns, verifies payments and controls campaign states.

Applies platform policy consistently and records review decisions.

Client / Prospect

Views, clicks and inquires through campaigns on web or mobile.

Should be redirected to the correct current asset or company page.

 

3 Complete Module Journey

BUSINESS GROWTH - END-TO-END PAID VISIBILITY JOURNEY

Figure 1. Business Growth paid visibility lifecycle

Phase

Business outcome

Principal records

1. Discover

The landlord sees active packages appropriate to account type and currency.

VisibilityPackage, CurrencyService.

2. Apply

The company links an eligible asset, supplies creative, targeting and dates.

VisibilityCampaign.

3. Pay

A pending payment becomes paid through verified wallet, gateway or bank-transfer process.

VisibilityPayment.

4. Review and activate

Super Admin approves; service or scheduler activates when payment and dates are valid.

VisibilityCampaignService, AppNotification.

5. Display

The live campaign appears in package-authorised web or mobile placements.

getLiveCampaigns(), placement views/controllers.

6. Track

Impressions, clicks and inquiries are recorded with placement and user/IP context.

VisibilityImpression and campaign counters.

7. Manage and renew

The landlord reviews results, pauses/cancels where allowed and submits a new campaign on renewal.

LandlordCampaignDashboardController.

 

4 Implementation Prerequisites and Access Control

Business information and assets to prepare

☐ Approved company profile, logo, public contact information and landlord showcase page.

☐ Authorised portfolio of sale listings, lease listings, WeBuild/development projects, land parcels and mortgages.

☐ Current asset status, price, location, availability, photos and destination page.

☐ Campaign budget and approved payment source.

☐ Approved campaign title, description, offer badge, CTA and 1200 x 630 campaign image.

☐ Target country, target city and intended client segment.

☐ Preferred campaign start and end dates.

☐ Lead response owner, target response time and CRM attribution process.

☐ Image rights, consent and evidence for promotional claims.

☐ Finance escalation process for wallet, gateway or bank-transfer exceptions.

Route and middleware controls

Control

Required behaviour

Route prefix

/growth-tools with named route prefix landlord.growth.*

Authentication

auth

Account verification

fully_verified

Data isolation

data-isolation

Allowed roles

Landlord (Individual), Landlord (Corporate), Property Manager, Caretaker or Staff according to the route middleware.

Onboarding

landlord.onboarding must be complete.

Staff permission

staff.can:manage visibility growth for management actions; sidebar may also render for view growth tools.

Sidebar condition

staffAllowed(["manage visibility growth", "view growth tools"])

 

 

Use individual staff accounts

Do not share a landlord login. Individual accounts and staff permissions preserve approval, payment and campaign auditability.

 

Recommended pilot sequence

1.      Select one current property or project with a complete destination page.

2.      Choose one low-risk visibility package and confirm local-currency pricing.

3.      Prepare one approved campaign creative and targeting combination.

4.      Test payment, review, activation, web placement, mobile placement and click redirect.

5.      Confirm impression and click counters reconcile with event logs.

6.      Confirm the sales team receives and attributes inquiries.

7.      Review expiry and renewal behaviour before scaling to multiple campaigns.

5 Phase 1 - Discover Visibility Packages

Steps 1 and 2: open the Growth Tools dashboard and choose a package that matches the account, budget, asset and placement objective.

STEP
1

Access the Paid Visibility Dashboard

Primary user: Landlord / Marketing / Authorised Staff

Navigate to Growth Tools -> Paid Visibility or open /growth-tools/paid-visibility. LandlordVisibilityController@index returns packages, local prices and campaign summary counts for the authenticated landlord.

Dashboard area

What it shows

Operational use

Available packages

Only VisibilityPackage records where status = active and landlord_type = all or the authenticated account type.

Avoid selecting a package intended for a different landlord class.

Local price

getPriceForCurrency($currencyCode) resolves pricing tiers or conversion.

Finance confirms the currency and payable amount before application.

Package placements

JSON placement list displayed as package benefits.

Choose a package containing the intended placement.

Duration and cap

duration_days and optional max_impressions.

Align requested dates and expectations with the package.

Features

Package feature bullets.

Use only the features actually listed for that package.

Active campaigns

Current landlord campaigns in active status.

Avoid overlapping campaigns that compete for the same asset without strategy.

Total campaigns

All landlord campaigns across statuses.

Supports portfolio-level campaign governance.

 

How package eligibility is resolved

The controller reads auth()->user()->account_type and calls VisibilityPackage::active()->forLandlordType($landlordType)->get(). A corporate package can therefore be excluded from a private-landlord account, while landlord_type = all remains available to both.

STEP
2

Understand Package Types and Placements

Primary user: Marketing / Growth Lead

 

Placement

Where it appears

Best-fit objective

featured_projects

Featured Projects section.

Promote a WeBuild or development project.

sponsored_properties

Sponsored Properties section.

Increase exposure for a property or lease/sale listing.

company_spotlight

Company Spotlight banner or card.

Build corporate landlord brand awareness.

limited_offer_banner

Limited-time offer banner.

Promote a time-bound incentive or campaign.

search_priority

Highlighted or prioritised position in search results.

Reach users already browsing relevant listings.

category_promotion

Promotion within a property or content category.

Reach users by specific market segment.

homepage_campaign

Homepage banner or campaign card.

Broad platform awareness.

 

 

Placement determines delivery

A campaign can be live but will not appear in a placement unless the selected VisibilityPackage placements JSON contains that placement key.

 

6 Phase 2 - Create and Submit a Campaign

Steps 3 to 6: connect the package to an eligible asset, create accurate campaign content, choose dates and payment method, and submit for payment and review.

STEP
3

Open the Campaign Application

Primary user: Landlord / Marketing Team

Click Apply on a package. GET /growth-tools/paid-visibility/apply/{package} calls LandlordVisibilityController@apply and resolves the landlord ownership context, promotable records, local price, gateways and badge options.

Promotable records loaded by the controller

Promotion choice

Eligible records supplied

Eligibility rule from the scenario

Property / sale

Listing records

listing_type = sale and status in active or pending.

Lease

Listing records

listing_type = lease and status in active or pending.

Project

WeBuildProject

Not cancelled or archived.

Land

LandParcel

Owned by the authenticated landlord context.

Mortgage

Mortgage

Status in pending, approved or active.

Company

Landlord or company context

Promotes the public landlord showcase rather than one asset.

Limited offer

Campaign and landlord context

May redirect to the public landlord showcase.

 

 

Pending does not mean public-ready

The source permits active or pending listings in the application selector. Staff should still confirm that the destination page is suitable for client traffic before submitting a campaign.

 

STEP
4

Select the Correct Promotable Asset

Primary user: Property / Project / Leasing Team

☐ Choose promotion_type: property, lease, project, land, mortgage, company or limited_offer.

☐ Select promotable_id only from records owned or managed by the landlord context.

☐ Confirm promotable_type uses the configured Eloquent morph type.

☐ Open the destination record in a separate browser tab and verify title, location, media, status, price and public accessibility.

☐ Confirm the intended redirect route exists for the selected promotion type.

☐ Do not promote a record that is cancelled, archived, sold, withdrawn or materially inaccurate.

STEP
5

Prepare Campaign Creative and Targeting

Primary user: Marketing / Growth Team

 

Form field

Validation / source rule

Good practice

campaign_title

Required; maximum 150 characters.

State the asset or offer clearly without unsupported claims.

campaign_description

Optional; maximum 500 characters.

Explain the value, location and next action accurately.

campaign_image

Optional JPG, PNG or WebP; maximum 5 MB.

Use an approved landscape image that remains legible after 1200 x 630 crop.

offer_badge

Optional configured badge such as Featured, Hot Deal or Mortgage Ready.

Use only where the badge is factually supportable.

cta_text

Optional; maximum 60 characters.

Use one clear action such as View Property, Explore Project or Contact Company.

target_city

Optional.

Use standard city naming that matches platform data.

target_country

Optional.

Target only countries where the offer and destination are valid.

preferred_start_date

Required; today or later.

Allow time for payment and admin review.

preferred_end_date

Required; later than start date.

Align with package duration and offer validity.

payment_method

Required: wallet, bank_transfer, flutterwave, paystack or stripe where available.

Select a method the finance team can complete and reconcile.

 

Image processing on submission

When an image is uploaded, LandlordVisibilityController@store uses native PHP GD to resize and centre-crop the file to 1200 x 630 pixels. JPEG, PNG and WebP are supported. The processed image is stored under storage/app/public/visibility/campaigns/{random40}.{ext}, and the resulting path is saved with the campaign.

 

Review the crop before approval

Important text, logos or faces near the outer edges may be removed by centre-cropping. Use a safe central composition and avoid embedding essential legal details into the image.

 

STEP
6

Submit the Campaign Application

Primary user: Landlord / Authorised Staff

POST /growth-tools/paid-visibility/apply/{package} validates the form and calls VisibilityCampaignService@submitApplication($validated, $landlord). Within a database transaction the service creates both the VisibilityCampaign and its pending VisibilityPayment.

Record

Initial values

Why it matters

VisibilityCampaign

landlord_id, landlord_type, package, creative, targeting, dates; status = submitted.

Creates the reviewable campaign application.

VisibilityPayment

campaign_id, landlord_id, amount, currency, payment_method; status = pending.

Separates financial confirmation from campaign review.

Campaign reference

VIS- + strtoupper(uniqid()) generated during model creating event.

Provides a business reference for payment and support.

Super Admin notification

New Visibility Campaign Submitted, in_app, sent to all Super Admin users.

Places the campaign in the review queue.

 

 

Submission is not publication

A submitted campaign is neither paid nor approved. The user is redirected to the campaign payment page to complete the next control.

 

7 Phase 3 - Pay for the Campaign

Steps 7 to 10: confirm the campaign price and use one verified payment route.

Figure 2. Campaign payment and verification flow

STEP
7

Review the Payment Page

Primary user: Landlord / Finance Team

GET /growth-tools/paid-visibility/payment/{campaign} displays the campaign, package price, wallet position, available gateways, configured bank-transfer details and the existing VisibilityPayment status.

☐ Confirm campaign reference, package name, amount and currency.

☐ Confirm the wallet balance if wallet payment is intended.

☐ Confirm the selected gateway is available for the landlord country and not hidden by disabled_features.hide_from_visibility_payment.

☐ Use the platform bank details shown on the payment page for bank transfer.

☐ Do not initiate multiple methods for the same campaign without finance review.

☐ Retain payment reference, receipt or proof for reconciliation.

STEP
8

Pay with the Landlord Wallet

Primary user: Finance / Authorised Landlord

POST /growth-tools/paid-visibility/payment/{campaign}/wallet calls LandlordVisibilityController@payWithWallet and VisibilityCampaignService@payWithWallet inside a database transaction.

Control

System action

Balance check

The amount must be available in the landlord wallet.

Debit

$landlord->decrement('wallet_balance', $amount).

Payment update

payment_method = wallet, status = paid, paid_at = now().

Campaign update

status = under_review.

Result

Redirect to campaign detail with payment success message.

 

 

Wallet deduction is financial posting

Restrict wallet payment to authorised users. Confirm the currency and amount and retain the payment record before repeating an apparently failed action.

 

STEP
9

Pay with Flutterwave, Paystack or Stripe

Primary user: Finance / Authorised Landlord

8.      POST the selected gateway to /payment/{campaign}/gateway.

9.      The controller creates or updates a pending VisibilityPayment and generates reference VIS-GW-{UNIQID}.

10.    A callback URL containing campaign and payment identifiers is created.

11.    PaymentGatewayFactory::processPayment($gateway, $paymentData) returns an external redirect_url.

12.    The user completes payment on the gateway page.

13.    The callback route receives gateway-specific parameters and verifies the transaction.

14.    On successful verification, payment status becomes paid, paid_at is recorded, gateway_response stores callback parameters and activateIfReady($campaign) runs.

Gateway / response

Verification input described

Stripe

reference=cs_test_... or equivalent checkout session reference verified by StripeGateway::verifyPayment().

Flutterwave

status=successful and tx_ref or gateway transaction context.

Paystack

trxref and reference.

Generic success

status in success, completed, successful, approved or paid, subject to gateway verification.

Cancellation

cancelled=true or status=cancelled.

 

 

Browser return is not settlement

The controller must verify the payment through the gateway integration. Do not treat a success query string alone as final evidence.

 

STEP
10

Pay by Bank Transfer

Primary user: Finance / Landlord

The payment page displays the configured Sterling Bank details. The landlord transfers the exact amount, uploads proof and waits for Super Admin verification through SuperAdminVisibilityApplicationController@verifyPayment.

☐ Use the campaign or payment reference in the transfer narration where instructed.

☐ Upload a readable proof showing amount, date, sender and reference.

☐ Keep the campaign in payment-pending or review state until the platform verifies actual receipt.

☐ Do not submit duplicate transfers because activation is delayed.

☐ Escalate mismatched currency or amount to Leaseora support before a manual override.

 

Uploaded proof is not paid status

A screenshot or receipt is evidence for review; Super Admin must verify the funds and update VisibilityPayment to paid.

 

8 Phase 4 - Super Admin Review and Approval

Steps 11 to 13: the platform reviews the campaign, payment and dates before it can become visible.

STEP
11

Review the Campaign Application

Primary user: Super Admin / Platform Operations

GET /superadmin/visibility/applications opens the review dashboard. Filters include status, landlord type, placement and free-text search, with aggregate campaign and engagement statistics.

Review area

Questions to answer

Landlord context

Is the applicant the correct owner or authorised corporate/private landlord?

Package eligibility

Is the package active and appropriate for this landlord type?

Promotable record

Does the linked property, lease, project, land, mortgage or company exist and remain eligible?

Creative

Are title, description, image, badge and CTA accurate, professional and policy-compliant?

Targeting

Are country and city appropriate for the offer?

Dates

Are start/end dates valid and consistent with the package and offer?

Payment

Is VisibilityPayment genuinely paid and in the expected currency and amount?

Destination

Will the click redirect to a working and current page?

 

STEP
12

Approve and Activate a Campaign

Primary user: Super Admin

POST /superadmin/visibility/applications/{campaign}/approve calls VisibilityCampaignService@approveCampaign. The campaign status becomes approved, reviewed_by and reviewed_at are recorded, and activateIfReady() checks whether the campaign can go live immediately.

Activation condition

Required state

Campaign review

status = approved

Payment

payment.status = paid

Start date

preferred_start_date <= today

End date

preferred_end_date >= today

 

When all conditions pass, the service sets status = active, activated_at = now() and expires_at = preferred_end_date. The landlord receives an approval notification and, when activation occurs, a second notification that the campaign is now live.

 

Approval and activation can occur at different times

A campaign approved before its start date remains approved until the date condition is satisfied. The scheduler or lazy activation later moves it to active.

 

STEP
13

Handle Rejection, Changes, Pause, Resume, Extension or Cancellation

Primary user: Super Admin / Platform Operations

 

Admin action

Status / record effect

Landlord communication supplied

Reject

status = rejected.

In-app notification includes rejection reason.

Request changes

status = draft.

In-app notification tells landlord to revise.

Pause

status = paused.

No notification specified in the scenario.

Resume

status = active if dates remain valid.

No notification specified.

Extend

expires_at updated.

No notification specified.

Verify payment

VisibilityPayment becomes paid; campaign may approve/activate according to service logic.

No notification specified.

Cancel

status = completed.

No notification specified.

 

 

Record reasons for controlled actions

Although only rejection explicitly requires a reason in the supplied flow, platform operations should preserve review, pause, extension, payment verification and cancellation rationale for audit and customer support.

 

9 Phase 5 - Automated Campaign Lifecycle

Steps 14 and 15: approved campaigns start on time and active campaigns expire automatically.

Figure 3. Visibility campaign status lifecycle

STEP
14

Auto-Activate an Approved Campaign

Primary user: System Scheduler / VisibilityCampaignService

The Laravel Scheduler runs daily and selects campaigns where status = approved, payment is paid, preferred_start_date is today or earlier and preferred_end_date is today or later. Each qualifying campaign becomes active with activated_at = now() and expires_at = preferred_end_date.

Lazy activation on page load

VisibilityCampaignService@getLiveCampaigns() also calls autoActivateDueCampaigns(). This means a due campaign can activate when live campaigns are requested, without waiting for the next daily scheduler run.

 

Do not rely on status alone

Serving logic still requires status active, paid payment and valid activated_at/expires_at dates. A manually altered status should not bypass those checks.

 

STEP
15

Auto-Expire a Campaign and Notify the Landlord

Primary user: System Scheduler

The daily expiry task selects active campaigns where expires_at is earlier than today, changes status to expired and calls VisibilityCampaignService@notifyExpired($campaign->fresh()).

Expiry output

Result

Campaign status

expired

Placement visibility

No longer returned by getLiveCampaigns().

Landlord notification

Visibility Campaign Expired with a prompt to renew from Growth Tools.

Renewal

A new campaign application is created from the same package and prefilled data.

 

10 Phase 6 - Clients See Active Campaigns

Steps 16 to 20: a single live-campaign service supplies approved promotions to web, mobile, search and showcase experiences.

Figure 4. Active campaign placement map

How getLiveCampaigns() filters campaigns

Filter

Required condition

Campaign status

active

Payment

Related VisibilityPayment status = paid

Activation date

activated_at <= now

Expiry date

expires_at >= now

Package placement

VisibilityPackage.placements JSON contains the requested placement

Country

When supplied, target_country matches

City

When supplied, target_city matches

Ordering

inRandomOrder() after filters

 

STEP
16

Display a Homepage Campaign

Primary user: Client / Public Visitor

The homepage calls VisibilityCampaignService@getLiveCampaigns('homepage_campaign') and dynamically injects eligible campaigns into the homepage view.

☐ The package must include homepage_campaign.

☐ The campaign must be active, paid and within live dates.

☐ Campaign creative should be suitable for broad public viewing.

☐ The CTA should lead to a valid asset or landlord showcase.

STEP
17

Display Campaigns on the Client Dashboard

Primary user: Client / Tenant

Tenant\Shared\DashboardController requests featured_projects, sponsored_properties, company_spotlight and limited_offer_banner placements. The dashboard renders promotional banners and cards alongside the client experience.

STEP
18

Display Sponsored Results in Listing Search

Primary user: Client / Prospect

Tenant\Shared\ListingBrowserController requests getLiveCampaigns('search_priority'). Eligible sponsored campaigns are injected into highlighted or priority positions in search results.

 

Sponsored visibility does not change listing truth

Search-priority placement should not alter the underlying price, availability, location or status. The linked listing remains the authoritative record.

 

STEP
19

Display Campaigns in the Mobile App

Primary user: Mobile Client

API\Mobile\Tenant\DashboardController returns active campaigns as JSON for the mobile dashboard. API\Mobile\Shared\LandlordShowcaseMobileController uses the same service for public landlord showcase views by slug or landlord identifier.

STEP
20

Display a Limited Offer on the Public Landlord Showcase

Primary user: Public Visitor / Authenticated Client

Public\LandlordShowcaseController@show resolves the landlord by corporate company-name slug or user-name slug, loads the landlord portfolio and checks for the latest active limited_offer campaign. When found, recordEvent() logs an impression on landlord_showcase.

Promotion type

Primary click destination

limited_offer / company

Public landlord showcase.

project

Tenant We Build For You project details.

property / lease / land / mortgage

Tenant listing detail using linked slug.

Fallback

Tenant private dashboard.

 

11 Phase 7 - Impression, Click and Inquiry Tracking

Steps 21 to 23: every measurable campaign interaction updates an aggregate counter and a detailed event log.

Figure 5. Impression, click and inquiry event flow

STEP
21

Record an Impression

Primary user: System / Placement View

VisibilityCampaignService@recordEvent($campaign, 'impression', $placement, $userId) creates a VisibilityImpression row with campaign, event type, placement, optional user and request IP, then increments VisibilityCampaign.impressions.

Event field

Purpose

visibility_campaign_id

Links the event to the paid campaign.

event_type

impression, click or inquiry.

placement

Identifies where the event occurred.

user_id

Authenticated user where available; nullable.

ip_address

Request IP for anonymous or audit context.

created_at

Supports daily grouping and trend analysis.

 

 

Count only genuine renders

An impression should be recorded when the campaign is actually rendered in a placement, not merely when it is fetched but never shown. The exact front-end rendering rule should be validated during UAT.

 

STEP
22

Record a Click and Redirect

Primary user: Authenticated Client

GET /visibility/{campaign}/click uses auth middleware, records a click event using the first package placement or dashboard fallback, increments clicks and redirects according to promotion_type.

☐ Confirm the campaign is still live before presenting the link.

☐ Record the correct placement rather than always relying on the first package placement.

☐ Redirect to the current promotable record or landlord showcase.

☐ Use fallback only where the intended destination cannot be resolved.

☐ Preserve campaign attribution when the client later submits an inquiry.

STEP
23

Record an Inquiry

Primary user: Client / CRM / Platform Flow

VisibilityCampaignService@recordEvent supports event_type = inquiry and increments VisibilityCampaign.inquiries. The supplied scenario does not identify one dedicated inquiry route for every promotion type; implementation teams should call recordEvent when the campaign-generated lead or inquiry is actually created.

 

Avoid counting clicks as inquiries

A click indicates interest but is not the same as a completed inquiry, application or sale. Define the exact inquiry trigger per destination flow and apply it consistently.

 

12 Phase 8 - Manage Campaigns and Performance

Steps 24 to 27: the landlord reviews portfolio-level results and manages an individual campaign.

STEP
24

Open My Campaigns

Primary user: Landlord / Marketing / Management

GET /growth-tools/my-campaigns calls LandlordCampaignDashboardController@index and returns a paginated, filterable campaign list plus aggregate statistics.

Dashboard statistic

Calculation / source

Total campaigns

VisibilityCampaign count for landlord_id.

Active campaigns

status = active.

Pending campaigns

status in submitted, under_review, approved or payment_pending.

Total impressions

SUM(impressions).

Total clicks

SUM(clicks).

Total inquiries

SUM(inquiries).

Total spend

SUM VisibilityPayment.amount where status = paid.

CTR

clicks / impressions x 100; handle zero impressions safely.

 

STEP
25

Review a Campaign Detail

Primary user: Marketing / Finance / Management

GET /growth-tools/my-campaigns/{campaign} shows package, payment, promotable item, image, badge, CTA, targeting, dates and current status. Staff should use the detail page as the primary operational record when investigating a display or payment issue.

Campaign detail review checklist

☐ Campaign reference and package match the approved request.

☐ Payment is paid and transaction reference is present.

☐ Promotable item is still active and accessible.

☐ Creative and CTA match the destination.

☐ Target city/country match the intended audience.

☐ Activated_at and expires_at reflect the actual run period.

☐ Status history explains review, pause, resume or expiry.

☐ Counters are plausible compared with detailed event logs.

STEP
26

Review Daily Performance

Primary user: Marketing / Management

GET /growth-tools/my-campaigns/{campaign}/performance groups VisibilityImpression records by DATE(created_at) and event_type to create daily impression, click and inquiry time-series charts.

Question

Metric to review

Possible action

Is the campaign being seen?

Impressions by day and placement.

Check live status, package placement, targeting and rendering.

Is creative attracting interest?

Clicks and CTR.

Improve future image, title, badge or CTA.

Are clicks becoming business opportunities?

Inquiries and inquiry-to-click ratio.

Review destination page and sales follow-up.

Is delivery ending early?

Daily activity vs. activated_at/expires_at.

Check pause, expiry, targeting or placement.

Is spend justified?

Total paid amount vs. inquiries and conversions.

Compare packages and repeat only effective campaigns.

 

 

Performance is attribution, not guaranteed causation

Campaign metrics show platform interactions. Sales, leases or mortgage conversions may also depend on pricing, availability, follow-up and external channels.

 

STEP
27

Pause or Cancel an Eligible Campaign

Primary user: Landlord / Authorised Manager

 

Action

Route

Rule supplied

Pause

POST /my-campaigns/{campaign}/pause

Sets status = paused only if currently active.

Cancel

POST /my-campaigns/{campaign}/cancel

Sets status = completed if campaign is draft, payment_pending or submitted.

 

 

Financial effect is not defined

The supplied scenario does not state refund, credit or extension rules for landlord pause/cancel actions. Do not promise a refund or unused-time credit unless confirmed by platform policy.

 

13 Phase 9 - Renew an Expired, Rejected or Completed Campaign

STEP
28

Start a Campaign Renewal

Primary user: Landlord / Marketing Team

GET /growth-tools/paid-visibility/renew/{campaign} is allowed only where status is expired, rejected or completed. The system redirects to the same package application form and flashes renew_data to pre-fill previous values.

15.    Open the expired, rejected or completed campaign.

16.    Select Renew.

17.    Review the current package availability and local price; previous pricing is not automatically guaranteed.

18.    Review the promotable record, image, title, description, badge, CTA and targeting.

19.    Replace expired offers and update start/end dates.

20.    Submit the renewal as a new campaign application.

21.    Complete payment and Super Admin review again.

22.    Compare the new campaign performance with the earlier campaign.

 

Renewal creates a new campaign

The old campaign remains part of history. Renewal pre-fills an application but follows the full submission, payment and approval process again.

 

14 Visibility Package Configuration Reference

VisibilityPackage field

Purpose

Operational interpretation

name

Package name.

Clear customer-facing product label.

type

Package tier.

May distinguish levels or product family.

placements

JSON array of placement keys.

Controls where live campaigns can be served.

duration_days

Nominal package duration.

Should align with requested campaign dates.

price

Base price.

Used when no explicit local tier is available.

currency / base_currency

Base pricing currency.

Input to currency conversion.

pricing_tiers

JSON currency-price map.

Preferred explicit local pricing where configured.

max_impressions

Optional delivery cap.

Enforcement mechanism is not detailed in the supplied scenario.

analytics_enabled

Detailed analytics toggle.

User interface should respect package entitlement.

landlord_type

all, private_landlord or corporate_landlord.

Determines package visibility by account type.

features

JSON feature bullets.

Displayed to landlord during package selection.

status

active or inactive.

Only active packages are shown to landlords.

 

Multi-currency package pricing

VisibilityPackage@getPriceForCurrency($currencyCode) resolves the display price. The scenario states that CurrencyService and CurrencyConversionService may use configured pricing tiers, FX tiers or live conversion. Finance should confirm the final campaign payment currency stored on VisibilityPayment.

 

Price display and payment record must agree

The application screen may show a converted local amount. The stored VisibilityPayment amount and currency should match the amount actually presented and collected. Validate this during gateway and wallet UAT.

 

15 Campaign Creative, Targeting and Destination Standards

Campaign quality checklist

Area

Minimum standard

Title

Specific, concise, truthful and within 150 characters.

Description

Accurate, current and within 500 characters; no unsupported guarantees.

Image

Authorised JPG/PNG/WebP under 5 MB, suitable for centre-crop to 1200 x 630.

Badge

Matches the real offer or platform-approved status.

CTA

One action that matches the click destination.

Asset link

Correct promotable type and ID, owned by the landlord context.

Availability

Current at submission and monitored while live.

Targeting

Country/city is relevant and does not exclude the intended market accidentally.

Dates

Do not run past the offer, inventory or project-validity period.

Destination page

Loads successfully on web/mobile and contains complete contact or inquiry path.

 

Examples of suitable CTAs

Promotion type

CTA examples

Destination

Property / lease

View Property, Check Availability, Request Details

Listing detail.

Project

Explore Project, View Development, Register Interest

WeBuild/project detail.

Land

View Land Parcel, Request Inspection, See Payment Plan

Land/listing detail.

Mortgage

View Mortgage Option, Check Eligibility, Learn More

Mortgage/listing detail.

Company

Explore Our Portfolio, Visit Company Profile

Public landlord showcase.

Limited offer

View Offer, Explore Available Units

Public landlord showcase or linked asset.

 

 

Avoid misleading urgency

Limited-time badges and expiry claims should reflect actual commercial terms and campaign dates. A paid placement does not justify false scarcity.

 

16 Payment, Reconciliation and Exception Controls

Control point

Required practice

Campaign amount

Match package/local price and VisibilityPayment amount.

Currency

Confirm display, payment and settlement currency.

Wallet balance

Check before debit; prevent duplicate deduction on retry.

Gateway reference

Use the unique VIS-GW reference and preserve external reference.

Gateway verification

Verify server-side using the selected gateway implementation.

Callback idempotency

Repeated callbacks must not create duplicate paid states or financial postings.

Bank transfer

Verify actual bank receipt before marking paid.

Raw response

Store gateway_response JSON without exposing secrets in user views.

Paid timestamp

Set paid_at only after successful verification.

Activation

Call activateIfReady only after payment is paid.

Total spend

Reconcile paid VisibilityPayments to finance and campaign dashboard.

Refunds / credits

Not defined in source; follow confirmed platform policy only.

 

Monthly reconciliation procedure

23.    Export or review all paid VisibilityPayment records for the period.

24.    Match wallet deductions to landlord wallet history.

25.    Match gateway payments to gateway settlement reports using references.

26.    Match bank-transfer payments to the platform bank statement and verification action.

27.    Compare paid campaigns with campaign statuses and run dates.

28.    Investigate paid but non-active campaigns, active but unpaid records or duplicated callbacks.

29.    Reconcile total spend shown on My Campaigns to the underlying payments.

30.    Document adjustments and support cases.

17 Status Lifecycles and Record Relationships

Record

Key statuses supplied

Operational meaning

VisibilityPackage

active, inactive

Controls package availability to landlords.

VisibilityCampaign

draft, submitted, under_review, approved, active, paused, expired, completed, rejected; payment_pending appears in dashboard grouping.

Tracks application, review, publication and closure.

VisibilityPayment

pending, paid, failed

Tracks financial readiness.

Promotable records

Module-specific statuses.

Underlying asset eligibility must remain valid.

 

Core relationships

Relationship

Description

VisibilityPackage -> campaigns

One package can support many landlord campaigns.

VisibilityCampaign -> package

Each campaign belongs to one package.

VisibilityCampaign -> payment

Each campaign has a related VisibilityPayment in the supplied flow.

VisibilityCampaign -> landlord

The owning User/landlord context.

VisibilityCampaign -> promotable

Polymorphic property, listing, project, land, mortgage or other configured type.

VisibilityCampaign -> impressionLogs

Detailed VisibilityImpression events.

VisibilityImpression -> user

Optional authenticated viewer or clicker.

 

 

Status names should be checked against the live build

The scenario uses submitted, under_review, approved, active, paused, expired, completed, rejected and draft, while the dashboard also groups payment_pending. Confirm the exact enum and transitions before formal training.

 

18 Notification and Communication Matrix

Event

Recipient

Channel

Message / purpose

New campaign submitted

All Super Admins

in_app

New application requires review.

Campaign approved

Landlord

in_app

Approved and expected live date stated.

Campaign becomes live

Landlord

in_app

Campaign is visible and expiry date stated.

Campaign rejected

Landlord

in_app

Rejection reason supplied.

Campaign expired

Landlord

in_app

Campaign ended and can be renewed.

 

Operational communication not explicitly supplied

The scenario does not specify automatic landlord notifications for pause, resume, extension, payment verification or admin cancellation. Product and operations teams should confirm whether these actions generate notifications in the live build before including them in customer commitments.

19 Staff Permissions and Segregation of Duties

Role

Typical access

Control point

Growth Viewer

Package and campaign dashboards.

view growth tools only; cannot submit, pay or change campaigns.

Marketing Officer

Applications, creative, targeting and performance.

Cannot approve unbudgeted spend or verify payment.

Property / Project Officer

Promotable records and content accuracy.

Cannot change platform package or admin review decision.

Finance Officer

Payment page, wallet/gateway/bank evidence and reconciliation.

Cannot alter promotional claims or admin approval.

Growth Manager

manage visibility growth, campaign submission, pause/cancel and performance.

Major spend and exceptions should use internal approval.

Director / Approver

Campaign budget, claims, targeting and portfolio strategy.

Reviews ROI and audit evidence.

Super Admin Reviewer

Platform application review, state changes and payment verification.

Should not approve unsupported claims or unverified funds.

Technical / Support

Investigates routing, payment callback, scheduler and tracking defects.

Avoids manual data changes without documented authorisation.

 

Minimum security practices

·       Use individual accounts and least-privilege staff permissions.

·       Require internal approval for campaign spend above company thresholds.

·       Protect wallet and payment-gateway actions with strong authentication.

·       Do not expose gateway secrets or private callback data in campaign views.

·       Retain review, payment and status-change history.

·       Remove Growth Tools permissions when a staff member changes role or leaves.

·       Restrict export data that contains user IDs or IP addresses.

·       Use data-isolation middleware and landlord ownership checks on every campaign route.

20 Dashboards, KPIs and Management Review

Dashboard / report

Management questions answered

Package dashboard

Which active products, placements and prices are available to this account?

Campaign pipeline

How many campaigns are submitted, under review, approved, active, paused, rejected or expired?

Payment status

Which campaigns are unpaid, paid, failed or awaiting bank verification?

Delivery

Which campaigns are generating impressions, and where?

Engagement

Which creative produces clicks and the strongest CTR?

Lead generation

Which campaigns produce inquiries and conversions?

Spend

How much has been paid by period, package and campaign?

Placement performance

Which placements perform best for each asset type?

Geographic performance

Which target country/city combinations produce useful engagement?

Renewal decision

Which campaigns should be renewed, changed or discontinued?

 

Recommended review cadence

Frequency

Review

Daily

New submissions, payment failures, campaigns due to start, active-placement visibility and broken destinations.

Twice weekly

Impressions, clicks, inquiries, CTR, lead response and asset availability.

At campaign midpoint

Creative performance, targeting, sales feedback and whether a platform pause/escalation is needed.

At expiry

Final metrics, spend, inquiry quality, conversion and renewal decision.

Monthly

Package comparison, placement ROI, payment reconciliation and staff access.

Quarterly

Growth strategy, campaign standards, geographic focus, company spotlight and portfolio mix.

 

Core formulas

Metric

Formula / interpretation

CTR

(clicks / impressions) x 100.

Inquiry rate

(inquiries / clicks) x 100, where the inquiry trigger is consistently implemented.

Cost per click

Paid campaign amount / clicks.

Cost per inquiry

Paid campaign amount / inquiries.

Conversion rate

Confirmed business conversions / campaign inquiries, maintained by CRM/sales process.

Delivery against cap

impressions / max_impressions where the package has a cap and enforcement is implemented.

 

21 Worked Examples

Example 1 - Sponsored Lease Listing in Search

Stage

What happens

Objective

Increase inquiries for an available apartment lease listing.

Package

A package containing search_priority and/or sponsored_properties.

Application

promotion_type = lease; select active listing; title, image, CTA and target city supplied.

Payment

Finance pays through wallet and campaign moves under_review.

Approval

Super Admin approves; campaign activates on preferred start date.

Client experience

Listing appears in a sponsored position; click redirects to tenant.listings.show/{slug}.

Measurement

Search impression, click and later inquiry are recorded separately.

Decision

Renew only if inquiry quality and cost per inquiry meet target.

 

Example 2 - WeBuild Project on Client Dashboard

Stage

What happens

Objective

Generate investor or buyer interest in an active development project.

Package

featured_projects placement.

Promotable

WeBuildProject not cancelled or archived.

Creative

Project image, milestone/value proposition and Explore Project CTA.

Client experience

Campaign appears in Featured Projects and redirects to project-details/{id}.

Follow-up

Sales/CRM team attributes project inquiries to the campaign reference.

 

Example 3 - Corporate Company Spotlight

Stage

What happens

Objective

Promote the real estate company brand and entire portfolio.

Package

company_spotlight or homepage_campaign.

Promotion type

company.

Destination

Public landlord showcase showing sale, lease, project, land and mortgage records.

Creative control

Use approved company logo, service proposition and portfolio CTA.

Measurement

Campaign clicks show storefront interest; downstream inquiries require attribution.

 

Example 4 - Limited Offer Banner

Stage

What happens

Objective

Promote a legitimate time-bound offer across the client dashboard or landlord showcase.

Package

limited_offer_banner.

Dates

Campaign end date does not exceed the commercial offer expiry.

Badge / CTA

Limited Offer / View Offer, supported by destination content.

Expiry

Scheduler removes campaign and landlord receives expiry notification.

Renewal

Only create a new campaign if the offer is still valid and updated.

 

Example 5 - Mortgage Visibility Campaign

Stage

What happens

Objective

Promote an eligible mortgage opportunity.

Promotable

Mortgage status pending, approved or active as supplied by the selector.

Control

Marketing verifies that the destination contains current eligibility, terms and disclosures.

Payment

Gateway payment verified with unique VIS-GW reference.

Client experience

Campaign redirects to the configured listing/mortgage detail destination.

Governance

No guaranteed approval or misleading rate claim is used in the campaign creative.

 

22 Real Estate Company Onboarding Checklist

Account and permissions

☐ Landlord account is fully verified and onboarding is complete.

☐ Corporate/private account_type is correct.

☐ Growth viewer and manager permissions are assigned to individual staff.

☐ Finance and campaign approval responsibilities are documented.

☐ Public landlord showcase and company profile are complete.

Portfolio and creative

☐ Promotable sale and lease listings are current.

☐ Projects exclude cancelled/archived records.

☐ Land parcels are linked to the correct landlord.

☐ Mortgage records are eligible for promotion.

☐ Campaign image standards and rights process are approved.

☐ CTA and claim approval procedure is documented.

☐ Target-city and target-country standards are defined.

Finance and operations

☐ Wallet balance and authorisation rules are confirmed.

☐ Country-eligible gateways are configured and tested.

☐ Bank-transfer verification procedure is agreed.

☐ Campaign budget and reconciliation owner are assigned.

☐ Sales/CRM lead attribution and response process are tested.

☐ Scheduler and notification delivery are monitored.

☐ Pilot campaign success measures are approved.

23 User Acceptance Testing and Go-Live Validation

Test area

Test case

Expected result

Access

Test each landlord and staff role.

Only authorised accounts see or manage Growth Tools.

Packages

Private/corporate accounts view eligible active packages.

Correct package set and local price.

Promotable selector

Load sale, lease, project, land and mortgage options.

Only owned and eligible records appear.

Validation

Submit missing/invalid fields and large/unsupported image.

Clear validation errors; invalid data rejected.

Image processing

Upload JPG/PNG/WebP.

File is centre-cropped to 1200 x 630 and stored correctly.

Submission

Submit a valid campaign.

Campaign submitted, payment pending and admin notified.

Wallet payment

Pay with sufficient and insufficient balance.

Correct debit or safe rejection; no duplicate debit.

Gateway payment

Complete success, failure, cancel and duplicate callback.

Server verification, idempotent paid status and stored response.

Bank transfer

Upload proof and verify as admin.

Payment remains pending until manual verification.

Approval

Approve paid campaign before and on start date.

Approved then active only when date condition is satisfied.

Rejection / changes

Reject and request changes.

Correct status and landlord notification.

Placements

Test every package placement on web and mobile.

Only live, targeted, paid campaigns appear.

Targeting

Test country/city match and mismatch.

Campaign returned only for matching filters.

Click redirect

Click each promotion type.

Event logged and correct destination opens.

Tracking

Render, click and create inquiry.

Counters and detailed logs update once per intended event.

Performance

Review daily charts.

Counts reconcile to VisibilityImpression logs.

Pause/resume

Pause active campaign and resume through admin.

Hidden while paused; restored if dates valid.

Expiry

Move past expires_at or run scheduler.

Status expired, no placement delivery, landlord notified.

Renewal

Renew expired/rejected/completed campaign.

New application prefilled and old record preserved.

 

 

Go-live gate

Do not launch paid campaigns until payment verification, permission isolation, placement delivery, click routing, tracking, scheduler activation/expiry and finance reconciliation have passed end-to-end UAT.

 

24 Common Issues and Troubleshooting

Issue

Recommended action

Growth Tools menu is missing

Check role, onboarding, fully_verified status and staff permissions manage visibility growth / view growth tools.

Expected package is missing

Confirm package status, landlord_type and account_type.

Package price looks wrong

Check pricing_tiers, base currency, landlord currency and CurrencyConversionService result.

Promotable asset is missing

Check ownership context, listing_type/status, project cancellation/archive, mortgage status or land ownership.

Campaign image rejected

Use JPG/PNG/WebP under 5 MB; verify GD support and file integrity.

Image crop cuts content

Use a safe central 1200 x 630 composition and re-upload.

Wallet payment fails

Check balance, amount/currency and transaction rollback; do not retry blindly.

Gateway shows paid but campaign is pending

Check server verification, payment reference, callback route, gateway_response and payment status.

Bank proof uploaded but unpaid

Wait for Super Admin bank verification; compare actual bank receipt.

Campaign approved but not active

Check paid payment, preferred_start_date, preferred_end_date and scheduler/lazy activation.

Campaign active but not visible

Check package placement JSON, targeting, dates, promotable destination and getLiveCampaigns filters.

Campaign visible in wrong city/country

Review target values and query parameters passed to getLiveCampaigns.

Click redirects to dashboard

Promotable or slug resolution failed; check promotion_type and linked record.

Impressions remain zero

Confirm recordEvent is called when the campaign is actually rendered.

Click count differs from log

Check duplicate requests, bots, counter updates and event records.

CTR is undefined

Handle zero impressions safely.

Campaign did not expire

Check expires_at, scheduler execution and timezone/date comparison.

Renew action unavailable

Only expired, rejected or completed campaigns are eligible in the supplied flow.

Total spend differs

Reconcile paid VisibilityPayment records and dashboard filters/currency.

 

 

Support information to include

Provide company/landlord, campaign reference, package, status, payment reference, promotion type, placement, target country/city, date/time, expected result, actual result and a screenshot without exposing gateway secrets.

 

25 Frequently Asked Questions

What is Business Growth on Leaseora?

It is the paid visibility system for promoting properties, leases, projects, land, mortgages, limited offers or a company brand across Leaseora placements.

Can every landlord see every package?

No. Packages must be active and available to all landlords or the authenticated private/corporate landlord type.

Can a campaign promote more than one asset?

The supplied campaign record has one polymorphic promotable_id/type. A company campaign can send users to the broader landlord showcase.

Can we pay in local currency?

VisibilityPackage resolves a price using pricing tiers or currency conversion. Confirm the amount and currency saved on the payment.

Does submitting a campaign make it live?

No. It must be paid, approved and within its valid dates.

Does gateway redirect mean paid?

No. The gateway response must be verified server-side.

Does bank-transfer proof mean paid?

No. Super Admin verifies the actual funds.

Where can campaigns appear?

Homepage, dashboard, search priority, featured projects, sponsored properties, company spotlight, limited offers, category promotion and mobile/showcase surfaces according to the package.

Can campaigns target a city or country?

Yes. getLiveCampaigns can filter by target_country and target_city when those parameters are supplied.

What is an impression?

A recorded campaign display in a placement.

What is a click?

An authenticated click recorded before redirecting to the asset or showcase.

What is an inquiry?

A completed lead or inquiry action attributed to the campaign. The exact trigger should be implemented consistently per destination.

Can a landlord pause a campaign?

Yes, the landlord dashboard can pause an active campaign. Super Admin can also pause/resume.

Will a paused campaign receive a refund?

The supplied scenario does not define refund or unused-time credit rules.

How does expiry work?

A daily scheduler expires active campaigns after expires_at and notifies the landlord.

Can we renew?

Expired, rejected and completed campaigns can open a prefilled application for the same package.

Does renewal keep the old campaign?

Yes. Renewal creates a new application; the old record remains as history.

Is AI used in this module?

No dedicated AI controller or AI service is identified in the supplied Business Growth scenario. Do not present AI optimisation as an implemented feature without separate technical confirmation.

26 Quick Reference - 28 Operational Steps

31.    Open Paid Visibility dashboard.

32.    Understand package placements and eligibility.

33.    Open the application form.

34.    Select the correct promotable asset.

35.    Prepare creative, targeting and dates.

36.    Submit the campaign and create pending payment.

37.    Review the payment page.

38.    Pay with wallet.

39.    Pay with a verified gateway.

40.    Submit bank-transfer proof for manual verification.

41.    Super Admin reviews the application.

42.    Approve and activate when ready.

43.    Handle rejection, changes, pause, resume, extension or cancellation.

44.    Auto-activate approved paid campaigns on the due date.

45.    Auto-expire campaigns after expires_at.

46.    Serve homepage campaigns.

47.    Serve client-dashboard placements.

48.    Serve search-priority campaigns.

49.    Serve mobile campaigns.

50.    Serve limited offers on public landlord showcase.

51.    Record campaign impressions.

52.    Record clicks and redirect.

53.    Record completed inquiries.

54.    Review My Campaigns and aggregate KPIs.

55.    Review campaign detail.

56.    Review daily performance.

57.    Pause or cancel where allowed.

58.    Renew an expired, rejected or completed campaign.

27 Technical Reference - Core Models and Tables

Model / table

Purpose

VisibilityPackage / visibility_packages

Admin-defined advertising product with placement, duration, pricing, landlord eligibility, feature and status configuration.

VisibilityCampaign / visibility_campaigns

Landlord campaign application, creative, targeting, run dates, status, counters and review details.

VisibilityPayment / visibility_payments

Payment amount, currency, method, reference, status, paid time and gateway response.

VisibilityImpression / visibility_impressions

Per-event impression, click or inquiry log with placement, user and IP.

Listing

Promotable sale or lease listing.

WeBuildProject

Promotable development project.

LandParcel

Promotable landlord-owned land.

Mortgage

Promotable mortgage record.

PaymentGateway

Available gateway configuration filtered by country and disabled features.

AppNotification

In-app campaign submission, approval, activation, rejection and expiry messages.

 

VisibilityCampaign key fields

Field

Description

reference

Auto-generated VIS-{UNIQID}.

landlord_id

FK to user/landlord.

landlord_type

private_landlord or corporate_landlord.

visibility_package_id

Selected package.

promotion_type

property, lease, project, land, mortgage, company or limited_offer.

promotable_id / promotable_type

Polymorphic promoted record.

campaign_title / description / image

Creative content.

offer_badge / cta_text

Display label and action.

target_city / target_country

Geographic targeting.

preferred_start_date / preferred_end_date

Requested dates.

activated_at / expires_at

Actual live dates.

status

Campaign lifecycle.

impressions / clicks / inquiries

Aggregate performance counters.

reviewed_by / reviewed_at

Admin review record.

 

28 Technical Reference - Controllers and Services

Class

Responsibility

LandlordVisibilityController

Package browsing, application form, image processing, campaign submission, payment page, wallet/gateway payment, callbacks and renewal.

LandlordCampaignDashboardController

Campaign list, detail, performance charts, landlord pause and cancel.

SuperAdminVisibilityApplicationController

Platform review, approve, reject, request changes, pause, resume, extend, verify payment and cancel.

VisibilityCampaignService

Submit application, wallet payment, approval, rejection, activation, expiry notification, live campaign query and event tracking.

VisibilityPackage

Package scopes and getPriceForCurrency().

VisibilityCampaign

Polymorphic promotable, payment, impression logs, isLive() and counters.

CurrencyService

Resolves landlord display currency.

CurrencyConversionService

Converts package pricing where no explicit tier applies.

PaymentGatewayFactory

Unified Flutterwave, Paystack and Stripe payment processing.

Public\LandlordShowcaseController

Public landlord portfolio and limited-offer campaign impression.

Tenant\Shared\DashboardController

Client dashboard placements.

Tenant\Shared\ListingBrowserController

Search-priority sponsored campaigns.

API\Mobile\Tenant\DashboardController

Mobile dashboard campaign JSON.

API\Mobile\Shared\LandlordShowcaseMobileController

Mobile landlord showcase campaigns.

Laravel Scheduler / Kernel.php

Daily auto-activation and auto-expiry.

 

29 Technical Reference - Route Matrix

Method and route

Named route / action

GET /growth-tools/paid-visibility

landlord.growth.visibility.index -> LandlordVisibilityController@index

GET /growth-tools/paid-visibility/apply/{package}

landlord.growth.visibility.apply -> @apply

POST /growth-tools/paid-visibility/apply/{package}

landlord.growth.visibility.store -> @store

GET /growth-tools/paid-visibility/payment/{campaign}

landlord.growth.visibility.payment -> @payment

POST /growth-tools/paid-visibility/payment/{campaign}/wallet

@payWithWallet

POST /growth-tools/paid-visibility/payment/{campaign}/gateway

@payWithGateway

GET /growth-tools/paid-visibility/payment/{campaign}/gateway/callback/{payment}

@gatewayCallback

GET /growth-tools/paid-visibility/renew/{campaign}

landlord.growth.visibility.renew -> @renew

GET /growth-tools/my-campaigns

landlord.growth.campaigns.index -> LandlordCampaignDashboardController@index

GET /growth-tools/my-campaigns/{campaign}

landlord.growth.campaigns.show -> @show

GET /growth-tools/my-campaigns/{campaign}/performance

landlord.growth.campaigns.performance -> @performance

POST /growth-tools/my-campaigns/{campaign}/pause

@pause

POST /growth-tools/my-campaigns/{campaign}/cancel

@cancel

GET /visibility/{campaign}/click

tenant.visibility.click -> record click and redirect

GET /superadmin/visibility/applications

SuperAdminVisibilityApplicationController@index

POST /superadmin/visibility/applications/{campaign}/approve

@approve

POST .../{campaign}/reject

@reject

POST .../{campaign}/request-changes

@requestChanges

POST .../{campaign}/pause | resume | extend | verify-payment | cancel

Corresponding Super Admin actions

 

30 Technical Reference - Core Service Logic

VisibilityCampaignService@submitApplication

·       Runs inside a database transaction.

·       Creates VisibilityCampaign with landlord context and status submitted.

·       Creates related VisibilityPayment with pending status.

·       Triggers in-app notification to all Super Admin users.

·       Returns the campaign for payment redirect.

VisibilityCampaignService@payWithWallet

·       Checks the landlord wallet position.

·       Debits wallet balance inside a database transaction.

·       Sets payment method wallet, payment status paid and paid_at.

·       Sets campaign status under_review.

·       Avoids partial update if the transaction fails.

VisibilityCampaignService@activateIfReady

·       Requires campaign status approved.

·       Requires related payment status paid.

·       Requires preferred_start_date not later than today.

·       Requires preferred_end_date not earlier than today.

·       Sets active, activated_at and expires_at.

·       Sends campaign-live notification.

VisibilityCampaignService@getLiveCampaigns

·       Runs lazy auto-activation for due campaigns.

·       Eager-loads package, promotable and landlord.

·       Filters active, paid and current dates.

·       Filters package placements JSON by requested placement.

·       Optionally filters target country and city.

·       Returns campaigns in random order.

VisibilityCampaignService@recordEvent

·       Creates VisibilityImpression with event type, placement, optional user and IP.

·       Increments impressions, clicks or inquiries on the campaign.

·       Supports detailed log reporting and aggregate dashboard metrics.

31 Technical Reference - Payment and Event Fields

VisibilityPayment field

Description

visibility_campaign_id

Related campaign.

landlord_id

Paying landlord.

amount / currency

Payable amount and currency.

payment_method

wallet, bank_transfer, flutterwave, paystack or stripe.

status

pending, paid or failed.

transaction_reference

Gateway or internal reference.

paid_at

Successful verification time.

gateway_response

Raw callback parameters stored as JSON.

 

VisibilityImpression field

Description

visibility_campaign_id

Related campaign.

event_type

impression, click or inquiry.

placement

Surface where the event occurred.

user_id

Authenticated user where available.

ip_address

Request IP.

created_at

Event timestamp used in daily charts.

 

32 Scheduler and Operational Jobs

Job / trigger

Selection

Action

Daily auto-activate

approved + paid + start_date <= today + end_date >= today

status active, activated_at now, expires_at preferred_end_date.

Lazy auto-activate

getLiveCampaigns() invocation

Calls autoActivateDueCampaigns() before live query.

Daily auto-expire

active + expires_at < today

status expired and notifyExpired().

 

Operational monitoring

·       Confirm the Laravel scheduler runs in production.

·       Monitor scheduler logs and failed jobs.

·       Compare campaigns due to start with active status each morning.

·       Compare expired dates with placement delivery.

·       Investigate timezone or date-only comparison issues.

·       Avoid running multiple schedulers that produce duplicate notifications.

33 Security, Privacy and Data Isolation

Risk area

Control

Cross-landlord access

Use data-isolation middleware and landlord ownership queries for campaigns, payments and promotable assets.

Staff access

Enforce manage visibility growth / view growth tools permissions.

Payment tampering

Calculate amount server-side from package pricing and verify gateway response.

Callback replay

Implement idempotent payment verification.

Wallet misuse

Restrict wallet payment to authorised users and use database transactions.

File upload

Validate image MIME, extension, size and decode safely through GD.

Creative content

Moderate claims, rights, inappropriate content and fraudulent offers.

Tracking privacy

Restrict access to user_id and IP event data; apply retention and privacy rules.

Raw gateway data

Do not expose secrets or sensitive callback content to unauthorised users.

Admin actions

Record reviewer, time, reason and status history.

 

 

IP addresses are personal data in many jurisdictions

Use event IP data only for legitimate analytics, fraud prevention and audit purposes; apply access controls, retention policy and legal/privacy review.

 

34 Implementation Details Requiring Confirmation

The supplied scenario defines the principal flow but does not specify every production policy. Confirm the following against the live code, configuration and commercial terms before external training or contractual commitments:

☐ Exact package catalogue, prices, currencies, pricing-tier precedence and FX refresh rules.

☐ Whether preferred_end_date must exactly equal package duration_days or may be shorter/longer.

☐ How max_impressions is enforced and what happens when the cap is reached before end date.

☐ Exact definition and front-end trigger for a billable/recorded impression.

☐ Bot filtering, duplicate event prevention and anonymous tracking policy.

☐ Exact inquiry event triggers for every promotion destination.

☐ Refund, credit, pause-duration, cancellation and unused-time rules.

☐ Bank-transfer proof upload endpoint, file validation and verification audit trail.

☐ Gateway-specific webhook handling in addition to browser callback.

☐ Payment callback idempotency and duplicate wallet protection.

☐ Full campaign status enum, including payment_pending and draft transitions.

☐ Notifications for pause, resume, extension, payment verification and cancellation.

☐ Admin content policy, review SLA and prohibited campaign claims.

☐ Search-priority ordering rules when several campaigns compete.

☐ Analytics entitlement behaviour when analytics_enabled is false.

☐ Timezone used for date-only activation and expiry comparisons.

☐ Conversion tracking beyond inquiry, including CRM source and confirmed sale/lease attribution.

☐ Data retention rules for campaign images, gateway_response, user_id and IP address logs.

☐ Whether anonymous public homepage views are tracked with user_id null and how consent is handled.

☐ No dedicated AI capability is identified in the supplied module; confirm separately before marketing AI optimisation.

 

Implementation sign-off

Product, engineering, finance, legal/privacy, marketing and support teams should approve these points before production rollout to external real estate companies.

 

35 End-to-End Operating Summary

Stage

Company action

System result

Discover

Browse active packages for landlord type and currency.

Eligible package catalogue and campaign counts.

Apply

Link asset, supply creative, targeting and dates.

Submitted campaign and pending payment.

Pay

Complete wallet, gateway or bank-transfer process.

Verified paid VisibilityPayment.

Review

Super Admin approves or returns decision.

Approved, rejected or draft-for-changes campaign.

Activate

Wait for valid start date and paid approval.

Active campaign with activated_at/expires_at.

Display

Serve through package placement and targeting filters.

Client sees campaign on web/mobile.

Track

Record impression, click and inquiry events.

Counters and detailed logs.

Analyse

Review daily trends, CTR, inquiries and spend.

Renew, revise or stop future campaigns.

Expire / renew

Scheduler expires; landlord creates new application.

Historic campaign retained and new campaign submitted.

 

LEASEORA

BUSINESS GROWTH

Paid visibility that connects approved real estate opportunities to measurable client discovery, engagement and inquiry.

Support and onboarding

support@leaseora.com  |  leaseora.com

 

Was this article helpful?

Your feedback helps us improve our documentation.

Article Info

Category BUSINESS GROWTH
Reading Time 50 min
Views 15
Published Jul 31, 2026

Share

🤝

Need more help?

Our support team is available to assist you.

Contact Support