Respan Dataset Explorer

Select one behavior. Every returned turn has one binary label: Present or Absent. Source: final dense boolean release.

5,167,182physical rows
86shards
0.00%qualified row coverage
0.00%qualified cell coverage
Random row JSON API

turns-00004.parquet:62073

f8c0cf2a63ab933f62fde26b
turn 1/3gpt-3.5-turbo-0301EnglishRussia1302 words
degenerate_repetitionAbsentFinal dense release
USER
I used your code: import time
from binance.client import Client
from binance.enums import *
from binance.exceptions import BinanceAPIException
from binance.helpers import round_step_size
import pandas as pd
import json
import numpy as np
import pytz
import datetime as dt
import ccxt
from decimal import Decimal
import requests
import hmac
import hashlib
import ntplib
import os
from ta import trend, momentum
from ta.trend import SMAIndicator
API_KEY = ''
API_SECRET = ''

client = Client(API_KEY, API_SECRET)

# Set the endpoint and parameters for the request
url = "https://fapi.binance.com/fapi/v2/account"
timestamp = int(time.time() * 1000)
recv_window = 5000

params = {
    "timestamp": timestamp,
    "recvWindow": recv_window
}

# Sign the message using the Client’s secret key
message = '&'.join([f"{k}={v}" for k, v in params.items()])
signature = hmac.new(API_SECRET.encode(), message.encode(), hashlib.sha256).hexdigest()
params['signature'] = signature
leverage = 100

# Send the request using the requests library
response = requests.get(url, params=params, headers={'X-MBX-APIKEY': API_KEY})
account_info = response.json()

# Get the USDT balance and calculate the max trade size based on the leverage
try:
    usdt_balance = next((item for item in account_info['accountBalance'] if item["asset"] == "USDT"), {"free": 0})['free']
except KeyError:
    usdt_balance = 0
    print("Error: Could not retrieve USDT balance from API response.")

max_trade_size = float(usdt_balance) * leverage

# Get the current time and timestamp
now = dt.datetime.now()
date = now.strftime("%m/%d/%Y %H:%M:%S")
print(date)

timestamp = int(time.time() * 1000)

STOP_LOSS_PERCENTAGE = -50
TAKE_PROFIT_PERCENTAGE = 100
MAX_TRADE_QUANTITY_PERCENTAGE = 100
POSITION_SIDE_SHORT = 'SELL'
POSITION_SIDE_LONG = 'BUY'
quantity = 1
symbol = 'BTC/USDT'
order_type = 'market'
leverage = 100
max_trade_quantity_percentage = 1
binance_futures = ccxt.binance({
       'apiKey': API_KEY,
       'secret': API_SECRET,
       'enableRateLimit': True,  # enable rate limitation
       'options': {
           'defaultType': 'future',
           'adjustForTimeDifference': True
       },'future': {
            'sideEffectType': 'MARGIN_BUY', # MARGIN_BUY, AUTO_REPAY, etc…
        }
   })
# Load the market symbols


def sync_time():
    ntp_client = ntplib.NTPClient()
    response = ntp_client.request('pool.ntp.org', version=3)
    now = time.time()
    offset = response.offset
    new_time = now + offset
    # Set the system clock to the new time
    os.system(f'sudo date -s @{int(new_time)}')
    print(f'New time: {dt.datetime.now()}')

recv_window = 10000
params = {
    "timestamp": timestamp,
    "recvWindow": recv_window
}
try:
    markets = binance_futures.load_markets()
except ccxt.BaseError as e:
    print(f'Error fetching markets: {e}')
    markets = []

if symbol in markets:
    print(f"{symbol} found in the market")
else:
    print(f"{symbol} not found in the market")

# Get server time and time difference

def get_server_time(exchange):
    return exchange.fetch_time()

def get_time_difference():
    server_time = get_server_time(binance_futures)
    local_time = int(time.time() * 1000)
    time_difference = local_time - server_time
    return time_difference
