Journey Docs
Members APIDiscover

Get Earn More Gallery

Get properties with active campaigns offering bonus points

GET/members/me/features/discover/galleries/earn-more

Overview

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

limitquerynumber

Maximum number of items to return

offsetquerynumber

Number 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.

itemsarrayrequired

Array of properties with active bonus campaigns

array items
propertyobjectrequired

Property information with campaign details

campaignobject

Bonus earning campaign information

campaign object
idstring

Campaign identifier

namestring

Campaign name

bonusMultipliernumber

Points multiplier (e.g., 2.0 for double points)

bonusAmountnumber

Fixed bonus points amount

descriptionstring

Campaign description

validFromstring

Campaign start date (ISO 8601)

validTostring

Campaign end date (ISO 8601)

termsstring

Campaign terms and conditions

baseEarningRatenumber

Standard points per dollar spent

bonusEarningRatenumber

Enhanced points per dollar with campaign

totalnumberrequired

Total number of properties with bonus campaigns

Response

200 Response - Bonus Earning Properties
{
  "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

On this page