> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gr4vy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Worldline TravelHub - Sofort

> Configure Sofort via Worldline TravelHub.

Worldline TravelHub provides Sofort payments through a redirect flow for supported European countries.

## Setup

Please follow the [common Worldline instructions](./worldline) to get set up with Sofort via TravelHub.

After setting up your TravelHub account, make sure Sofort is enabled as a payment method on your account.

TravelHub requires the billing country (`address.country`) for Sofort transactions.

## Features

Worldline TravelHub Sofort payments support the following features:

* **Refunds** - Refund transactions in full or in part
* **Partial refunds** - Issue multiple partial refunds up to the captured amount
* **Transaction sync** - Keep payment statuses synchronized with TravelHub
* **Webhook integration** - Receive asynchronous payment updates
* **Redirect checkout** - Redirect buyers to approve the payment

## Supported countries

Worldline TravelHub supports transactions from buyers in the following countries:

| Country code | Country code | Country code | Country code | Country code | Country code | Country code | Country code |
| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |
| `AT`         | `BE`         | `CH`         | `DE`         | `ES`         | `GB`         | `IT`         | `PL`         |

## Supported currencies

Worldline TravelHub supports processing payments in the following currencies:

| Currency code | Currency code | Currency code | Currency code | Currency code | Currency code | Currency code | Currency code |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| `CHF`         | `EUR`         | `GBP`         | `PLN`         |               |               |               |               |

## Limitations

The following features are not supported by this connector:

* **Delayed capture** - Authorization and capture must happen together
* **Partial capture** - Capturing a portion of the authorized amount is not supported
* **Void** - Canceling an authorization is not available
* **Payment method tokenization** - Storing payment methods for recurring transactions is not supported
* **Settlement reporting** - Settlement reporting is not available
* **Zero auth** - Zero-dollar verification transactions are not supported
* **Over-capture** - Capturing more than the authorized amount is not supported
* **Partial authorization** - Authorizing only a portion of the requested amount is not supported
* **Deep linking** - Direct app linking is not supported

## Captures and refunds

As Sofort transactions can take up to 48 hours to be marked as paid, refunds cannot be processed until the transaction reaches that state. Transactions marked as **Captured** in the system might not be refundable until this point.

## Integration

The default integration for Sofort via TravelHub uses a redirect to a payments page hosted by Gr4vy.

Start by creating a new transaction with the following required fields.

<CodeGroup>
  ```csharp C# theme={"system"}
  var transaction = await client.Transactions.CreateAsync(
  	transactionCreate: new TransactionCreate()
  	{
  		Amount = 1299,
  		Currency = "EUR",
  		Country = "DE",
  		PaymentMethod =
  			TransactionCreatePaymentMethod.CreateCheckoutSessionWithUrlPaymentMethodCreate(
  				new RedirectPaymentMethodCreate()
  				{
  					Method = "sofort",
  					RedirectUrl = "https://example.com/callback",
  				}
  			),
  	}
  );
  ```

  ```go Go theme={"system"}
  amount := int64(1299)
  currency := "EUR"
  country := "DE"
  method := "sofort"
  redirectUrl := "https://example.com/callback"

  redirectPaymentMethodCreate := components.RedirectPaymentMethodCreate{
  	Method: method,
  	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)
  ```

  ```java Java theme={"system"}
  CreateTransactionResponse transactionResponse = gr4vyClient.transactions().create()
  	.transactionCreate(TransactionCreate.builder()
  		.amount(1299L)
  		.currency("EUR")
  		.country("DE")
  		.paymentMethod(TransactionCreatePaymentMethod.of(RedirectPaymentMethodCreate.builder()
  			.method("sofort")
  			.redirectUrl("https://example.com/callback")
  			.build()))
  		.build())
  	.call();

  Transaction transaction = transactionResponse.transaction().orElse(null);
  ```

  ```php PHP theme={"system"}
  $transactionCreate = new TransactionCreate(
  	amount: 1299,
  	currency: 'EUR',
  	country: 'DE',
  	paymentMethod: new RedirectPaymentMethodCreate(
  		method: 'sofort',
  		redirectUrl: 'https://example.com/callback'
  	)
  );
  $response = self::$sdk->transactions->create($transactionCreate);
  $transaction = $response->transaction;
  ```

  ```python Python theme={"system"}
  transaction: models.Transaction = client.transactions.create(
  	amount=1299,
  	currency="EUR",
  	country="DE",
  	payment_method={
  		"method": "sofort",
  		"redirect_url": "https://example.com/callback",
  	}
  )
  ```

  ```ts TypeScript theme={"system"}
  const transaction = await gr4vy.transactions.create({
  	amount: 1299,
  	currency: "EUR",
  	country: "DE",
  	paymentMethod: {
  		method: "sofort",
  		redirectUrl: "https://example.com/callback"
  	}
  })
  ```
</CodeGroup>

After the transaction is created, the API response includes `payment_method.approval_url` and the `buyer_approval_pending` status.

```json theme={"system"}
{
	"type": "transaction",
	"id": "ea1efdd0-20f9-44d9-9b0b-0a3d71e9b625",
	"payment_method": {
		"type": "payment-method",
		"approval_url": "https://cdn.sandbox.spider.gr4vy.app/connectors/worldline/apm.html?token=..."
	},
	"method": "sofort"
}
```

Redirect the buyer to the `approval_url` so they can complete authentication and approve the payment. After approval, the buyer is redirected to the `redirect_url` you provided when creating the transaction. Do not rely solely on the redirect - either poll the transaction or (recommended) rely on webhooks to detect the final status (for example `capture_succeeded` or failure states).

## Testing

Refer to the [TravelHub docs](https://docs.travel.worldline-solutions.com/payment-methods/payment-product/sofort/overview/) for further guidance on your integration, including detailed testing instructions.
