PHPackages                             bored-programmers/laravel-wolt - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. bored-programmers/laravel-wolt

ActiveLibrary[API Development](/categories/api)

bored-programmers/laravel-wolt
==============================

Wolt is a Laravel package that allows you to integrate your restaurant with the Wolt platform. It provides a simple and easy-to-use API for syncing your menu and managing orders.

v1.1.7(4mo ago)144MITPHPPHP &gt;=8.1

Since Aug 14Pushed 4mo agoCompare

[ Source](https://github.com/Bored-Programmers/laravel-wolt)[ Packagist](https://packagist.org/packages/bored-programmers/laravel-wolt)[ RSS](/packages/bored-programmers-laravel-wolt/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (2)Versions (14)Used By (0)

Laravel Wolt API Integration
============================

[](#laravel-wolt-api-integration)

[![Wolt Logo](./resources/assets/img/logo.webp)](./resources/assets/img/logo.webp)

[![Latest Stable Version](https://camo.githubusercontent.com/cb80d01645e25389fe5a79a0cffb5c153fbabbf92e01d7653446324db32dd26e/68747470733a2f2f706f7365722e707567782e6f72672f626f7265642d70726f6772616d6d6572732f776f6c742f76)](//packagist.org/packages/bored-programmers/wolt)[![Total Downloads](https://camo.githubusercontent.com/ff01262a71c9f1377bab59a6bc8812d21d7db08eda2a54a47b1e2c3990f08279/68747470733a2f2f706f7365722e707567782e6f72672f626f7265642d70726f6772616d6d6572732f776f6c742f646f776e6c6f616473)](//packagist.org/packages/bored-programmers/wolt)[![License](https://camo.githubusercontent.com/40672a6ee5173d17ce868ed708d378463d6fb9fb6ba94cc2dfa438a16c8ddbac/68747470733a2f2f706f7365722e707567782e6f72672f626f7265642d70726f6772616d6d6572732f776f6c742f6c6963656e7365)](//packagist.org/packages/bored-programmers/wolt)

Wolt is a Laravel package that allows you to integrate your restaurant with the Wolt platform. It provides a simple and easy-to-use API for syncing your menu and managing orders.

Table of Contents
-----------------

[](#table-of-contents)

- [Requirements](#requirements)
- [Installation](#installation)
- [Usage](#usage)
    - [Sync Menu](#sync-menu)
    - [Get Order](#get-order)
    - [Accept Order](#accept-order)
    - [Reject Order](#reject-order)
    - [Mark Order as Ready](#mark-order-as-ready)
    - [Mark Order as Delivered](#mark-order-as-delivered)
    - [Confirm Preorder](#confirm-preorder)
- [Contribution Guidelines](#contribution-guidelines)
- [Changelog](#changelog)
- [License](#license)
- [Contact Information](#contact-information)
- [Acknowledgments](#acknowledgments)

Requirements
------------

[](#requirements)

- PHP 8.1 or higher
- Laravel 10.0 or higher

Installation
------------

[](#installation)

To install Wolt, you need to run the following command:

```
composer require bored-programmers/laravel-wolt
```

Publish the configuration file and set up your environment variables.

```
php artisan vendor:publish --tag=wolt-config
```

Update your `.env` file with the following variables:

```
WOLT_MENU_API_USERNAME=your_menu_api_username
WOLT_MENU_API_PASSWORD=your_menu_api_password
WOLT_ORDER_API_KEY=your_order_api_key
WOLT_VENUE_ID=your_venue_id
WOLT_IS_SANDBOX=true/false
```

Usage
-----

[](#usage)

### Sync Menu

[](#sync-menu)

To sync your menu with Wolt, use the `WoltService::syncMenu` method.
Here is an example of how you can use the DTOs to create a menu and sync it with Wolt.

```
use BoredProgrammers\Wolt\DTO\MenuData;
use BoredProgrammers\Wolt\DTO\CategoryData;
use BoredProgrammers\Wolt\DTO\SubcategoryData;
use BoredProgrammers\Wolt\DTO\ItemData;
use BoredProgrammers\Wolt\DTO\TranslationData;
use BoredProgrammers\Wolt\DTO\CaffeineContentData;
use BoredProgrammers\Wolt\DTO\WeeklyAvailabilityData;
use BoredProgrammers\Wolt\DTO\WeeklyVisibilityData;
use BoredProgrammers\Wolt\DTO\OptionData;
use BoredProgrammers\Wolt\DTO\SelectionRangeData;
use BoredProgrammers\Wolt\DTO\OptionValueData;
use BoredProgrammers\Wolt\DTO\SubOptionValueData;
use BoredProgrammers\Wolt\DTO\ProductInformationData;
use BoredProgrammers\Wolt\DTO\NutritionInformationData;
use BoredProgrammers\Wolt\DTO\NutritionValuesData;
use BoredProgrammers\Wolt\DTO\NutrientData;
use Spatie\LaravelData\DataCollection;

// Example Translations for Category
$categoryNameTranslation = new DataCollection([
    TranslationData::from(['lang' => 'en', 'value' => 'Beverages']),
    TranslationData::from(['lang' => 'fr', 'value' => 'Boissons'])
]);

// Example Translations for Subcategory
$subCategoryNameTranslation = new DataCollection([
    TranslationData::from(['lang' => 'en', 'value' => 'Hot Drinks']),
    TranslationData::from(['lang' => 'fr', 'value' => 'Boissons Chaudes'])
]);

// Example Translations for Item
$itemNameTranslation = new DataCollection([
    TranslationData::from(['lang' => 'en', 'value' => 'Espresso']),
    TranslationData::from(['lang' => 'fr', 'value' => 'Espresso'])
]);

$itemDescriptionTranslation = new DataCollection([
    TranslationData::from(['lang' => 'en', 'value' => 'Rich and bold espresso coffee']),
    TranslationData::from(['lang' => 'fr', 'value' => 'Café espresso riche et audacieux'])
]);

// Example Translations for Options
$optionNameTranslation = new DataCollection([
    TranslationData::from(['lang' => 'en', 'value' => 'Milk Type']),
    TranslationData::from(['lang' => 'fr', 'value' => 'Type de Lait'])
]);

$optionValueNameTranslation1 = new DataCollection([
    TranslationData::from(['lang' => 'en', 'value' => 'Whole Milk']),
    TranslationData::from(['lang' => 'fr', 'value' => 'Lait entier'])
]);

$optionValueNameTranslation2 = new DataCollection([
    TranslationData::from(['lang' => 'en', 'value' => 'Soy Milk']),
    TranslationData::from(['lang' => 'fr', 'value' => 'Lait de soja'])
]);

// Example Sub-option Value
$subOptionValueNameTranslation = new DataCollection([
    TranslationData::from(['lang' => 'en', 'value' => 'Vanilla Syrup']),
    TranslationData::from(['lang' => 'fr', 'value' => 'Sirop de vanille'])
]);

// Example Nutrition Information
$nutritionInformation = NutritionInformationData::from([
    'serving_size' => 'per_100_ml',
    'nutrition_values' => NutritionValuesData::from([
        'energy_kcal' => NutrientData::from(['unit' => 'kcal', 'value' => 5]),
        'energy_kj' => NutrientData::from(['unit' => 'kj', 'value' => 20]),
        'fats' => NutrientData::from(['unit' => 'g', 'value' => 0.1]),
        'saturated_fats' => NutrientData::from(['unit' => 'g', 'value' => 0.05]),
        'mono_unsaturated_fats' => NutrientData::from(['unit' => 'g', 'value' => 0.01]),
        'poly_unsaturated_fats' => NutrientData::from(['unit' => 'g', 'value' => 0.01]),
        'carbohydrate' => NutrientData::from(['unit' => 'g', 'value' => 0.5]),
        'sugar' => NutrientData::from(['unit' => 'g', 'value' => 0.1]),
        'starch' => NutrientData::from(['unit' => 'g', 'value' => 0.2]),
        'polyols' => NutrientData::from(['unit' => 'g', 'value' => 0.0]),
        'protein' => NutrientData::from(['unit' => 'g', 'value' => 0.2]),
        'salt' => NutrientData::from(['unit' => 'g', 'value' => 0.01]),
        'sodium' => NutrientData::from(['unit' => 'mg', 'value' => 5]),
        'fibres' => NutrientData::from(['unit' => 'g', 'value' => 0.1]),
        'vitamin_c' => NutrientData::from(['unit' => 'mg', 'value' => 0.0]),
        'potassium' => NutrientData::from(['unit' => 'mg', 'value' => 80]),
        'calcium' => NutrientData::from(['unit' => 'mg', 'value' => 10]),
        'magnesium' => NutrientData::from(['unit' => 'mg', 'value' => 2]),
        'chloride' => NutrientData::from(['unit' => 'mg', 'value' => 5]),
        'fluoride' => NutrientData::from(['unit' => 'mg', 'value' => 0.0])
    ])
]);

// Example Product Information
$productInformation = ProductInformationData::from([
    'ingredients' => new DataCollection([
        TranslationData::from(['lang' => 'en', 'value' => 'Water, Coffee Beans']),
        TranslationData::from(['lang' => 'fr', 'value' => 'Eau, Grains de café'])
    ]),
    'additives' => new DataCollection([
        TranslationData::from(['lang' => 'en', 'value' => 'None']),
        TranslationData::from(['lang' => 'fr', 'value' => 'Aucun'])
    ]),
    'nutrition_facts' => new DataCollection([
        TranslationData::from(['lang' => 'en', 'value' => 'Low calories']),
        TranslationData::from(['lang' => 'fr', 'value' => 'Faible en calories'])
    ]),
    'nutrition_information' => $nutritionInformation,
    'allergens' => new DataCollection([
        TranslationData::from(['lang' => 'en', 'value' => 'None']),
        TranslationData::from(['lang' => 'fr', 'value' => 'Aucun'])
    ]),
    'producer_information' => new DataCollection([
        TranslationData::from(['lang' => 'en', 'value' => 'Local Roastery']),
        TranslationData::from(['lang' => 'fr', 'value' => 'Torréfacteur local'])
    ])
]);

// Example Option with Sub-option Values
$optionValue1 = OptionValueData::from([
    'name' => $optionValueNameTranslation1,
    'selection_range' => SelectionRangeData::from(['min' => 0, 'max' => 1]),
    'price' => 0.50,
    'enabled' => true,
    'default' => true,
    'external_data' => 'option-value-1',
    'sub_option_values' => new DataCollection([
        SubOptionValueData::from([
            'name' => $subOptionValueNameTranslation,
            'selection_range' => SelectionRangeData::from(['min' => 0, 'max' => 1]),
            'price' => 0.20,
            'enabled' => true,
            'default' => false,
            'external_data' => 'sub-option-value-1'
        ])
    ])
]);

$optionValue2 = OptionValueData::from([
    'name' => $optionValueNameTranslation2,
    'selection_range' => SelectionRangeData::from(['min' => 0, 'max' => 1]),
    'price' => 0.60,
    'enabled' => true,
    'default' => false,
    'external_data' => 'option-value-2',
    'sub_option_values' => null
]);

$option = OptionData::from([
    'name' => $optionNameTranslation,
    'type' => 'SingleChoice',
    'selection_range' => SelectionRangeData::from(['min' => 1, 'max' => 1]),
    'external_data' => 'option-1',
    'values' => new DataCollection([$optionValue1, $optionValue2])
]);

// Example Item
$item = ItemData::from([
    'name' => $itemNameTranslation,
    'description' => $itemDescriptionTranslation,
    'image_url' => 'https://example.com/espresso.jpg',
    'price' => 2.99,
    'sales_tax_percentage' => 0.07,
    'alcohol_percentage' => null,
    'caffeine_content' => CaffeineContentData::from(['serving_size' => 'per_100_ml', 'value' => 212.0]),
    'weekly_availability' => new DataCollection([
        WeeklyAvailabilityData::from([
            'opening_day' => 'MONDAY',
            'opening_time' => '08:00',
            'closing_day' => 'MONDAY',
            'closing_time' => '20:00'
        ])
    ]),
    'weekly_visibility' => new DataCollection([
        WeeklyVisibilityData::from([
            'opening_day' => 'MONDAY',
            'opening_time' => '08:00',
            'closing_day' => 'MONDAY',
            'closing_time' => '20:00'
        ])
    ]),
    'enabled' => true,
    'delivery_methods' => ['takeaway', 'homedelivery'],
    'options' => new DataCollection([$option]),
    'external_data' => 'item-espresso-001',
    'product_information' => $productInformation
]);

// Example Subcategory
$subcategory = SubcategoryData::from([
    'name' => $subCategoryNameTranslation,
    'description' => null,
    'items' => new DataCollection([$item])
]);

// Example Category
$category = CategoryData::from([
    'name' => $categoryNameTranslation,
    'description' => null,
    'subcategories' => new DataCollection([$subcategory])
]);

// Example Menu
$menu = MenuData::from([
    'currency' => 'USD',
    'primary_language' => 'en',
    'categories' => new DataCollection([$category])
]);

$response = WoltService::syncMenu($menuData);
```

### Get Order

[](#get-order)

To retrieve an order, use the `WoltService::getOrder` method.

> You will get Order ID from your webhook called by Wolt.
> More about it &gt; here: [Wolt Webhook Documentation](https://developer.development.dev.woltapi.com/docs/marketplace-integrations/restaurant-ipad-free#webhook-server).

> I recommend using `spatie/laravel-webhook-client` package for handling webhooks.

```
use BoredProgrammers\Wolt\WoltService;

$orderId = 'your_wolt_order_id';
$response = WoltService::getOrder($orderId);
```

### Accept Order

[](#accept-order)

To accept an order, use the `WoltService::acceptOrder` method.

```
use BoredProgrammers\Wolt\WoltService;

$orderId = 'your_wolt_order_id';
$response = WoltService::acceptOrder($orderId);
```

### Reject Order

[](#reject-order)

To reject an order, use the `WoltService::rejectOrder` method.

```
use BoredProgrammers\Wolt\WoltService;

$orderId = 'your_wolt_order_id';
$response = WoltService::rejectOrder($orderId);
```

### Mark Order as Ready

[](#mark-order-as-ready)

To mark an order as ready, use the `WoltService::markReadyOrder` method.

```
use BoredProgrammers\Wolt\WoltService;

$orderId = 'your_wolt_order_id';
$response = WoltService::markReadyOrder($orderId);
```

### Mark Order as Delivered

[](#mark-order-as-delivered)

To mark an order as delivered, use the `WoltService::markDeliveredOrder` method.

```
use BoredProgrammers\Wolt\WoltService;

$orderId = 'your_wolt_order_id';
$response = WoltService::markDeliveredOrder($orderId);
```

### Confirm Preorder

[](#confirm-preorder)

To confirm a preorder, use the `WoltService::confirmPreorder` method.

```
use BoredProgrammers\Wolt\WoltService;

$orderId = 'your_wolt_order_id';
$response = WoltService::confirmPreorder($orderId);
```

Contribution Guidelines
-----------------------

[](#contribution-guidelines)

We welcome contributions to Wolt. If you'd like to contribute, please fork the repository, make your changes, and submit a pull request. We have a few requirements for contributions:

- Follow the PSR-2 coding standard.
- Only use pull requests for contributions.

Changelog
---------

[](#changelog)

For a detailed history of changes, see [releases](https://github.com/Bored-Programmers/wolt/releases) on GitHub.

License
-------

[](#license)

This project is licensed under the [MIT license](/LICENSE.md).

Contact Information
-------------------

[](#contact-information)

For any questions or concerns, please feel free to create a [discussion](https://github.com/Bored-Programmers/wolt/discussions) on GitHub.

Credits
-------

[](#credits)

Created by [Matěj Černý](https://github.com/LeMatosDeFuk)from [Bored Programmers](https://github.com/Bored-Programmers).

Acknowledgments
---------------

[](#acknowledgments)

We would like to thank all the contributors who have helped to make Wolt a better package.

###  Health Score

40

—

FairBetter than 88% of packages

Maintenance78

Regular maintenance activity

Popularity10

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity56

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~43 days

Recently: every ~129 days

Total

13

Last Release

123d ago

PHP version history (2 changes)v1.0.0PHP ^8.1|^8.2|^8.3

v1.0.1PHP &gt;=8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/e7383a3630c17f193886f833a3f5ba617d172ae0cb203c75aeaca6a82cc94320?d=identicon)[LeMatosDeFuk](/maintainers/LeMatosDeFuk)

---

Top Contributors

[![LeMatosDeFuk](https://avatars.githubusercontent.com/u/45625770?v=4)](https://github.com/LeMatosDeFuk "LeMatosDeFuk (26 commits)")

---

Tags

apilaravelmenuintegrationordersdeliveryrestaurantwolt

### Embed Badge

![Health badge](/badges/bored-programmers-laravel-wolt/health.svg)

```
[![Health](https://phpackages.com/badges/bored-programmers-laravel-wolt/health.svg)](https://phpackages.com/packages/bored-programmers-laravel-wolt)
```

###  Alternatives

[darkaonline/l5-swagger

OpenApi or Swagger integration to Laravel

2.9k34.0M112](/packages/darkaonline-l5-swagger)[knuckleswtf/scribe

Generate API documentation for humans from your Laravel codebase.✍

2.3k12.2M45](/packages/knuckleswtf-scribe)[lasserafn/laravel-economic

Economic REST wrapper for Laravel

1118.5k](/packages/lasserafn-laravel-economic)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
