Promoteur is a Web3 promotion tool that was developed during the ETHGlobal Paris hackathon. It utilizes various Web3 technologies, such as Airstack and XMTP to provide targeted marketing based on NFT and POAP ownership. The possibilities are limitless and the tool will be expanded rapidly in the near future.
- Login with your wallet.
- Create a new promotion. Filter XMTP users based on their NFT and POAP ownership.
- Send a message with a customized link to any number of wallets that pass the filter.
- The recipients will receive the XMTP message together with a link, if provided.
- You can view on the Promoteur dashboard how many people clicked the link.
Frontend built with React, utilizing the XMTP JavaScript SDK playground and the Airstack Web SDK.
- The powerful Airstack API is used to fetch wallet addresses of users that own specific NFTs or POAPs. In a subsequent query, the list of wallets is then filtered to contain only wallets of XMTP users.
- The innovative XMTP messaging protocol is used to deliver promotion messages to the users of the aforementioned wallets. The promotion messages may contain a promotional link to any website, and the clicks are tracked using the custom-built backend server.
Backend built with Python (Flask), Docker and PostgreSQL. It's used by the frontend to create new promotions and as a relay server to track clicks on promotion links.
Everything can be run locally using the instructions below.
npm install
Before running the frontend server, you must create a .env
file to the root of the repository with the VITE_AIRSTACK_API_KEY=<YOUR-AIRSTACK-API-KEY>
variable defined. Then proceed to run the dev server:
npm run dev
Open http://localhost:5173 in your browser to access the Promoteur website.
First install all required python packages:
pip3 install -r requirements.txt
Then start the database. The script will run PostgreSQL 15 in a docker container.
./scripts/dbrun.sh
Init the database tables:
python3 scripts/dbinit.py
Run the backend server:
python3 backend/server.py
Your backend should now be up and running and ready to communicate with the frontend.