Posts
How to Keep Your Customers Happy & Increase Repeat Project - 2Sales

How to Keep Your Customers Happy & Increase Repeat Project - 2Sales
Here is part one of How to Keep Your Customers Happy & Increase Repeat Project
9. Know your products and services
Customers want to work with knowledgeable employees. Learn all you can about your products so you can be better equipped to answer customer questions. If you are unsure about something, ask for help.
10. Treat your customers individually
Not all customers are the same. Every customer has individual needs and concerns and they want to be treated with a personal touch that doesn’t make them feel like a number. Communicate the way your customers want to communicate.
11. Make it easy for your customers to complain
Your customers seem to have heard, especially when they are frustrated with the service they have received. Customers know what they like and at least about your service. Ongoing surveys are a reliable and consistent approach to getting feedback but don’t miss the opportunity when you’re with a customer. Just asking you sends a beautiful message about how you value your customers and their feedback.
12. Thank your customers for every opportunity you get
Thank you very much for your customers. Thank you for calling, bringing payment, meeting you at their home, calling for help, and yes, calling for a complaint! For many, there are options available and they chose your company over the competition.
13. Never accept your customers
Your customers are your business!
14. To be active
Don't wait for your client to reach you. Reach out to them in more than one way. Improving the first call resolution cases of the customer problem will improve the overall customer experience. Create a complete self-help interface, in which customers can solve their problems manually.
15. I will take responsibility
Tell your customer that you understand that you have a responsibility to ensure a satisfactory outcome of the transaction. Assure the customer that you know what she expects and will deliver the product or service at the agreed price. There will be no unexpected charges or costs to solve the problem.
How to Create Dripping Effect in PhotoshopDesign

How to Create Dripping Effect in PhotoshopDesign
Step:1 Create a new artboard
Step:2 Select Add a layer style
Step:3 Set Image In artboard
Step:4 Crop as a requirement
Step:5 Select Refine edge
Step:6 Add Drip image
Step:7 Add Brush Style
Step:8 Add Effect as per your Requirement
Setup Laravel Livewire with Basic Component ExampleLaravel

Setup Laravel Livewire with Basic Component ExampleLaravel
composer require livewire/livewire
... @livewireStyles </head> <body> ... @livewireScripts </body> </html>
php artisan make:livewire Summation
// app/Http/Livewire/Summation/php namespace App\Http\Livewire; use Livewire\Component; class Summation extends Component { public function render() { return view('livewire.summation'); } } // resources/views/livewire/summation.blade.php <div> ... </div>
<head> ... @livewireStyles </head> <body> <livewire:summation /> ... @livewireScripts </body> </html>
namespace App\Http\Livewire; use Livewire\Component; class Summation extends Component { public $value1 = 0; public $value2 = 0; public $sum = 0; public function mount() { $this->sum = 0; } public function render() { $this->sum = $this->value1 + $this->value2; return view('livewire.summation'); } }
<div> <input type="text" class="" wire:model="value1"> <input type="text" class="" wire:model="value2"> <input type="text" disabled wire:model="sum"> </div>
Company Culture:“It’s the backbone of any Successful Organisation”Human Resource

Company Culture:“It’s the backbone of any Successful Organisation”Human Resource
Organisational Culture is an aspect that impacts every organization’s functioning. Keeping in view the vital role that plays in the success of any Organisation. I would like to mention the desired culture is the “OCTAPACE” Culture.
“OCTAPACE” culture is the best initiative for any Organisation, whether it’s an IT or Non-IT organization.
Let’s look at- what is “OCTAPACE” culture? How will it be helpful to Organisational Growth?
OCTAPACE | Meaning | Outcome |
---|---|---|
O - Openness |
|
|
C - Confrontation |
|
|
T - Trust |
|
|
A - Authenticity |
|
|
P- Pro-Active |
|
|
A- Autonomy |
|
|
C- Collaboration |
|
|
E-Experimentation |
|
|
To recapitulate, Organisational culture represents Values, Beliefs, behaviors & Capabilities acquired by the members of the firm. We can truly say if the Organisation has all Dimensions of “OCTAPACE”, it is on the way to SUCCESS……….
Facebook Login With Firebase In Android JavaAndroid Development