time.sleep(1)
def get_klines(symbol, interval, lookback):
    url = "https://fapi.binance.com/fapi/v1/klines"
    end_time = int(time.time() * 1000) # end time is now
    start_time = end_time - (lookback * 60 * 1000) # start time is lookback minutes ago
    symbol = symbol.replace("/", "") # remove slash from symbol
    query_params = f"?symbol={symbol}&interval={interval}&startTime={start_time}&endTime={end_time}"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    response = requests.get(url + query_params, headers=headers)
    response.raise_for_status()
    data = response.json()
    if not data: # if data is empty, return None
        print('No data found for the given timeframe and symbol')
        return None
    ohlc = []
    for d in data:
        timestamp = dt.datetime.fromtimestamp(d[0]/1000).strftime('%Y-%m-%d %H:%M:%S')
        ohlc.append({
            'Open time': timestamp,
            'Open': float(d[1]),
            'High': float(d[2]),
            'Low': float(d[3]),
            'Close': float(d[4]),
            'Volume': float(d[5])
        })
    df = pd.DataFrame(ohlc)
    df.set_index('Open time', inplace=True)
    return df
df = get_klines(symbol, '1m', 44640)

# Define function to generate trading signals
def signal_generator(df):
    indicator_window = 20
    df['SMA'] = SMAIndicator(df['Close'], window=indicator_window).sma_indicator()

    buy = df['SMA'] > df['SMA'].shift(1)
    sell = df['SMA'] < df['SMA'].shift(1)
    return buy, sell
df =  get_klines(symbol, '1m', 44640)

def order_execution(symbol, signal, step_size, leverage, order_type):
    # Set default value for response
    response = {}

    # Close any existing positions
    current_position = None
    positions = binance_futures.fapiPrivateGetPositionRisk()
    for position in positions:
        if position["symbol"] == symbol:
            current_position = position
        if current_position is not None and current_position["positionAmt"] != 0:
            response = binance_futures.fapiPrivatePostOrder(
                symbol=symbol,
                side='SELL' if current_position['positionSide'] == 'LONG' else 'BUY',
                type='MARKET',
                quantity=abs(float(current_position['positionAmt'])),
                positionSide=current_position['positionSide'],
                reduceOnly=True
            )

    if 'orderId' in response:
        print(f'Closed position: {response}')
    else:
        print(f'Error closing position: {response}')
    time.sleep(1)

    # Calculate appropriate order quantity and price based on signal
    opposite_position = None
    quantity = step_size
    position_side = None #initialise to None
    price = None

    # Set default take profit price
    take_profit_price = None
    stop_loss_price = None

    if signal == 'buy':
        position_side = 'BOTH'
        opposite_position = current_position if current_position and current_position['positionSide'] == 'SHORT' else None
        order_type = 'TAKE_PROFIT_MARKET'
        ticker = binance_futures.fetch_ticker(symbol)
        price = 0 # default price
        if 'ask' in ticker:
            price = ticker['ask']
        # perform rounding and other operations on price
        else:
        # handle the case where the key is missing (e.g. raise an exception, skip this signal, etc.)
            take_profit_percentage = TAKE_PROFIT_PERCENTAGE
            stop_loss_percentage = STOP_LOSS_PERCENTAGE

    elif signal == 'sell':
        position_side = 'BOTH'
        opposite_position = current_position if current_position and current_position['positionSide'] == 'LONG' else None
        order_type = 'STOP_MARKET'
        ticker = binance_futures.fetch_ticker(symbol)
        price = 0 # default price
    if 'bid' in ticker:
        price = ticker['bid']
    # perform rounding and other operations on price
    else:
    # handle the case where the key is missing (e.g. raise an exception, skip this signal, etc.)
        take_profit_percentage = TAKE_PROFIT_PERCENTAGE
        stop_loss_percentage = STOP_LOSS_PERCENTAGE

    # Set stop loss price
    stop_loss_price = None
    if price is not None:
        price = round_step_size(price, step_size=step_size)
        if signal == 'buy':
            # Calculate take profit and stop loss prices for a buy signal
            take_profit_price = round_step_size(price * (1 + TAKE_PROFIT_PERCENTAGE / 100), step_size=step_size)
            stop_loss_price = round_step_size(price * (1 - STOP_LOSS_PERCENTAGE / 100), step_size=step_size)
        elif signal == 'sell':
            # Calculate take profit and stop loss prices for a sell signal
            take_profit_price = round_step_size(price * (1 - TAKE_PROFIT_PERCENTAGE / 100), step_size=step_size)
            stop_loss_price = round_step_size(price * (1 + STOP_LOSS_PERCENTAGE / 100), step_size=step_size)


    # Placing new order
    api_method = 'fapiPrivatePostOrder'
    params = {
        'symbol': symbol,
        'side': signal.upper(),
        'type': order_type,
        'quantity': quantity,
        'positionSide': position_side,
        'leverage': leverage,
        'price': price,
        'stopPrice': stop_loss_price,
        'takeProfit': take_profit_price
    }
    response = getattr(binance_futures, api_method)(params=params)
    if 'orderId' in response:
        print(f'Order placed: {response}')
    else:
        print(f'Error placing order: {response}')
    time.sleep(1)
    return response
