Skip to main content
Latitude and Gem are buy now, pay later (BNPL) payment providers by Latitude Financial. Latitude operates in Australia and Gem operates in New Zealand. Both use a redirect flow where the buyer approves the payment on a hosted page. Each provider has two connector variants:
ProviderInstant SettlementDeferred Settlement
Latitude (AU)latitude-latitudelatitude-latitudeds
Gem (NZ)gem-gemgem-gemds
  • Instant Settlement - Funds are captured immediately during the transaction.
  • Deferred Settlement - Funds are authorized first and captured manually later.

Setup

Contact the Latitude merchant support team to obtain credentials.

Credentials

When setting up Latitude in the dashboard, configure the following credentials:
  • Merchant ID - The merchant ID obtained from the Latitude Merchant Integration Support team.
  • Merchant Secret - The merchant secret obtained from the Latitude Merchant Integration Support team.

Features

Both connectors support the following features:
  • Partial refunds - Refund a portion of the captured amount
  • Refunds - Refund transactions in full
  • Transaction sync - Automatic synchronization of transaction status updates
The Deferred Settlement connector additionally supports:
  • Delayed capture - Authorize a payment and capture it at a later time
  • Partial capture - Capture a portion of the authorized amount
  • Void - Cancel an authorized transaction before capture

Supported countries

Country codeProvider
AULatitude
NZGem

Supported currencies

Currency codeProvider
AUDLatitude
NZDGem

Limitations

The following features are not supported by this connector:
  • Over capture - Capturing more than the authorized amount is not supported
  • Partial authorization - Accepting a partial amount is not supported
  • Payment method tokenization - Storing payment methods for future use is not supported
  • Zero auth - Zero-dollar verification transactions are not supported
  • Settlement reporting - Automatic settlement reporting is not supported
Additional limitations:
  • Cart items required - Cart items must be included with every transaction.
  • Transaction refresh - Only transactions with a buyer_approval_pending status can be refreshed through the dashboard. Instant Settlement transactions update to capture_succeeded, while Deferred Settlement transactions update to authorization_succeeded.

Required fields

Latitude requires the following buyer information with every transaction:
  • First name
  • Last name
  • Address line 1
  • City
  • Postal code
  • Country

Integration

The default integration for Latitude uses a redirect to a hosted payments page. Start by creating a new transaction with the following required fields. Use latitude or gem as the method for Instant Settlement, or latitudeds or gemds for Deferred Settlement.
var transaction = await client.Transactions.CreateAsync(
  transactionCreate: new TransactionCreate()
  {
    Amount = 1299,
    Currency = "AUD",
    Country = "AU",
    PaymentMethod =
      TransactionCreatePaymentMethod.CreateRedirectPaymentMethodCreate(
        new RedirectPaymentMethodCreate()
        {
          Method = "latitude",
          Country = "AU",
          Currency = "AUD",
          RedirectUrl = "https://example.com/callback",
        }
      ),
  }
);
amount := int64(1299)
currency := "AUD"
country := "AU"
method := components.RedirectPaymentMethodCreateMethodLatitude
redirectUrl := "https://example.com/callback"

redirectPaymentMethodCreate := components.RedirectPaymentMethodCreate{
  Method: method,
  Country: country,
  Currency: currency,
  RedirectURL: redirectUrl,
}
paymentMethod := components.CreateTransactionCreatePaymentMethodRedirectPaymentMethodCreate(redirectPaymentMethodCreate)

transactionCreate := components.TransactionCreate{
  Amount:        amount,
  Currency:      currency,
  Country:       &country,
  PaymentMethod: &paymentMethod,
}

transaction, err := client.Transactions.Create(ctx, transactionCreate, nil, nil, nil)
CreateTransactionResponse transactionResponse = gr4vyClient.transactions().create()
  .transactionCreate(TransactionCreate.builder()
    .amount(1299L)
    .currency("AUD")
    .country("AU")
    .paymentMethod(TransactionCreatePaymentMethod.of(RedirectPaymentMethodCreate.builder()
      .method(RedirectPaymentMethodCreateMethod.LATITUDE)
      .country("AU")
      .currency("AUD")
      .redirectUrl("https://example.com/callback")
      .build()))
    .build())
  .call();

