An automated, serverless certificate verification system built for the Google Cloud Study Jam.
View Live Demo • How it Works • Build Your Own
This project solves a major problem for community organizers: How to issue verifiable certificates without paying for expensive servers or hosting.
It allows students to:
- Verify their completion status using a unique Certificate ID.
- Preview their certificate instantly in the browser.
- Add to LinkedIn with one click (using official organization IDs).
- Download the PDF copy directly from Google Drive.
The entire system runs for free using Google's ecosystem as a backend.
This project uses a Serverless Architecture where Google Sheets acts as the database and Google Drive acts as the file storage.
graph LR
A[User] -- Enters ID --> B(Netlify Website)
B -- Fetch Request --> C{Google Apps Script API}
C -- Query --> D[(Google Sheet Database)]
D -- Return Data (Name, Date, FileID) --> C
C -- JSON Response --> B
B -- Displays Data --> A
- Frontend: HTML5, CSS3 (Glassmorphism UI), Vanilla JavaScript.
- Backend API: Google Apps Script (doGet).
- Database: Google Sheets.
- Storage: Google Drive (PDFs).
Want to use this for your own GDG or Club? Follow these steps.
- Create a new Google Sheet.
- Create columns in this exact order:
ACertificate IDBStudent NameCProfile URL (optional)DIssue DateEFile ID (This is the Google Drive ID of the PDF)
- Open your Google Sheet, go to Extensions > Apps Script.
- Paste the following code into
Code.gs:
<details> <summary>Click to view the Backend API Code</summary>
function doGet(e) {
var idToCheck = e.parameter.id;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); // Change to your tab name
var data = sheet.getDataRange().getValues();
var result = { valid: false, error: "Certificate not found" };
for (var i = 1; i < data.length; i++) {
if (data[i][0] == idToCheck) {
result = {
valid: true,
certId: data[i][0],
name: data[i][1],
profileUrl: data[i][2],
date: data[i][3],
fileId: data[i][4]
};
break;
}
}
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
}</details>
- Click Deploy > New Deployment > Web App.
- Important: Set Who has access to "Anyone".
- Copy the Web App URL.
- Clone this repository.
- Open
index.html. - Find the
API_URLvariable in the<script>section. - Replace it with your Web App URL from Phase 2.
- Upload
index.html,logo.png, andgoogle.svgto Netlify or GitHub Pages.
- Glassmorphism Design: Modern, frosted glass card UI.
- Google Branding: Uses official Google colors and fonts (Inter).
- Smart Loader: Google-colored loading spinner.
- Dark Mode Safe: Optimized logos and contrasts.
- LinkedIn Integration: Generates a pre-filled "Add to Profile" link.
- Visitor Counter: Tracks page hits using
counterapi.dev.
/
├── index.html # The main verification portal
├── logo.png # Your community logo
├── google.svg # Google G icon for buttons
└── README.md # Documentation
Contributions are welcome! If you have ideas to make this better, feel free to fork the repo and submit a pull request.
- Fork the Project
- Create your Feature Branch
- Commit your Changes
- Push to the Branch
- Open a Pull Request
Ezaz Ahmed
- GDG On Campus Lead, JIST
This project is licensed under the MIT License - see the LICENSE file for details.
Made with ❤️ by the GDG On Campus Organizer JIST