Facebook Login With Firebase In Android JavaAndroid Development
- This library user for firebase integration dependencies
{ implementation 'com.google.firebase:firebase-auth:19.4.0' }
- This permission use internet connection checking
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
<com.facebook.login.widget.LoginButton android:id="@+id/login_button" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:visibility="gone" />
- This permission user for user data get. Without this permission user data not meet
“loginButton” This button is Facebook button
- LoginManager.getInstance().logInWithReadPermissions(FacebookLoginActivity.this, Arrays.asList("email", "public_profile"));
- loginButton.setReadPermissions("email", "public_profile");
void initializeAuthentication(){ FirebaseAuth mAuth = FirebaseAuth.getInstance(); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); mGoogleSignInClient = GoogleSignIn.getClient(this, gso); }
- This function user login result return
void faceBookLogin(LoginResult loginResult){ setFacebookData(loginResult); Profile profile = Profile.getCurrentProfile(); if (profile != null) { String avatar = ImageRequest.getProfilePictureUri(profile.getId(), 200, 200).toString(); } handleFacebookAccessToken(loginResult.getAccessToken()); }
- This token return firebase login fails or not an event
private void handleFacebookAccessToken(AccessToken token) { AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { FirebaseUser user = mAuth.getCurrentUser(); user.getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { @Override public void onComplete(@NonNull Task<GetTokenResult> task) { String token = task.getResult().getToken(); } }); } else { String errorCode = String.valueOf(task.getException()); Toast.makeText(FacebookLoginActivity.this, "Login failed.", Toast.LENGTH_SHORT).show(); } } }); }
- “Default_web_client_id” this keyword, not changes because creating google-services.json file time automatically this keyword in add values so this key work put at its

How to Integrate the Stripe Customer PortalLaravel