Transaction transaction = transactionResponse.transaction().orElse(null);
$transactionCreate = new TransactionCreate(
  amount: 1299,
  currency: 'AUD',
  country: 'AU',
  paymentMethod: new RedirectPaymentMethodCreate(
    method: 'latitude',
    country: 'AU',
    currency: 'AUD',
    redirectUrl: 'https://example.com/callback'
  )
);
$response = $client->transactions->create($transactionCreate);
$transaction = $response->transaction;
transaction: models.Transaction = client.transactions.create(
  amount=1299,
  currency="AUD",
  country="AU",
  payment_method={
    "method": "latitude",
    "country": "AU",
    "currency": "AUD",
    "redirect_url": "https://example.com/callback",
  }
)
const transaction = await client.transactions.create({
  amount: 1299,
  currency: "AUD",
  country: "AU",
  paymentMethod: {
    method: "latitude",
    country: "AU",
    currency: "AUD",
    redirectUrl: "https://example.com/callback",
  },
});
After the transaction is created, the API response includes a payment_method.approval_url and the status is set to buyer_approval_pending. The approval URL expires after 30 minutes.
{
  "type": "transaction",
  "id": "ea1efdd0-20f9-44d9-9b0b-0a3d71e9b625",
  "payment_method": {
    "type": "payment-method",
    "approval_url": "https://cdn.gr4vy.com/connectors/..."
  },
  "method": "latitude"
}
Redirect the buyer to the approval_url (open in a browser or Webview), where they can complete the payment. Once the buyer approves, the transaction progresses to a capture_succeeded (Instant Settlement) or authorization_succeeded (Deferred Settlement) state.

Connection options

The Latitude connector supports passing a promotion reference when creating a transaction. See the Latitude purchase request API for details.
var transaction = await client.Transactions.CreateAsync(
  transactionCreate: new TransactionCreate()
  {
    Amount = 1299,
    Currency = "AUD",
    ConnectionOptions = new TransactionCreateConnectionOptions()
    {
      LatitudeLatitude = new ConnectionOptionsLatitudeLatitude()
      {
        PromotionReference = "2012",
      },
    },
    PaymentMethod =
      TransactionCreatePaymentMethod.CreateRedirectPaymentMethodCreate(
        new RedirectPaymentMethodCreate()
        {
          Method = "latitude",
          Country = "AU",
          Currency = "AUD",
          RedirectUrl = "https://example.com/callback",
        }
      ),
  }
);
connectionOptions := components.TransactionCreateConnectionOptions{
  LatitudeLatitude: &components.ConnectionOptionsLatitudeLatitude{
    PromotionReference: gr4vy.String("2012"),
  },
}

transactionCreate := components.TransactionCreate{
  Amount:            amount,
  Currency:          currency,
  Country:           &country,
  ConnectionOptions: &connectionOptions,
  PaymentMethod:     &paymentMethod,
}

transaction, err := client.Transactions.Create(ctx, transactionCreate, nil, nil, nil)
CreateTransactionResponse transactionResponse = gr4vyClient.transactions().create()
  .transactionCreate(TransactionCreate.builder()
    .amount(1299L)
    .currency("AUD")
    .connectionOptions(TransactionCreateConnectionOptions.builder()
      .latitudeLatitude(ConnectionOptionsLatitudeLatitude.builder()
        .promotionReference("2012")
        .build())
      .build())
    .paymentMethod(TransactionCreatePaymentMethod.of(RedirectPaymentMethodCreate.builder()
      .method(RedirectPaymentMethodCreateMethod.LATITUDE)
      .country("AU")
      .currency("AUD")
      .redirectUrl("https://example.com/callback")
      .build()))
    .build())
  .call();
$transactionCreate = new TransactionCreate(
  amount: 1299,
  currency: 'AUD',
  country: 'AU',
  connectionOptions: new TransactionCreateConnectionOptions(
    latitudeLatitude: new ConnectionOptionsLatitudeLatitude(
      promotionReference: '2012'
    )
  ),
  paymentMethod: new RedirectPaymentMethodCreate(
    method: 'latitude',
    country: 'AU',
    currency: 'AUD',
    redirectUrl: 'https://example.com/callback'
  )
);
$response = $client->transactions->create($transactionCreate);
transaction: models.Transaction = client.transactions.create(
  amount=1299,
  currency="AUD",
  country="AU",
  connection_options={
    "latitude-latitude": {
      "promotion_reference": "2012",
    },
  },
  payment_method={
    "method": "latitude",
    "country": "AU",
    "currency": "AUD",
    "redirect_url": "https://example.com/callback",
  }
)
const transaction = await client.transactions.create({
  amount: 1299,
  currency: "AUD",
  country: "AU",
  connectionOptions: {
    "latitude-latitude": {
      promotionReference: "2012",
    },
  },
  paymentMethod: {
    method: "latitude",
    country: "AU",
    currency: "AUD",
    redirectUrl: "https://example.com/callback",
  },
});