Get Earn More Gallery
Get properties with active campaigns offering bonus points
/members/me/features/discover/galleries/earn-moreOverview
Returns properties with active campaigns offering bonus points. These are properties where members can earn additional points beyond the standard earning rate, often through promotional campaigns or special partnerships.
Authentication
Requires a valid Clerk JWT token in the Authorization header.
Query Parameters
limitquerynumberMaximum number of items to return
offsetquerynumberNumber of items to skip for pagination
Request
curl -X GET "http://localhost:3000/v1/members/me/features/discover/galleries/earn-more" \
-H "Authorization: Bearer YOUR_CLERK_JWT"Response
This endpoint returns properties with bonus earning campaigns, typically with additional campaign information.
itemsarrayrequiredArray of properties with active bonus campaigns
array items
propertyobjectrequiredProperty information with campaign details
campaignobjectBonus earning campaign information
campaign object
idstringCampaign identifier
namestringCampaign name
bonusMultipliernumberPoints multiplier (e.g., 2.0 for double points)
bonusAmountnumberFixed bonus points amount
descriptionstringCampaign description
validFromstringCampaign start date (ISO 8601)
validTostringCampaign end date (ISO 8601)
termsstringCampaign terms and conditions
baseEarningRatenumberStandard points per dollar spent
bonusEarningRatenumberEnhanced points per dollar with campaign
totalnumberrequiredTotal number of properties with bonus campaigns
Response
{
"items": [
{
"property": {
"id": 201,
"documentId": "prop_luxury_resort_miami",
"name": "Miami Beach Luxury Resort",
"brandName": "Journey Shores",
"type": "Resort",
"baseRoomCategory": "Ocean Suite",
"nightlyCost": 85000,
"guestRating": 4.7,
"maxGuests": 4,
"amenities": ["Private Beach", "Spa", "Multiple Restaurants", "Pool Complex"],
"address": {
"city": "Miami Beach",
"state": "Florida",
"country": "United States",
"latitude": 25.7617,
"longitude": -80.1918
},
"heroImage": {
"url": "https://cdn.example.com/properties/miami-resort-hero.jpg",
"alt": "Miami beach resort with ocean view"
},
"gallery": [
{
"url": "https://cdn.example.com/properties/miami-resort-1.jpg",
"alt": "Resort pool deck"
}
]
},
"campaign": {
"id": "summer_2024_triple_points",
"name": "Summer Triple Points",
"bonusMultiplier": 3.0,
"bonusAmount": null,
"description": "Earn triple points on all stays during summer season",
"validFrom": "2024-06-01T00:00:00Z",
"validTo": "2024-08-31T23:59:59Z",
"terms": "Valid for new bookings only. Cannot be combined with other offers."
},
"baseEarningRate": 5,
"bonusEarningRate": 15
},
{
"property": {
"id": 202,
"documentId": "prop_mountain_lodge_colorado",
"name": "Colorado Mountain Lodge",
"brandName": "Journey Peaks",
"type": "Lodge",
"baseRoomCategory": "Alpine Room",
"nightlyCost": 35000,
"guestRating": 4.5,
"maxGuests": 6,
"amenities": ["Ski Access", "Hot Tub", "Mountain Views", "Restaurant"],
"address": {
"city": "Aspen",
"state": "Colorado",
"country": "United States",
"latitude": 39.1911,
"longitude": -106.8175
},
"heroImage": {
"url": "https://cdn.example.com/properties/colorado-lodge-hero.jpg",
"alt": "Mountain lodge in winter setting"
},
"gallery": [
{
"url": "https://cdn.example.com/properties/colorado-lodge-1.jpg",
"alt": "Lodge interior with fireplace"
}
]
},
"campaign": {
"id": "ski_season_bonus_2024",
"name": "Ski Season Bonus",
"bonusMultiplier": null,
"bonusAmount": 5000,
"description": "Earn 5,000 bonus points per night during ski season",
"validFrom": "2024-12-01T00:00:00Z",
"validTo": "2025-03-31T23:59:59Z",
"terms": "Minimum 2-night stay required. Bonus points awarded after checkout."
},
"baseEarningRate": 5,
"bonusEarningRate": 5
},
{
"property": {
"id": 203,
"documentId": "prop_urban_hotel_nyc",
"name": "Manhattan Business Hotel",
"brandName": "Journey Urban",
"type": "Hotel",
"baseRoomCategory": "Executive Room",
"nightlyCost": 55000,
"guestRating": 4.4,
"maxGuests": 2,
"amenities": ["Business Center", "Fitness Center", "Restaurant", "Concierge"],
"address": {
"city": "New York",
"state": "New York",
"country": "United States",
"latitude": 40.7589,
"longitude": -73.9851
},
"heroImage": {
"url": "https://cdn.example.com/properties/nyc-hotel-hero.jpg",
"alt": "Modern hotel in Manhattan"
},
"gallery": [
{
"url": "https://cdn.example.com/properties/nyc-hotel-1.jpg",
"alt": "Executive room with city view"
}
]
},
"campaign": {
"id": "business_travel_double_2024",
"name": "Business Travel Double Points",
"bonusMultiplier": 2.0,
"bonusAmount": null,
"description": "Double points for stays Sunday-Thursday",
"validFrom": "2024-01-01T00:00:00Z",
"validTo": "2024-12-31T23:59:59Z",
"terms": "Valid for Sunday-Thursday arrivals only. Weekend stays not eligible."
},
"baseEarningRate": 5,
"bonusEarningRate": 10
}
],
"total": 15
}Campaign Types
Multiplier Campaigns
- Type: Point multipliers (2x, 3x, etc.)
- Calculation: Base rate × multiplier
- Example: Standard 5 pts/$ becomes 15 pts/$ with 3x multiplier
- Use Case: Seasonal promotions, special events
Fixed Bonus Campaigns
- Type: Fixed bonus points per night/stay
- Calculation: Base rate + fixed bonus
- Example: Standard 5 pts/$ + 5,000 bonus points per night
- Use Case: Property launches, partnership promotions
Hybrid Campaigns
- Type: Combination of multiplier and fixed bonus
- Calculation: (Base rate × multiplier) + fixed bonus
- Example: Double points + 2,500 bonus per night
- Use Case: Major promotional events
Use Cases
Bonus Campaign Display
const BonusPropertyCard = ({ item }) => {
const { property, campaign, baseEarningRate, bonusEarningRate } = item;
const calculateSavings = () => {
if (campaign.bonusMultiplier) {
const bonusPoints = baseEarningRate * (campaign.bonusMultiplier - 1);
return `${bonusPoints}x bonus points`;
}
if (campaign.bonusAmount) {
return `+${campaign.bonusAmount.toLocaleString()} bonus points per night`;
}
return 'Bonus earning opportunity';
};
return (
<div className="bonus-property-card">
<div className="campaign-badge">
{campaign.name}
</div>
<img src={property.heroImage?.url} alt={property.heroImage?.alt} />
<div className="property-info">
<h3>{property.name}</h3>
<p>{property.address?.city}, {property.address?.country}</p>
<div className="earning-info">
<span className="base-rate">Usually {baseEarningRate} pts/$</span>
<span className="bonus-rate">Now {bonusEarningRate} pts/$</span>
<span className="savings">{calculateSavings()}</span>
</div>
<div className="campaign-details">
<p>{campaign.description}</p>
<span className="valid-until">
Valid until {new Date(campaign.validTo).toLocaleDateString()}
</span>
</div>
</div>
</div>
);
};Campaign Filtering
const filterActiveCampaigns = (properties) => {
const now = new Date();
return properties.filter(item => {
const validFrom = new Date(item.campaign.validFrom);
const validTo = new Date(item.campaign.validTo);
return now >= validFrom && now <= validTo;
});
};
const sortByBestValue = (properties) => {
return properties.sort((a, b) => {
// Sort by highest earning rate first
return b.bonusEarningRate - a.bonusEarningRate;
});
};Earning Calculator
const calculateEarnings = (property, stayDetails) => {
const { nightlyCost } = property.property;
const { campaign, baseEarningRate, bonusEarningRate } = property;
const { nights, totalSpend } = stayDetails;
// Base earning calculation
const basePoints = Math.floor((totalSpend || nightlyCost * nights) * baseEarningRate / 100);
// Bonus calculation
let bonusPoints = 0;
if (campaign.bonusMultiplier) {
bonusPoints = Math.floor(basePoints * (campaign.bonusMultiplier - 1));
}
if (campaign.bonusAmount) {
bonusPoints += campaign.bonusAmount * nights;
}
return {
basePoints,
bonusPoints,
totalPoints: basePoints + bonusPoints,
savings: bonusPoints
};
};Campaign Management
Validity Checking
- Date Validation: Campaigns automatically filtered by valid date range
- Terms Compliance: Campaign terms displayed to users
- Availability: Real-time validation against booking dates
- Eligibility: Member tier and booking requirements checked
Dynamic Updates
- Real-time: Campaign status updated in real-time
- Inventory: Campaign availability tracked by property
- Rate Changes: Earning rates updated when campaigns change
- Notifications: Members notified of new bonus opportunities
Related Endpoints
- Get Featured Content - Main discover screen content
- Get Signature Stays - Premium curated properties
- Get Inspiring Stays - Themed property collections
- Get Wallet Activity - Track earned bonus points