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.
|
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
Tags
Was this article helpful?
Your feedback helps us improve our documentation.