signal = signal_generator(df)
while True:
    df = get_klines(symbol, '1m', 44640) # await the coroutine function here
    if df is not None:
        signal = signal_generator(df)
    if signal is not None:
        print(f"The signal time is: {dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}:{signal}")
        time.sleep(1)
But I getting ERROR: 2023-05-10 22:59:00    False
                       ...
2023-05-11 07:10:00    False
2023-05-11 07:11:00    False
2023-05-11 07:12:00    False
2023-05-11 07:13:00    False
2023-05-11 07:14:00    False
Name: SMA, Length: 500, dtype: bool)
The signal time is: 2023-06-10 22:55:02:(Open time
2023-05-10 22:56:00    False
2023-05-10 22:57:00    False
2023-05-10 22:58:00    False
2023-05-10 22:59:00    False
2023-05-10 23:00:00    False
                       ...
2023-05-11 07:11:00     True
2023-05-11 07:12:00     True
2023-05-11 07:13:00     True
2023-05-11 07:14:00     True
2023-05-11 07:15:00     True
Name: SMA, Length: 500, dtype: bool, Open time
2023-05-10 22:56:00    False
2023-05-10 22:57:00    False
2023-05-10 22:58:00    False
2023-05-10 22:59:00    False
2023-05-10 23:00:00    False
                       ...
2023-05-11 07:11:00    False
2023-05-11 07:12:00    False
2023-05-11 07:13:00    False
2023-05-11 07:14:00    False
2023-05-11 07:15:00    False
Name: SMA, Length: 500, dtype: bool), but I need to get live signals to buy or sell BTC
ASSISTANT
It looks like the signal generated by the `signal_generator` function is always False, which means that the SMA indicator is not crossing above or below the previous value. You may need to adjust the `indicator_window` parameter in the `signal_generator` function to a smaller or larger value depending on the time frame you are using (1 minute in this case). You can also try using a different technical indicator or a combination of indicators to generate signals.

In addition, you need to call the `order_execution` function with the correct signal (either "buy" or "sell") returned by the `signal_generator` function in order to place an order. You can use a conditional statement to check the signal and call the appropriate function:

```
signal = signal_generator(df)
if signal[0]:
    order_execution(symbol, "buy", step_size, leverage, order_type)
elif signal[1]:
    order_execution(symbol, "sell", step_size, leverage, order_type)
```

This code will check if the first element of the `signal` tuple is True, which means that the SMA indicator crossed above the previous value and generates a "buy" signal. If the second element of the `signal` tuple is True, which means that the SMA indicator crossed below the previous value and generates a "sell" signal. It then calls the `order_execution` function with the appropriate signal.

turns-00004.parquet:62074

14e5c14649c82132ede92081
turn 2/3gpt-3.5-turbo-0301EnglishRussia136 words
degenerate_repetitionAbsentFinal dense release
USER
What I need to change in signal_generator ?
ASSISTANT
In the `signal_generator` function, you can try adjusting the `indicator_window` parameter to see if it improves the accuracy of the signals. You can try increasing or decreasing it to see which value works best for the time frame you are using.

For example, if you are using a 1-minute time frame, you can try using a smaller value like 5 or 10 for `indicator_window`. This will calculate the SMA indicator based on the last 5 or 10 minutes of data, which may generate more accurate signals in a faster-moving market.

On the other hand, if you are using a longer time frame like 1 hour or 4 hours, you may need to use a larger value like 20, 50, or 100 for `indicator_window` to generate more reliable signals.

turns-00004.parquet:62075

310834018cee8073715f9bf7
turn 3/3gpt-3.5-turbo-0301EnglishRussia393 words
degenerate_repetitionAbsentFinal dense release
USER
Give me only code
ASSISTANT
Here is an updated code that should generate buy or sell signals based on the SMA indicator and place orders accordingly:

```
import time
from binance.client import Client
from binance.enums import *
from binance.exceptions import BinanceAPIException
from binance.helpers import round_step_size
import pandas as pd
import json
import numpy as np
import pytz
import datetime as dt
import ccxt
from decimal import Decimal
import requests
import hmac
import hashlib
import ntplib
import os
from ta import trend, momentum
from ta.trend import SMAIndicator

API_KEY = ''
API_SECRET = ''
symbol = 'BTC/USDT'
leverage = 100
step_size = 0.01
order_type = 'MARKET'

client = Client(API_KEY, API_SECRET)

# Set the endpoint and parameters for the request
url = "https://fapi.binance.com/fapi/v2/account"
timestamp = int(time.time() * 1000)
recv_window = 5000

params = {
    "timestamp": timestamp,
    "recvWindow": recv_window
}

# Sign the message using the Client’s secret key
message = '&'.join([f"{k}={v}" for k, v in params.items()])
signature = hmac.new(API_SECRET.encode(), message.encode(), hashlib.sha256).hexdigest()
params['signature'] = signature

# Send the request using the requests library
response = requests.get(url, params=params, headers={'X-MBX-APIKEY': API_KEY})
account_info = response.json()

# Get the USDT balance and calculate the max trade size based on the leverage
try:
    usdt_balance = next((item for item in account_info['accountBalance'] if item["asset"] == "USDT"), {"free": 0})['free']
except KeyError:
    usdt_balance = 0
    print("Error: Could not retrieve USDT balance from API response.")

max_trade_size = float(usdt_balance) * leverage

# Get the current time and timestamp
now = dt.datetime.now()
date = now.strftime("%m/%d/%Y %H:%M:%S")
print(date)

timestamp = int(time.time() * 1000)

STOP_LOSS_PERCENTAGE = -50
TAKE_PROFIT_PERCENTAGE = 100
MAX_TRADE_QUANTITY_PERCENTAGE = 100
POSITION_SIDE_SHORT = 'SELL'
POSITION_SIDE_LONG = 'BUY'
quantity = 1

binance_futures = ccxt.binance({
    'apiKey': API_KEY,
    'secret': API_SECRET,
    'enableRateLimit': True,
    'options': {
        'defaultType': 'future',
        'adjustForTimeDifference': True
    },
    'future': {
        'sideEffectType': 'MARGIN_BUY',
    }
})

# Load the market symbols
try:
    markets = binance_futures.load_markets()
except ccxt.BaseError as e:
    print(f'Error fetching markets: {e}')
    markets = []

if symbol in markets:
    print(f"{symbol} found in the market")
else:
    print(f"{symbol} not found in the market")

# Helper functions
def sync_time():
    ntp_client = ntplib.NTPClient()
    response = ntp_client.request('pool.ntp.org', version=3)
    now = time.time()
    offset = response.offset
    new_time = now + offset
    # Set the system clock to the new time
    os.system(f'sudo date -s @{int(new_time)}')
    print(f'New time: {dt.datetime.now()}')

def get_server_time(exchange):
    return exchange.fetch_time()

def get_time_difference():
    server_time = get_server_time(binance_futures)
    local_time = int(time.time() * 1000)
    time_difference = local_time - server_time
    return time_difference

def get_klines(symbol, interval, lookback):
    url = "https://fapi.binance.com/fapi/v1/klines"
    end_time = int(time.time() * 1000

turns-00004.parquet:62076

e4771b7bc0d362ebbb1a4cd7
turn 1/2gpt-3.5-turbo-0301SpanishSpain116 words
degenerate_repetitionAbsentFinal dense release
USER
Dime que loops debo utilizar en garage band parah
ASSISTANT
crear música hip hop.

Para crear música hip hop en GarageBand, podrías utilizar los siguientes loops y sonidos:

1. Baterías: Hip Hop Kit, Boom Bap Kit, Classic Hip Hop Kit.

2. Bajos: Deep Hip Hop Bass, Dirty Bass, Fat Bass, 808 Bass.

3. Teclados: Rhodes Electric Piano, Wurly Electric Piano, Hammond Organ, Synth Leads.

4. Cuerdas: Strings, Synth Strings, Pad.

5. Voces: Rap Vocals, Ad Libs, Chops.

6. Efectos: Scratch, Risers, Impacts, Vinyl Noise.

Estos loops pueden ser combinados de diferentes formas y tempos para crear un ritmo de hip hop. También puedes añadir tus propias pistas de voz e instrumentos para personalizar aún más tu canción.

turns-00004.parquet:62077

2673ac2b0db5f14e33ee9118
turn 2/2gpt-3.5-turbo-0301SpanishSpain115 words
degenerate_repetitionAbsentFinal dense release
USER
Haz una letra para un himno moderno del Lucentum Hockey hierba club (equipo de Alicante) 
ASSISTANT
CORO:
Unidos en la cancha,
juntos a por la gloria,
somos el Lucentum,
¡vamos a hacer historia!

VERSOS:
Desde Alicante salimos,
a enfrentarnos sin temor,
nuestro equipo decidido,
dando todo su valor.

Camisetas en verde y blanco,
nuestro uniforme de honor,
en cada partido entregamos,
todo nuestro corazón.

Hockey hierba es nuestra pasión,
en cada jugada se nota,
disfrutamos con emoción,
cada momento en la pelota.

Juntos formamos una familia,
con nuestros compañeros y amigos,
luchando por la victoria,
y hoy estamos unidos.

CORO:
Unidos en la cancha,
juntos a por la gloria,
somos el Lucentum,
¡vamos a hacer historia!

turns-00004.parquet:62078

dff234d6f18f48dff9d6b148
turn 1/2gpt-3.5-turbo-0301EnglishHong Kong171 words
degenerate_repetitionAbsentFinal dense release
USER
Is squarespace good?
ASSISTANT
As an AI language model, I don't have personal opinions but here are some key benefits of Squarespace:

Squarespace is an all-in-one website builder that offers beautifully designed templates, a drag-and-drop builder, and a range of features to help you build a professional website or online store quickly and easily. Some key benefits include:

1. Easy-to-use: Squarespace is known for being user-friendly and easy to navigate, with a clean and intuitive interface.

2. Beautiful templates: Squarespace offers a wide range of professionally designed templates that are fully customizable to fit your branding and style.

3. eCommerce functionality: Squarespace has all the features you need to create an online store, including inventory management, payment processing, and shipping options.

4. SEO-friendly: Squarespace has built-in SEO features that help you optimize your website for search engines.

5. Mobile-friendly: All Squarespace websites are fully responsive, meaning they look great on any device.

Overall, Squarespace is a great option for anyone looking to build a professional website or online store with minimal fuss.

turns-00004.parquet:62079

0f65481120fdb57d0f45d6b8
turn 2/2gpt-3.5-turbo-0301EnglishHong Kong154 words
degenerate_repetitionAbsentFinal dense release
USER
It there any ai that helps people to create portfolio website
ASSISTANT
Yes, there are many AI-powered website builders, such as Wix, Adobe Portfolio, and GoDaddy Website Builder that can help people create portfolio websites easily and quickly. These website builders use AI technology to automatically generate layouts and designs based on the user's preferences and content.

For example, Wix uses an AI-powered tool called Wix ADI (Artificial Design Intelligence) that asks a series of questions to create a custom design for your website based on your answers. Adobe Portfolio uses AI technology to automatically arrange photos in a visually appealing layout.

GoDaddy Website Builder, on the other hand, has an AI-powered feature called GoDaddy Insights that analyzes your website's performance and provides suggestions for improvements.

Using an AI-powered website builder can save time and streamline the process of creating a portfolio website, especially for those who are not familiar with coding or web design.

turns-00004.parquet:62080

63c71e2e296ef19346f8e4fb
turn 1/3gpt-3.5-turbo-0301PolishPoland69 words
degenerate_repetitionAbsentFinal dense release
USER
Czy można się nauczyć nagielskiego w kazdym wieku
ASSISTANT
Tak, można się nauczyć angielskiego w każdym wieku. Istnieją różne metody i techniki nauki języka angielskiego, które są dostosowane do różnych poziomów umiejętności oraz indywidualnych stylów uczenia się. Ważne jest skupienie się na regularnej praktyce i konsekwencji w nauce. Istotnym czynnikiem przy nauce języka jest także motywacja i chęć do nauki. Dlatego też, niezależnie od wieku, każdy może nauczyć się angielskiego.

turns-00004.parquet:62081

5b51616d4961bd3b31697697
turn 2/3gpt-3.5-turbo-0301PolishPoland231 words
degenerate_repetitionAbsentFinal dense release
USER
pod sposoby nauki
ASSISTANT
Oto kilka sposobów nauki języka angielskiego:

1. Kursy językowe - istnieje wiele kursów językowych, oferowanych zarówno online, jak i w tradycyjnej formie w szkołach językowych. Kursy prowadzone przez nauczycieli, którzy są ekspertami w nauce angielskiego, często są skuteczne i dostarczają strukturalnej wiedzy i umiejętności w zakresie gramatyki, słownictwa, czytania, pisania i mówienia.

2. Aplikacje do nauki języka - istnieje wiele aplikacji, które mogą pomóc w nauce angielskiego, takich jak Duolingo, Babbel, czy Drops. Dzięki nim można rozwijać umiejętności językowe zarówno na poziomie podstawowym, jak i zaawansowanym.

3. Książki i materiały edukacyjne - istnieją również liczne książki, płyty CD oraz materiały edukacyjne, takie jak filmy, podcasty, czy artykuły, które mogą pomóc w nauce angielskiego. Warto wybrać te, które odpowiadają naszym zainteresowaniom, aby nauka była bardziej interesująca i angażująca.

4. Praktyka w życiu codziennym - codzienne stosowanie języka angielskiego, czy to rozmawiając z anglojęzycznymi ludźmi, czy oglądając filmy i seriale w języku angielskim, jest kluczowe dla rozwijania umiejętności językowych i przyzwyczajanie się do jego używania.

5. Naucz się przez zabawę - liczne gry, quizy i piosenki, które są dostępne na YouTube czy w aplikacjach, są interesującą i zabawną metodą nauki angielskiego. Dzięki nim nauka staje się przyjemna i pozytywnie wpływa na naszą motywację. 

6. Konwersacje - rozmowy z native speakerami lub regularne uczestnictwo w grupach konwersacyjnych są świetną okazją do praktykowania języka angielskiego, zdobycia nowych słów i poprawy umiejętności językowych.

turns-00004.parquet:62082

18604177ea03cc70222a4001
turn 3/3gpt-3.5-turbo-0301PolishPoland242 words
degenerate_repetitionAbsentFinal dense release
USER
stratega marketingowa dla małej firmy serwisujacej komputery
ASSISTANT
1. Określ grupę docelową - Zanim podejmiesz jakiekolwiek działania marketingowe, musisz określić swoją grupę docelową. Dostosuj swoją strategię do potrzeb ludzi, którzy skorzystają z Twoich usług. Czy budujesz relacje z lokalnymi firmami, czy też pracujesz bezpośrednio z konsumentami?

2. Twórz wartościowe treści - W dzisiejszym świecie, w którym klienci mają dostęp do ogromnej ilości informacji, musisz przyciągnąć ich uwagę. Stwórz wartościowe treści w postaci bloga, poradników, tutoriali, które pomogą Twoim klientom w codziennych problemach z komputerami.

3. Skorzystaj z mediów społecznościowych - Skorzystaj z mediów społecznościowych, aby dotrzeć do swojej grupy docelowej. Utwórz profile na popularnych platformach, takich jak Facebook, Twitter, YouTube, Instagram i LinkedIn i twórz regularnie nowe treści, aby zainteresować i zaangażować swoją społeczność.

4. Stwórz witrynę internetową - Witryna internetowa to podstawa podczas prowadzenia biznesu w Internecie. Twoja strona musi być atrakcyjna, intuicyjna w obsłudze i wyposażona w narzędzia, które pozwolą klientom na skorzystanie z Twoich usług.

5. Światło reklamowe - Inwestycja w reklamę w Internecie, taką jak Google Ads lub Facebook Ads, może pomóc Ci w zwiększeniu widoczności Twojego biznesu. Dokładnie określ, kto jest Twoim klientem i jakie hasła kluczowe mają wpisywać, aby znaleźć Twój biznes.

6. Stwórz program lojalnościowy - Stworzenie programu lojalnościowego dla Twojej bazy klientów to dobry sposób, aby zachęcić ich do korzystania z usług Twojej firmy. Dzięki programowi lojalnościowemu klienci mogą zbierać punkty lub zniżki za każde skorzystanie z Twoich usług, a następnie wymienić je na nagrody.