How to Integrate the Stripe Customer PortalLaravel
The Stripe Customer Portal is very useful for managing customer subscriptions like Upgrade, Downgrade, and Renew.
Customers can review their invoices directly and also check their history.
Portal billing setting
Do login into your stripe account
Navigate to the portal settings to configure the portal, and do below billing settings
Create Product
First of all, we need to create products. Follow the below process for creating products.
Click on the “Products” menu from the sidebar and click on the “Add Product” button on the top right corner of the products page and create a product.
Here is an example of how to create a product.
Create two or three products as shown below.
Select product In portal settings
If you want to allow your customer to change their subscription by an upgrade, downgrade, cancel or renew you need to set products in your portal setting.
Now navigate to customer portal settings again, in the Products section, you will find a dropdown “Find or add a product..”, click on it you will find the plan you have added, select the price of this product.
Don’t forget to save all these settings.
Then do the setup of your business information, also do branding settings in the “Appearance” section, and save it.
Once you are done with settings, you can preview the customer portal by clicking the Preview button beside the save button.
This will launch a preview of the portal so you can see how customers will use it for managing their subscriptions and billing details.
Integrate into Laravel
- Get you API keys
- Go to “Developers > API keys” here you will find your “Publishable key” and “Secret key
- Create customer using stripe dashboard or by API
- Create customer by Stripe API.
- First of all, you’ll need to set your stripe secret key. For development mode, you can use test mode keys, but for production, you need to use your live mode keys
\Stripe\Stripe::setApiKey('sk_test_YOUR_KEY');
$customer = \Stripe\Customer::create([
'name' => 'jenny rosen'
'email' => 'jenny.rosen@example.com'
]);
- Once you create a customer using stripe API, now you can create a billing session for that customer using stripe API.
- Create a billing session of the customer by API
\Stripe\Stripe::setApiKey('sk_test_YOUR_KEY');
\Stripe\BillingPortal\Session::create([
'customer' => 'cus_HnKDAQNjBniyFh',
'return_url' => 'https://example.com/subscription',
]);
You’ll get a response, like the below object:
{
"id": "pts_c5cfgf8gjfgf73m5748g6",
"object": "billing_portal.session",
"created": 453543534,
"customer": "cus_bGFsnjJDcSiJu",
"livemode": false,
"return_url": "https://example.com/subscription'",
"url":
"https://billing.stripe.com/session/{SESSION_SECRET}"
}
In the response body, there is a URL attribute:
Now redirect your customer to this URL immediately. For security purposes, this URL will expire in a few minutes.
After redirecting the customer to this URL, the portal will open and customers can manage their subscriptions and billing details in the portal. customers can return to the app by clicking the Return link on your company’s name or logo within the portal on the left side. They’ll redirect to the return_url you have provided at the time of creating the session or redirect URL set in your portal settings.
Listen to Webhooks
You must have a question, what is this Webhook!!!
It’s just an event, which will fire when a customer does any changes in his/her subscription in the portal, we can listen to this event in our app and make appropriate changes.
For example,
If a customer cancels his/her subscription in the portal, then how we will know about it!!
For it, when customers do any changes in his/her subscription
“customer.subscription.updated” event will be fired and we can listen for this event and, get to know the customer has changed subscription so we need to do appropriate changes in our app also.
Set webhook in your app
In the webhooks.php (in routes folder) file set up a route for handle webhook.
You can use the [Laravel Cashier Package (https://laravel.com/docs/8.x/billing) to handle webhooks.
To set up a webhook for your portal navigate to the “Developers > Webhooks” menu you will find the below screen, here I have added a webhook to handle subscription cancel and update events, it will fire when customers update subscription, and you will receive it.
Click on the “Add endpoint” button and the below pop up will open. In Endpoint URL set the route you have created in the webhooks.php file. Select subscription updated and deleted events.
All done.
For more details, you can use stripe customer portal integration
Send Device-to-Device Push Notification using Firebase Cloud MessagingAndroid Development

Send Device-to-Device Push Notification using Firebase Cloud MessagingAndroid Development
Firebase Cloud Messaging (FCM) is a cross-platform messaging solution that lets you deliver messages for free.
It allows you to send push notifications from the Firebase console or from the application server or some trusted server where logic runs.
Step 1:- Create a new Android Studio Project
First, create a new Android Studio project and add the dependencies. First set up Firebase in your project. You can find a good tutorial.
Add Firebase messaging dependency to your app-level.
build.Gradle
dependencies {
implementation 'com.google.firebase:firebase-messaging:19.0.1'
}
Step 2: Create a Firebase Service
The next step is to create Firebase Services:- MyFirebaseInstanceIDService
and MyFirebaseMessagingService
. first MyFirebaseInstanceIDService
service will handle the device registration process and the second MyFirebaseInstanceIDService
will handle the reception and display of notifications. The services have no visual interface and are used for operations that run in the background.
To create a service, right-click and select the Applications folder New -> Service -> Service.
Type in your service name, and click the Finish button. Repeat the same steps for the second service.
AndroidManifest.xml file and update your service declarations under the application tag. Also, add INTERNET
and CLOUD TO DEVICE MESSAGING
permissions so your app can interact with the FCM server.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.exmple.notify">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".MyFirebaseMessagingService"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
</application>
</manifest>
To handle the device registration process, MyFirebaseInstanceIDService
must increase the FireBaseInstenside service class. Under this service, override the tokenrefresh()
method so that whenever the system decides to refresh the tokens, it will be requested. This usually happens when the user installs/reinstalls the application or when the user clears the application data.
Since you are sending notifications between devices, each user must subscribe to an issue with a different user_id
. This ensures that users receive notifications sent to topics that match their user_id
. Here is the implementation of MyFirebaseInstanceIDSericiclass
.
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private final String ADMIN_CHANNEL_ID = "admin_channel";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
final Intent intent = new Intent(this, MainActivity.class);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
int notificationID = new Random().nextInt(3000);
/*
Apps targeting SDK 26 or above (Android O) must
implement notification channels and add their notifications to at least one of them. Therefore, confirm if the version is Oreo or higher, then setup notification channel
*/
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
setupChannels(notificationManager);
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.notify_icon);
Uri notificationSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIF CATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, ADMIN_CHANNEL_ID)
.setSmallIcon(R.drawable.notify_icon)
.setLargeIcon(largeIcon)
.setContentTitle(remoteMessage.getData().get("title"))
.setContentText(remoteMessage.getData().get("message"))
.setAutoCancel(true)
.setSound(notificationSoundUri)
.setContentIntent(pendingIntent);
// Set notification color to match your app color template
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notificationBuilder.setColor(getResources().getColor(R.color.colorPrimaryDark));
}
notificationManager.notify(notificationID, notificationBuilder.build());
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void setupChannels(NotificationManager notificationManager) {
CharSequence adminChannelName = "New notification";
String adminChannelDescription = "Device to device notification ";
NotificationChannel adminChannel;
adminChannel = new NotificationChannel(ADMIN_CHANNEL_ID, adminChannelName, NotificationManager.IMPORTANCE_HIGH);
adminChannel.setDescription(adminChannelDescription);
adminChannel.enableLights(true);
adminChannel.setLightColor(Color.RED);
adminChannel.enableVibration(true);
if (notificationManager != null) {
notificationManager.createNotificationChannel(adminChannel);
}
}
}
Step 4: Implement the notification sending logic
This is the most important part of the whole article. This is where you define the content of the instruction and how it will be modeled. However, before you dive into coding, follow these steps to get your server key from the Firebase console.
Navigate to the Cloud Messaging tab, and copy your Server key
Implement the Sending Logic:
An FCM server with the following request properties only needs an HTTP
post request to send a push notification:
Method Type: POST
URL: https://fcm.googleapis.com/fcm/send
Headers:
Authorization: key="Firebase server key" Content-Type: application/json
Body:
{
"to": "/topics/notification_userId",
"data": {
"title": "Notification title",
"message": "Notification message",
"key1" : "value1",
"key2" : "value2" //additional data you want to pass
}
}
With these concepts in mind, you will first create a JsonObject of Notification body within your activity class. This object budget will contain the subject of the receiver, the title of the notification, the notification message, and the other key/value pair you want to add.
public class MainActivity extends AppCompatActivity {
EditText edtTitle;
EditText edtMessage;
final private String FCM_API = "https://fcm.googleapis.com/fcm/send";
final private String serverKey = "key=" + "Your Firebase server key";
final private String contentType = "application/json";
final String TAG = "NOTIFICATION TAG";
String NOTIFICATION_TITLE;
String NOTIFICATION_MESSAGE;
String TOPIC;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtTitle = findViewById(R.id.edtTitle);
edtMessage = findViewById(R.id.edtMessage);
Button btnSend = findViewById(R.id.btnSend);
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TOPIC = "/topics/userABC"; //topic must match with what the receiver subscribed to
NOTIFICATION_TITLE = edtTitle.getText().toString();
NOTIFICATION_MESSAGE = edtMessage.getText().toString();
JSONObject notification = new JSONObject();
JSONObject notifcationBody = new JSONObject();
try {
notifcationBody.put("title", NOTIFICATION_TITLE);
notifcationBody.put("message", NOTIFICATION_MESSAGE);
notification.put("to", TOPIC);
notification.put("data", notifcationBody);
} catch (JSONException e) {
Log.e(TAG, "onCreate: " + e.getMessage() );
}
sendNotification(notification);
}
});
}
private void sendNotification(JSONObject notification) {
...
}
}
The next step is to request the network server using the library volley, then use the parameters to the root server will request notification on the target device.
public class MainActivity extends AppCompatActivity {
....
private void sendNotification(JSONObject notification) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(FCM_API, notification,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response)
{
Log.i(TAG, "onResponse: " + response.toString());
edtTitle.setText("");
edtMessage.setText("");
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "Request error", Toast.LENGTH_LONG).show();
Log.i(TAG, "onErrorResponse: Didn't work");
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("Authorization", serverKey);
params.put("Content-Type", contentType);
return params;
}
};
MySingleton.getInstance(getApplicationContext()).addToRequestQueue(jsonObjectRequest);
}
}
Finally, add a MySingleton class that will serve as a request queue for instruction requests.
public class MySingleton {
private static MySingleton instance;
private RequestQueue requestQueue;
private Context ctx;
private MySingleton(Context context) {
ctx = context;
requestQueue = getRequestQueue();
}
public static synchronized MySingleton getInstance(Context context) {
if (instance == null) {
instance = new MySingleton(context);
}
return instance;
}
public RequestQueue getRequestQueue() {
if (requestQueue == null) {
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
requestQueue = Volley.newRequestQueue(ctx.getApplicationContext());
}
return requestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
}
With it, you're done creating your app. You can start sending push notifications between devices without typing any server-side code. Always make sure that the notification will not be delivered to you if the subject of the recipient is correct. If you do everything right, you will get the same result.
Manual Testing like a ProTesting

Manual Testing like a ProTesting
- Before you begin testing any app/website, you should know the concepts of the product, what problems does the product solves and how are users going to use it.
- Here the steps to rectify the concept of product
- Identifying customer needs.
- Defining the problem and objectives.
- Drafting and analysis.
- Ask for detailed design and drawings.
- Testing.
- Final successful delivery.
- ‘’First how we know to understand the requirements here the steps mention below’’
- There are mainly two types of requirements: 1. Functional 2. Non-functional
- What are Functional Requirements?
- Functional requirements define the basic system behavior. Essentially, they are what the system does or must not do, and can be thought of in terms of how the system responds to inputs. Functional requirements usually define if/then behaviors and include calculations, data input, and business processes.

- What are the Non-Functional Requirements?
- While functional requirements define what the system does or must not do,
- non-functional requirements specify how the system should do it. Non-functional requirements do not affect the basic functionality of the system Even if the non-functional requirements are not met.
- the system will still perform its basic purpose.
- This will help to customize or change the task from the bug
- This will give ease to know the bug
- It will give a glance at the task and the flow in which it is working
- This will help you prioritize where to look for potential bugs
- Understand the Learners: To write concrete and effective scenarios you must understand your learners and know their needs and expectations.
- Create Real Life and Relevant Situations: Make your scenarios as real as possible.
- Motivate the Learner: A well-written scenario should motivate the learner to action.
- ‘’How to write the test cases’’
- Title Must be strong
- Include a Strong Description with Assumptions & Preconditions
- Keep the Test Steps Clear and Concise
- The result must be Expected
- Also, Make is Reusable
- This will ensure, that in case something goes wrong in production, it would be any business-critical flows
- Reason to do: for uncertain changes of code, some regression will occur in code, if we didn't check & deployed in the server.to rid the problem in the product needs to check the critical flow twice.
- If you test with the developer, you may miss out on edge cases due to the developer's bias or perspective. So make sure you test the app/website once while the developer is not with you.
- It always helps to communicate any doubt that you have
- As the perspective varies and as well as a method so in case of any doubt ask the developer and correct it.
- Also communicate with the product lead in case of doubt so the better output can be generated of the task with minimal bugs and well-defined task